Autor Zpráva
Radek9
Profil
Zdravím.
Nedávnou jsem začal psát takové malé rozšíření JavaScriptu. Momentálně podporuje lambda výrazy, zkrácený zápis "this", UMD moduly, foreach a mnoho dalších užitečných věcí. Kompletní (prozatím však stále bojovou) dokumentaci včetně zdrojových kódů a funkčního pluginu pro Notepad++ naleznete zde: github.com/RadekCZ/Expanso

Kdyby měl někdo nějaké postřehy, návrhy na vylepšení či jinou kritiku, rád si to přečtu. :-)
preca1
Profil
Zdravim,
zdá se mi to, nebo píšeš CoffeeScript?
Radek9
Profil
preca1:
To se ti asi opravdu jen zdá. S tím to má společné jen trošku ty lambdy. :-) CoffeeScript je zcela nový jazyk, který si zakládá na absenci složených závorek (a mnohdy i kulatých) a v němž je kladen veliký důraz na odsazení. Tohle je jen rozšíření JS. Jakýkoli již napsaný kód je kompatibilní s Expansem, což se o CoffeeScriptu říct nedá. (A koneckonců ani o TypeScriptu, i když to tam mají napsané. :-))

Expanso řeší hlavně problémy hodně se opakujícího a ne příliš hezkého kódu. Asi největší ulehčení jsou ty UMD moduly. Kompiler potom dokáže vygenerovat CommonJS, AMD i klasický browser modul v jednom souboru. Což, myslím, zase CoffeeScript neumí. :-)

A když už jsem v tom, zkusím popsat česky i zbytek hlavních výhod:
// Lambda výrazy
x -> x * x
(x, y) -> x * y
(x, y) -> {
  // další kód
}
jménoFunkce(x) -> { … }
(x = 1, y = 2) -> x * y; // Defaultní hodnoty parametrů
(a, b, c...) -> { … } // Zbytek parametrů (pokud jich bude více jak 2) bude v poli c

// Fat-arrow funkce - zachovávají this

var obj = {
  pozdrav: "Ahoj",
  funkce: () -> {
    return () => @pozdrav;
  }
};

var funkce = obj.funkce();

funkce(); // Ahoj

// Zkratka pro this
@názevVlastnosti
@["index"]
alert(@);
(@x, @y) -> { // Parametry automaticky jako vlastnosti objektu
  x === @x; // true
  y === @y; // true
}

// Moduly
#module (
  PrvníModul = "prvni-modul",
  DruhýModul = "druhy-modul"
)

#module GlobálníJméno (
  PrvníModul = "prvni-modul" = GlobálníJménoPrvníhoModulu,
  DruhýModul = "druhy-modul" = GlobálníJménoDruhéhoModulu
)

// Foreach cyklus
var arr = [1, 2, 3];
#foreach (i : item of arr) {
  alert(i + " : " + item);
  // 0 : 1
  // 1 : 2
  // 2 : 3
}

var obj = new NejakyObjekt(); // V prototypu je, dejme tomu, několik metod
obj.jedináVlastníPoložka = "ahoj";
#foreach (key : val in obj) {
  alert(key + " : " + val);
  // jedináVlastníPoložka : ahoj
}

// Scope aneb IIFE
var a = "světe", b = "ahoj";
#(a = b, b = a) {
  alert(a + ", " + b + "!"); // ahoj, světě
};
alert(a + ", " + b + "!"); // světe, ahoj!
preca1
Profil
Myslim, že CS si zakládá na něčem trochu jinym, než na závorkách a signifikantních bílých znacích; to sou jen prostředky. Podle mě si zakládá na tom samym, co ty - např. jednodušším používání this, kladení většího důrazu na obsah (algoritmus) než formu (syntaxi), vytvoření platnosti oboru proměnných tak, jak fungujou např. v Javě.

Stáhnul sem to (možná by bylo fajn připravit nějakej testovací balíček; než sem pochopil, co a kam přesně musim stáhnout, chvilku mi to trvalo. S gitem moc neumim, takže jestli de udělat nějaký rychlý stáhnutí, tak je to moje chyba.) a připadá mi to jako CS. Akorát se výslednej kód nekompiluje jen jednou, ale při každym načtení stránky. Implikace snad netřeba vyjmenovávat.

A taky nechápu, jak to používat :). Do souboru test-file.js sem dal
#module ThisModule (
  tohle sem nechal prázdný, protože sem předpokládal, že to má znázorňovat závislosti, který já nemam
)

var ThisModule = {
  sayHello: () -> {
    alert("Hello world!");
  }
};

#export ThisModule;
a do index.html (výňatek)
Request.file("test-file.js").then(function (code) {
    var compiler = new ExtraCompiler(code);
    var compiledCode = compiler.compile()
    debugger
  });
a po ThisModule ani vidu.
Když do souboru test-file.js dam
var obj = {
  name: "Cute object",
  getFn: () -> {
    return () => @name;
  }
};

