Pro některé čtenáře byla syntax CoffeeScriptu možná až příliš radikální. Všechno to odsazování, a hlavně chybějící složené závorky, no fuj… Pokud hledáte nějaký vylepšený JavaScript, který by nebořil vaše zažité představy o tom, co musí mít programovací jazyk, zkuste Kaffeine.
Mírný pokrok v mezích zákona
Kaffeine (zdrojové kódy na GitHubu) nemění zvyklosti z JavaScriptu. Pokud napíšete čistý JS a proženete ho kompilerem Kaffeinu, nestane se s ním nic. Kaffeine pouze rozšiřuje některé možnosti, přináší nové konstrukce, a hlavně: Mezery nenesou žádný syntaktický ani sémantický význam.
Opět jde o nástroj, určený a připravený pro Node.js. Usnadňuje tedy především práci s moduly, a některým programátorům usnadní i psaní asynchronního kódu. Především pak přináší míň psaní.
Řetězce přes víc řádků
Zapsat víceřádkový řetězec v Kaffeine je snadné – příklad vše objasní:
html = " <head> <title>Stránka</title> <body> <h1>Stránka</h1> </body> <html> "
Po překladu bude výsledek
var html; html = "n <head>n <title>Stránka</title>n <body>n <h1>Stránka</h1>n </body>n <html>n "
Jak vidíte, překladač zachoval konce řádků. Pokud se chceme takovému chování vyhnout, můžeme prostě každý řádek ukončit zpětným lomítkem.
Výrazy v řetězcích
Jako v Coffeescriptu nebo Ruby: zápis #{výraz}
v řetězci zkracuje konstrukci ..." + výraz + "...
Implicitní kdeco…
Ve snaze ušetřit programátorům zbytečné psaní nabízí Kaffeine spoustu možností: vynechat středníky, závorky, klíčové slovo var. Překladač se postará o správnou deklaraci, např. v následujícím případu:
x = 0 { x = 1 y = 2 }
Překladač uzavře blok do funkce. Existující proměnné ponechá jako globální, ale ty, které se v bloku vyskytnou poprvé, nadeklaruje jako lokální:
var x; x = 0 function() { var y; x = 1 return y = 2 }
Kaffeine doplní i závorky k volání funkce (tedy pokud jsou předány parametry) a správně vnoří:
//funkce1 funkce2 parametr funkce1(funkce2(parametr)) //funkce parametr1, parametr2 funkce(parametr1, parametr2)
Stejně tak lze vynechat závorky u podmínek (while, if) či u konstrukce for:
for i in A if name == "john", return false while i>0 { cosi... }
Implicitní return
dovoluje vynechat slovo return, pokud chcete vrátit poslední vyhodnocený výraz. Implicitní function
zase dovoluje vynechat slovo function:
// x = (a) {a*2} // bude přeloženo jako: var x; x = function(a) {return a*2}
Bang! Bang!
Některým programátorům dělá problém vnímat, že některé JavaScriptové konstrukce jsou asynchronní, a že vykonávání programu nebude pokračovat dalším příkazem až PO dokončení asynchronní operace (AJAX), ale hned, že tedy pokračování svých geniálních algoritmů musí umístit do callback obsluhy, která se spustí po dokončení operace.
Kaffeine nabízí právě pro takové programátory vykřičníkovou konstrukci Bang!, která zbytek kódu za voláním asynchronní funkce uzavře do anonymní funkce a předá ji jako callback:
vysledek = $.get!('/ajax.php') if vysledek != 'OK', alert(vysledek)
Překlad:
$.get('/ajax.php', function(vysledek) { if(vysledek != 'OK') alert(vysledek) })
Názory na vhodnost podobné konstrukce se mohou lišit, pravdou zůstává, že v mnohých případech pomůže snazšímu pochopení i zápisu kódu, obzvlášť při vnořených asynchronních operacích.
@This
Obdobně jako v CoffeeScriptu je i v Kaffeine zavináč zkratkou pro this, a stejně jako v CfS si i v Kaffeine udržuje kontext.
Funkce
Kromě výše uvedených zjednodušení, jako je implicitní return a implicitní function, nabízí Kaffeine i další zjednodušení pro funkce. Jedním z nich jsou anonymní (nepojmenované) argumenty:
dvojnasobek = {# * 2} mocnina = {# * #} soucin = {# * #1}
# zastupuje parametr funkce. #1 pak druhý parametr, #2 třetí apod. Výsledný kód bude:
dvojnasobek = function() {return arguments[0] * 2} mocnina = function() {return arguments[0] * arguments[0]} soucin = function() {return arguments[0] * arguments[1]}
Pipe
Z *nixů vám bude jistě známý způsob řetězení volání pomocí znaku | (pipe). Kaffeine nabízí něco podobného:
hodnota = vstup | funkce parametr vysledek = a1, a2 | funkce 1 par1 | funkce 2 par1, par 2 | funkce 3 parametr
var hodnota, vysledek; hodnota = __.funkce.call(this, vstup, parametr) vysledek = __.funkce.call(this, a1, a2, 1(__.funkce.call(this, par1, 2(par1, par(__.funkce.call(this, 2, 3(parametr)))))))
Výchozí hodnoty parametrů
Příjemný syntaktický cukr nabízí Kaffeine v podobě defaultních hodnot parametrů funkce, jako v jiných jazycích:
//f = (a=20, b, c=10) {a+b+c} f = function(a, b, c) { a = a == null ? 20 : a, c = c == null ? 10 : c;return a+b+c}
Operátory
Kaffeine nabízí i nové operátory přiřazení: ||=
a .=
//location.href .= replace("?old", "?new") location.href = location.href.replace("?old", "?new") //name .= toUpperCase() name = name.toUpperCase() //opts ||= {} opts = opts || {}
Třetí nový operátor je operátor rozšíření: ←
options = options <- { size: "small", num: 10}
Překlad je o něco složitější, definuje funkci extends(), a výsledkem je sloučení (mixin) dvou objektů:
var options; options = __extend(options, { size: "small", num: 10}) function __extend(a,b) { var c = {}, i; a = a || {}; for(i in a) c[i] = a[i]; for(i in b) c[i] = b[i]; return c; }
Závěr
Pro použití Kaffeine platí víceméně totéž co pro CoffeeScript: Používejte to, pokud chcete a pokud vám to pomůže. Překladač je napsaný v JavaScriptu, takže bude fungovat v prohlížeči i v Node.js.
Přehled komentářů