Kaffeine: další povzbuzení pro javascriptaře

Káva je, a to i v naší anketě, jednou z nejpopulárnějších povzbuzovacích metod mezi programátory (populárnější je jen „spánek“). Snad i proto se v nejrůznějších podobách objevuje v názvech knihoven a programovacích jazyků. Ani dnešní nástroj není výjimka. Je opravdu povzbuzením pro JavaScriptaře?

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í: ||=.=

//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.

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď by rád neprogramoval a radši se věnoval starým počítačům.

Komentáře: 40

Přehled komentářů

oj no nevím
blizzboz Re: no nevím
bauglir Re: no nevím
pas Re: no nevím
bauglir Re: no nevím
pas Re: no nevím
pas Re: no nevím
blizzboz Re: no nevím
blizzboz Re: no nevím
Jiří Knesl Re: no nevím
bauglir Re: no nevím
Jiří Knesl Re: no nevím
bauglir Re: no nevím
Jiří Knesl Re: no nevím
bauglir Re: no nevím
pas Re: no nevím
Jiří Knesl Re: no nevím
blizzboz Re: no nevím
Michal Augustýn Re: Kaffeine: další povzbuzení pro javascriptaře
karf Re: Kaffeine: další povzbuzení pro javascriptaře
imploder Re: Kaffeine: další povzbuzení pro javascriptaře
blizzboz Re: Kaffeine: další povzbuzení pro javascriptaře
Josef Richter Re: Kaffeine: další povzbuzení pro javascriptaře
Pingy Kaffeine
severák Síla Javascriptu
bauglir Re: Síla Javascriptu
pas Re: Síla Javascriptu
Martin Malý Re: Síla Javascriptu
pas Re: Síla Javascriptu
bauglir Re: Síla Javascriptu
blizzboz Re: Síla Javascriptu
bauglir Re: Síla Javascriptu
bauglir Re: Síla Javascriptu
bauglir Re: Síla Javascriptu
imploder Re: Síla Javascriptu
bauglir Re: Síla Javascriptu
Martin Malý Re: Síla Javascriptu
imploder Re: Síla Javascriptu
pas Re: Síla Javascriptu
bauglir Re: Síla Javascriptu
Zdroj: https://www.zdrojak.cz/?p=3388