var fn = obj.getFn();
alert(fn()); // "Cute object"
tak se nic nestane. Musim proměnnou compiledCode prohnat přes eval (je to totiž string), což docela zdržuje.
Jak na to můžu aplikovat RequireJS optimalizátor, když fyzicky žádný soubory z toho nevylezou a všechno je jen v paměti prohlížeče (co to bude dělat na mobilu?)?
Jak to použiju s 40 souborama? To budu mít 40 HTTP požadavků a při každym se bude vyhodnocovat několik regulárních výrazů?
Dík za reakci
Radek9
Profil
preca1:
Ta kompilace vůbec nebyla myšlená takhle. Tohle je vlastně jen API, které ti to zkompiluje do stringu. Reálné použití s funkčním filesystemem můžeš vidět třeba v tom pluginu pro Notepad++. Stejně tak by se dal dopsat Node.js modul a kompilovalo by se to stejně jako CS. Samozřejmě je hloupost si myslet, že by se to kompilovalo při každém spouštění stránky. :-)
Případně se v klidu objedeš bez filesystemu na straně JS, prostě si to jen vypíšeš do konzole (nebo kamkoli do stránky) a uložíš do JS souboru. :-)

Co se balíčku týče, dá se to stáhnout jako zip (v pravém panelu). Nutno tedy ještě dodat, že Legio se musí stáhnout samostatně. K CS už se asi vyjadřovat moc nebudu. Netvořím nový jazyk, jen drobně rozšířuji JS.
preca1
Profil
Radek9:
V tom případě by bylo fajn napsat do dokumentace, jak se to má používat + by bylo fajn napsat k tomu aspoň ten NodeJS modul, aby to bylo použitelný v reálu (já kupříkladu NPP nemam). Když si napsal, že to neni CS (což není pravda), tak mě vůbec nenapadlo, že by to mělo fungovat jako CS.

Jakýkoli již napsaný kód je kompatibilní s Expansem, což se o CoffeeScriptu říct nedá.“ [#3]
Mohl bys trochu rozvýst tohle? Kód CS je s JavaScriptem kompatiblní stejně jako kód Expansa. Teda vůbec.
Jako drobné rozšíření jazyka chápu třeba Prototype.js - načteš knihovnu a hned nad objektama používáš nový metody. U Expansa se musim naučit úplně novou syntaxy (stejně jako u už mnou tolikrát zmiňovaného CS).
llook
Profil
preca1:
Kód CS je s JavaScriptem kompatiblní stejně jako kód Expansa. Teda vůbec.

To asi bylo myšleno obráceně - že každý JavaScript je zároveň platné Expanso (podobně jako si na tom zakládá TypeScript, i když ten rozšiřuje JS úplně jiným směrem).
Radek9
Profil
preca1:
bylo fajn napsat k tomu aspoň ten NodeJS modul
Jo, co nevidět se ho tam pokusím přidat, neměl jsem teď moc času.

že to neni CS (což není pravda)
Pořád s tebou budu nesouhlasit. Není to CS. :-)

Kód CS je s JavaScriptem kompatiblní stejně jako kód Expansa. Teda vůbec.
Jak píše llook, myšleno to bylo obráceně. Expanso můžeš nasadit do již existujícího JS projektu. To s CoffeeScriptem moc dobře nejde.

Jako drobné rozšíření jazyka chápu třeba Prototype.js
To není rozšíření jazyka, to je prostě knihovna. :-) Třeba jako ta moje knihovna Legio, kterou používám. Mluvím o rozšíření syntaxe. Takže ano, musíš se učit novou syntaxi. Ale nemusíš přetvářet již existující JS projekty. Je možné je pouze rozšířit.
joe
Profil
Asi budeš velký nadšenec pro JavaScript a programování obecně, tak se zeptám trochu jinak - k čemu je to vlastně dobré a proč by to měl někdo používat? :-)
Radek9
Profil
joe:
Řeknu to narovinu, vůbec není nutné to použít. Pokud ti nezáleží na kráse a rychlosti psaní kódu. Mě třeba hlavně u funkcí štvalo neustále psát to slovíčko function. Štvalo mě taky psát zbytečné returny, když se ve funkci provadí stejně jen jeden jednoduchý úkon. Stejně tak se mi nelíbily složité for cykly, které se při procházení polí a objektů hrozně různily, přestože se v podstatě logicky moc neliší. A čím více jsem se ponořoval do objektového programování, tím více jsem se stával alergický na slovíčko this.
Jednoduše řečeno je to nástroj pro líné programátory, kterým sice JS sám o sobě vyhovuje, ale stejně jako mně jim připadá zbytečné psát všechno. Proto jsem se rozhodl napsat takovéhle zjednodušovátko. Rozhodně tím nechci JavaScript nahrazovat, chci ho pouze vylepšit do oku lépe přijatelnější podoby. :-)
peta
Profil
Jo, this je zlo i v php. Nechapu, proc treba nepouzili "->" pro "this->".

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: