Přejít k navigační liště

Zdroják » JavaScript » CoffeeScript: řádně oslazený JavaScript

CoffeeScript: řádně oslazený JavaScript

Články JavaScript, Různé

Milovníci Pythonu, Ruby či Lispu by měli zpozornět: CoffeeScript jim bude když ne sympatický, tak minimálně povědomý. Pojďme se podívat, čím si tento jazyk získal pozornost, proč patří na GitHubu mezi „most interesting“ a proč se líbí lidem z 37signals – čeká nás stručné seznámení s CoffeeScriptem.

Předmluva – proč se o CoffeeScript zajímat?

Když jsem se sám učil JavaScript, připadal mi nejprve jako špatně udělaná nápodoba C: syntaxe je člověku povědomá, ale spousta věcí mu připadá nedotažených či nesmyslných. Touto fází si projde snad každý, kdo zná C-like jazyky a setká se s JavaScriptem. Ostatně i v komentářích na Zdrojáku se lze často setkat s lidmi, kteří na JavaScript velmi urputně nadávají. Připadá jim, že JavaScript je neschopný spatlaný jazyk, co vyzývá svou „nepořádností“ k bastlení kódu a podporuje programátorská neřádstva. Pokud nedáte JavaScriptu druhou šanci, dost možná na této úrovni poznání zůstanete a každé setkání s ním bude pro vás utrpením (že musíte používat takovou hrůzu, zlatá Java, zlaté C++, …)

Při druhém přiblížení, po zkušenosti s jQuery a Prototype, jsem se naučil simulovat třídy funkcemi. JavaScript mi v tu chvíli připadal jako celkem přijatelný jazyk, i když poměrně výstřední (čti: z nějakého důvodu nedodržující mainstreamové zvyklosti). A pak jsem si jednoho dne uvědomil, že se na JavaScript pořád dívám ze špatného směru – jako na OO skriptovací nástroj, jako na bratrance skriptů v BASHi, v perlu, v PHP… Stačilo se podívat z jiného směru, třeba od Lispu (co jsem od konce 80. let nepoužil). A pak jsem to uviděl a vše do sebe začalo zapadat…

Jsem přesvědčen o tom, že pokud budete na JavaScript hledět jen jako na objektově orientovaný skriptovací jazyk, bude vám stále připadat nedomyšlený a nesmyslný. A stejně tak věřím, že CoffeeScript může vnímavému člověku právě ve změně pohledu pomoci. I proto vznikl tento miniseriál, který si klade za cíl představit zajímavý nástroj, postavený nad JavaScriptem, a ukázat tak možnosti samotného JS, které zůstávají při běžném pohledu skryté.

Úvod

Na co návrháři JavaScriptu mysleli? Jako vážně – když už navrhujete jazyk, který má funkce prvního řádu, proč je v něm, proboha, potřeba psát klíčové slovo function? Lisp je zaflákaný slovem lambda, ale to je proto, že to je zkrátka starý jazyk a nic lepšího je tehdy nenapadlo. Asi i proto mají ty makra, která mají – cokoli, jen aby nemuseli psát stále dokola lambda. píše v nadsázce Piers Cawley. Jeho slova jako by vyslyšel Jeremy Ashkenas a téměř na den přesně před rokem (13. prosince 2009) publikoval na GitHubu první verzi svého jazyka s komentářem „Initial commit of the mystery language.“ Ze záhadného jazyka se během roku vývoje stal CoffeeScript (zkraťme si jej na CfS), dospěl do verze 0.9.5 a na Vánoce je oznámena první „ostrá“ verze (1.0).

CoffeeScript je, prakticky vzato, nadstavba nad JavaScriptem, která uživatelům JS přináší spoustu „syntaktického cukru“, inspirovaného Pythonem a Ruby. Nabízí čistší funkcionální zápis a zajišťuje, že výsledný kód používá správné konstrukce. Zápis může připadat někomu překomplikovaný, jinému naopak krásně čistý… Do které skupiny patříte, si zjistíte jednoduchým testem:

dvojmoc = (x) -> x * x
soucet = (xs) ->
  r = 0
  (r = r + x) for x in xs
  r

Pokud vám kód připadá jasný, logický a pochopitelný, je CoffeeScript přesně pro vás!

Použití CoffeeScriptu

Překladač CoffeeScriptu je běžný JavaScriptový program. (Ve skutečnosti je od verze 0.5 napsán sám v CoffeeScriptu a „přeložen sám sebou“ do JS.) Můžete jej použít dvěma způsoby – buď jej můžete spustit v prostředí Node jako běžnou aplikaci pro příkazový řádek (instalace pomocí npm install coffee-script), nebo jej můžete spouštět přímo v prohlížeči. V prohlížeči jej můžete spustit jednak jako klasický překladač, který vezme zdrojový text a vrátí výsledek (funkce CoffeeScript.compile()), jednak jej můžete použít v běžném tagu script s typem nastaveným na text/coffeescript. (V tomto případě je ale důležité si uvědomit, že skripty budou provedeny v jiném kontextu než kdyby byly přímo zapsány v tagu script; nejen kvůli tomu se takové použití nedoporučuje – i když je možné.)

Překladač CfS můžete otestovat na stránkách CoffeeScriptu (pod odkazem TRY COFFEESCRIPT). V překladači vidíte i použití pomocí text/coffeescript, i spolupráci s jinými knihovnami.

Základy CoffeeScriptu

Ne, nebudeme zabíhat do úplných základů programování, předpokládáme, že čtenáři programovat umí, jen je zajímá, co nového a jiného na ně CfS má. Výklad vychází z Language Reference, kde si můžete příklady rovnou i vyzkoušet.

Zápis bloků a funkcí

CoffeeScript se inspiroval u Pythonu a používá stejný způsob zápisu bloků pomocí odsazení. Úvodní mezery na řádku jsou tedy důležité, označují zanoření bloku. CfS nemá složené závorky k označování bloků, místo nich použijte odsazení. Stejně tak nemusíte psát středníky za příkazem, výrazem či funkcí; středník použijete pouze v případě, že chcete na jednom řádku uvést např. víc volání funkcí.

U volání funkce s parametry není nutné použít závorky – parametry prostě následují za jménem funkce: print "Ahoj" a pokračují až do konce řádku nebo bloku. Volání funkce bez parametrů je potřeba zapsat se závorkami.

Funkce

Funkce jsou definovány jednoduše, viz příklad výše: zadáte seznam parametrů, šipku a tělo funkce.

dvojmoc = (x) -> x * x
trojmoc = (x) -> x * dvojmoc x
# jiná možnost:
trojmoc = (x) -> dvojmoc(x) * x
# zkuste si, co by se stalo, kdybyste vynechali závorky u dvojmoc(x)...

Parametrům funkce můžete nastavit i výchozí hodnotu – zápis je očekávatelný:

nalij = (co, kam = "do sklenice") ->
  "Nalil jsi #{co} #{kam}"
nalij "pivo"

Oblast platnosti proměnných

Proměnné jsou v CfS vždy definované v tom bloku, kde jsou použité. Pokud existuje už proměnná stejného jména v nadřízeném bloku, je použita ta. Příklad:

vnejsi = 1
funkce = ->
  vnitrni = 2
  vnejsi = 3
vnitrni = funkce()

Po překladu získáme tento kód:

var funkce, vnejsi, vnitrni;
vnejsi = 1;
funkce = function() {
  var vnitrni;
  vnitrni = 2;
  return vnejsi = 3;
};
vnitrni = funkce();

Vidíme, že ve funkci není proměnná vnejsi deklarována jako lokální, ale je místo toho použita globální. Proto buďte opatrní při psaní vnořených funkcí, abyste nepoužili jméno proměnné z nadřazeného blo­ku.

Řetězce

Řetězce se v CfS zapisují jako v jiných jazycích, tj. do uvozovek či apostrofů. Podobně jako v PHP zde platí, že řetězec zapsaný v apostrofech je konstantní, v řetězci zapsaném v uvozovkách proběhne nahrazení proměnných a výpočet výrazů, pokud jsou zapsané jako  #{...}.

"Třikrát pět je #{3 * 5}"

Řetězce mohou být zapsány přes více řádků, pokud jsou správně odsazeny:

lipsum = "Lorem ipsum dolor sit amet, consectetur adipisicing elit,
  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
  ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
  voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
  occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
  anim id est laborum."

Pokud chcete zapsat řetězec včetně odsazení, apostrofů i uvozovek, můžete použít syntaxi heredoc:

html = '''
  <strong>
  CoffeeScript!
  </strong>
  '''

Pokud místo apostrofů použijete uvozovky, bude fungovat doplňování výrazů, viz výše.

Podobným zápisem můžete vložit do textu i víceřádkový komentář – ten zůstane i ve výsledném kódu. Je tedy ideální např. pro vložení licenčních informací na začátek kódu:

###
CoffeeScript Compiler v0.9.5
Released under the MIT License
###

Vše je výraz

Možná jste si všimli, že v předchozích příkladech v definicích funkcí nebyl použit příkaz return. Funkce zkrátka vrátí hodnotu posledního vyhodnoceného výrazu. Přitom výrazem může být téměř cokoli – výraz v běžném slova smyslu, přiřazení nebo příkaz.

Pokud použijeme přiřazení coby výraz, postará se překladač CfS o to, aby proměnné byly správně deklarovány, i když jsou použity prvně:

sest = (jedna = 1) + (dva = 2) + (tri = 3)

Výsledný JavaScript vypadá takto:

var dva, jedna, sest, tri;
sest = (jedna = 1) + (dva = 2) + (tri = 3);

Blok příkazů je taky výraz, hodnotou je hodnota posledního výrazu v něm.

CoffeeScript je principem „vše je výraz“ prolezlý skrznaskrz, takže i věci, které by v běžném Javascriptu byly příkazy, dokáže zpracovat jako výraz – zabalením do closure. (S výjimkami tam, kde to nemá smysl, např. break či continue.) S příklady se ještě setkáme. Na jednu stranu lze tak dělat poměrně kuriózní konstrukce, jako např. použít blok try-catch coby výraz, ale lze to využít i šikovně – například použít foreach na místě pole:

globals = (name for name of window)[0...10]

Objekty a pole

Zápis objektových literálů či polí je podobný JSON – tedy objekty se zapisují do složených závorek, pole do hranatých.

pole = [1, 1, 2, 3, 5, 8]
bod = {x: 10, y: 20}

Pole může být (s odsazením) i přes více řádků, objekt zase může být zapsán v notifikaci podobné YAMLu:

ctverec = [
  1, 1, 1
  1, 0, 1
  1, 1, 1
]
znalosti =
  php:
    uroven: "pokrocily"
    praxe: 8
  html:
    uroven: "zacatecnik"
    praxe: 3

Příjemná vlastnost CfS je, že nemusíte dávat pozor na klíčová slova. V  JavaScriptu nelze zapsat vlastnost objektu, pokud se jmenuje stejně jako klíčové slovo (třeba „class“), přímo, musí být v uvozovkách. jQuery konstrukci

$('#element').attr({"class":"hidden"});

zapíšeme v CoffeeScriptu jako

$('#element').attr class: 'hidden'

Všimněte si, že lze bez problémů používat i funkce z existujících knihoven, spolupráce s jQuery a podobnými je v CfS naprosto přirozená a bezproblémová.

Jazykové konstrukce

Jazykové konstrukce CoffeeScriptu nepřinášejí žádné zásadní novinky oproti JavaScriptu – jen spoustu syntaktického cukru inspirovaného jinými jazyky (Ruby, Python), díky němuž se kód blíží běžné angličtině.

Podmínky

Příkaz if lze zapisovat bez závorek okolo podmínky a bez složených závorek okolo bloku (víceřádkové bloky se opět vyznačují pomocí odsazení). Lze jej zapsat i v postfixové notaci, tedy až za příkaz. Lze jej použít (viz předchozí pasáž „Vše je výraz“) i jako výraz, který je přeložen pomocí ternárního operátoru  ?:.

vezmi kulich if zima
#alternativa s unless - význam jako if not...
vezmi kulich unless teplo
if prsi
  destnik = 1
  plastenka = 1
else
  slunecniBryle = true
auto = if penize then "Mercedes" else "Žádné"

Slovo „then“ umožňuje oddělit podmínku od hodnoty v případě, že chceme vše zapsat na jeden řádek.

CoffeeScript umožňuje použití zřetězených podmínek, tedy například:

optimum = 18 < teplota < 23

Podmíněné přiřazení a existenční operátor

Hodí se všude tam, kde chceme proměnné přiřadit hodnotu, pokud ještě žádnou nemá (nebo má nulovou):

options or= defaults

Výsledkem bude výraz options || (options = defaults); Obdobně lze použít i operátor  and=.

Předchozí přiřazení proběhne i v případě, že proměnná options obsahuje nulu (false, null). Pokud chceme otestovat, že proměnné nebyla přiřazena žádná hodnota, musíme použít existenční operátor proměnná?. Můžeme tedy napsat

settings = auto if settings? and not auto?

a výsledkem bude JavaScriptový zápis:

var settings;
if ((typeof settings != "undefined" && settings !== null) && !(typeof auto != "undefined" && auto !== null)) {
  settings = auto;
}

Podobně můžeme existenční operátor použít s přiřazením:

odpoved ?= 42

Překlad do JavaScriptu odpovídá známé konstrukci:

typeof odpoved != "undefined" && odpoved !== null ? odpoved : odpoved = 42;

Podobně se lze vyhnout i chybě při přístupu k nedefinovaným vlastnostem objektu, a to operátorem ?.  – příklad:

pozice = window?.geolocation?.position

a výsledek:

var pozice, _ref;
pozice = typeof window != "undefined" && window !== null ? (_ref = window.geolocation) != null ? _ref.position : void 0 : void 0;

Aliasy

CoffeeScript se snaží vyjít programátorům vstříc a udělat ze čtení kódu příjemný zážitek. Nabízí proto další syntaktický cukr v podobě nejrůznějších aliasů.

Už jsme viděli, že operátor && lze nahradit slovem and a operátor || slovem or. Podobně lze negaci (!) zapsat jako not. Operátor porovnání (==) můžeme nahradit slovem is, operátor nonekvivalence slovem isnt. (CoffeeScript překládá == a is jako „===“, != a isnt jako „!==“.)

U logických hodnot platí, že true můžeme zapsat i jako on, popřípadě jako yes. False pak analogicky jako off, nebo  no.

Pro přístup k vlastnostem this můžeme použít zápis pomocí @ – tedy this.value můžeme zapsat jako @value. Více si o objektech povíme v následujícím dí­lu.

Ukázka použití aliasů:

show button if checkbox is on
if rychlost < limit then pridej()

Operátor is lze použít i v konstrukci, v níž zjišťujeme, zda je prvek obsažen v poli hodnot:

colorOK = true if color in ['red', 'green', 'blue']

Smyčky

CoffeeScript nabízí několik typů smyček. Tou základní je while  – od své jmenovkyně v JavaScriptu se liší tím, že je výrazem, jehož hodnotou je pole, které obsahuje výsledky (= poslední vyhodnocený výraz v těle smyčky) pro každý průchod. Tedy například:

pocet = 5
odpocitavani = while pocet--
  "Zbyvajicich dni: #{pocet}..."

Opět máme k dispozici aliasy: until je ekvivalent pro while not, loop pro while(true) (nezapomeňte včas ze smyčky vyskočit). Opět je možná postfixová notace jako u if:

read file until EOF

Výsledek je, jak už víme, pole posledních hodnot pro jednotlivé průchody, takže například emulace funkce file() z PHP, která čte jednotlivé řádky souboru a vrací je coby položky pole, by mohla vypadat teoreticky takto:

radky = (read file until EOF)

For…?

Možná se ptáte, kde je smyčka for či foreach… CfS se tu inspiroval u Pythonu a podobné situace řeší pomocí procházení pole, objektu či rozsahu. Syntax je jednotná: for proměnná in objekt (pole, rozsah)

alert hlaska for hlaska in seznam
r = r + i for i in [0..9]

Smyčka for je opět výraz – pole výsledků jednotlivých iterací:

odpocitavani = ("Zbyvajicich dni: #{pocet}..." for pocet in [5..1])

Bez závorek bude výsledek jiný – podívejte se, v čem a proč (a zjistíte, že je to logické).

Pomocí operátoru in procházíme hodnoty pole či rozsahu. Chceme-li projít vlastnosti objektu, použijeme operátor  of:

lidi = petr: 31, pavel: 29, tomas: 22
alert (jmeno for jmeno of lidi)
alert (jmeno + ":" + rok for jmeno, rok of lidi)

Pokud se podíváte na výsledný kód, vidíte, že CoffeeScript ošetřuje přístup pomocí hasOwnProperty.

var jmeno, lidi, rok, _results, _results2;
var __hasProp = Object.prototype.hasOwnProperty;
lidi = {
  petr: 31,
  pavel: 29,
  tomas: 22
};
alert((function() {
  _results = [];
  for (jmeno in lidi) {
    if (!__hasProp.call(lidi, jmeno)) continue;
    _results.push(jmeno);
  }
  return _results;
}()));
alert((function() {
  _results2 = [];
  for (jmeno in lidi) {
    if (!__hasProp.call(lidi, jmeno)) continue;
    rok = lidi[jmeno];
    _results2.push(jmeno + ":" + rok);
  }
  return _results2;
}()));

Pokud z jakéhokoli důvodu chcete použít opravdu „syrovou“ verzi JavaScriptového for (key in ...), zapište ji jako  for all key, value of ...

Pokračování příště…

V příštím dílu se podíváme na zoubek objektům, třídám, dědičnosti a dalším věcem s tímto tématem spojeným. Ve třetím, posledním, se pak podíváme na některé zajímavosti, spojené s funkcemi vyšších řádů (higher order functions), a na to, jak nám s jejich použitím CoffeeScript pomáhá (ano, ony jsou i v JavaScriptu, ale jsou utopené v Lisp Revenge, tedy v nekonečném počtu závorek). Ukážeme si i některé příklady funkcionálních optimalizací, a pokud do té doby vyjde verze 1.0, tak se samosebou podíváme i na ni.

Pokud máte po dnešním představení CoffeeScriptu dojem, že jde jen o další módní vlnu a zoufalou snahu udělat z JavaScriptu použitelný jazyk, ale nenabízí nic víc než syntaktický cukr, splácaný z několika dalších jazyků, počkejte si na další díly. Budeme sladit JavaScript ještě víc a uvidíte pár věcí, co v C++ ani v Javě nenaprogramujete s takovou elegancí jako v CfS.

Upozornění: Mějte na paměti, že větší volnost znamená i větší zodpovědnost!

Dodatek – CoffeeScript v praxi

A používá to vůbec někdo? Dobrá otázka. Několik příkladů by se našlo: V CoffeeScriptu byl napsán web BusyConf. Používá jej Ars Technica pro svou čtečku pro iPad. Použili ho 37signals pro aplikaci Chalk (zdrojový kód zde – můžete ochutnat, jak taková aplikace vypadá, a srovnat to s odpovídajícím JavaScriptem). Plus desítky malých aplikací, webů a ukázek, u nichž se autoři zmínili, že je v CfS napsali.

Správná otázka není, zda to někdo používá, ale co nám to přinese. A tady už je odpověď zajímavější: CoffeeScript nabízí oproti JavaScriptu několik velmi pěkných výhod – píšete čistší a menší kód (až o třetinu míň textu) bez závorkového pekla. Máte k dispozici „syntaktický cukr“ včetně např. tříd či syntaxe heredoc. Kód je srozumitelnější, a tedy i snáze udržovatelný. Zásadním problémem je debugování – případnou chybu budete hledat kdesi v (naštěstí čitelném) JavaScriptu, a pak budete muset přijít na to, která pasáž ve zdrojovém CfS kódu odpovídá tomu místu. Je to výzva do verze 1.0.

Stay tuned.

Ilustrace: Open Clipart Library

Komentáře

Subscribe
Upozornit na
guest
58 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Michal Augustýn

Teda, čekal jsem nějaký jazyk kompilovaný do JavaScriptu, ale tohle se mi moc nelíbí (a to mám rád LISP) – syntaxe jazyka založená na odsazení mi přijde jako absolutní peklo a snaha o přiblížení programovacího jazyka běžné angličtině jako nesmysl.

Josef Richter

proč je to peklo a nesmysl?

jindroush

Protože zaměňovat grafický zápis programu s jeho funkčností je demence. To je axiom, který se nemusí dále dokazovat. Guido van Rossum doufám shnije v pekle s klávesnicí složenou jen ze samejch vlaštovek.
(Perl Advocate, Python hater).

petrblahos

Čau Jindroushi, zaflejmujeme si? :-)

Bez grafického zápisu programu máš velký kulový. Ty písmenka, kterýma zapisuješ perlovej skript jsou graficky hezky zpracovaný, mají kontury a vsadím se, že jsou antialiasovaný. Jasně, v perlu jich napíšeš málo. Ale má rozměrově menší grafické dílo menší uměleckou hodnotou než rozměrově větší grafické dílo? (Pokud’s to nepochopil, tak zdroják Tvého perlový skriptu je grafický zápis stejně jako zdroják mého pythonového programu. Píšu záměrně skriptu a programu, protože perl je opravdu tak nanejvýš na skripty.)
(Pervy Python Fancier, Perl Hater – to jsem se pěkně vybarvil co?)

xtr

Ja jsem pro poradnej flejm! :)

..nekteri dokonce Perl nazyvaji „write-only“ jazykem (z pohledu srozumitelnosti a citelnosti kodu). Kazdopadne psat v Perlu citelne da praci (pro prumerneho spisovatele programu v Perlu znamena napsat citelny kod vic prace nez ve zminovanem Pythonu, rekl bych).

Misto flejmu sedni na prdel a pridej ruku k dilu

Hadam, ze drive nebo pozdeji vznikne varianta CoffeeScriptu, ktera bude mit zavorky misto Python-style indentace. Kdyz ji nenapises ty, tak ji napise nekdo jiny.

Tak jako po python-style SASS vzniklo c-style LESS.

jindroush

Vzhled, tj. rozhození písmenek na stránce nemá nic společného s funkcí.

tj. if( python ){die;}

if(python ) {
die;
}

if(python)
{
die;
}

jsou prostě to samý. Bude příští verze kompilovat pouze ručně psané skripty kaligrafickým písmem? <g>

To měl snad naposled basic, že záleželo na tom, kde se vrazil newline. To není ani krok zpět. Stále doufám v to, že Python je aprílový žert, který se zvrhnul a jednou to Rossum přizná.

Jinak ty bláboly o nečitelnosti Perlu sou starý a nudný, už by to chtělo něco novýho.

David Grudl

> To měl snad naposled basic, že záleželo na tom, kde se vrazil newline.

To právě má JavaScript. Je zásadní rozdíl mezi

return true

a

return
true
petrblahos

Nečitelnost perlu je významější problém, než odsazování v pythonu. Jasně, že to jde napsat slušně. Jasně, že jde odsazovat blbě.

dekel

odsadzovanie v pythone JE PROBLÉM!, pretože medzi editormi neexistuje univerzálny štandard na odsadzovanie. takisto čítanie textových súborov robí problém na rôznych platformách. napr na platforme Windows je znak konca riadku: $OD$OA a na unixe: $0A na mac os $0D. preto sa v programovacích jazykoch používa „;“ vtedy je každému jasné kde riadok končí.

petrblahos

Nevšiml jsem si, že by někdo říkal, že to problém není. Jenom je menši, než se z něho dělá. A není to proto, že neexistuje univ. std. na odsazování, ale z jiných důvodů. Ale brát to jako důvod jazyk zavrhnout, vyvrhnout a kdo ví co považuju za lame důvod. Jako dlouholetý python programátor bych našel lepší důvody. Ale to stačí, protože vidím tendenci k vážným argumentům a to se ve flamewarech nedělá.

-

znak ; rozhodne nerika, kde je konec radek.
Priklad ve Scale

if (bla > 1) { println(bla + 1); println(bla – 1); }

Kde ze je tady konec radku? ; slouzi uplne k necemu jinemu

jindroush

Ještě k tomuto:

zdroják Tvého perlový skriptu je grafický zápis stejně jako zdroják mého pythonového programu. Píšu záměrně skriptu a programu, protože perl je opravdu tak nanejvýš na skripty.

Že někdo něco neumí, neznamená to, že to nejde. Torrent-like distribuční p2p síť, kterou používáme, má pár tisíc řádků v objektovým perlu. Co je na tom za ‚skript‘? <g>

Michal Wiglasz

OT: Celé IS MUNI je napsané v Perlu

Slušný spisovatel programů odsazuje tak či tak, takže tuhle hádku nechápu. A jestli někomu vadí že musí odsazovat a držet trošku kulturu kódu, tak ať si to píše klidně jako nudli na jeden řádek, ale nikdo to po něm luštit nebude.

petrblahos

To není hádka, to je flamewar, postavený na přijetí nebo odmítnutí myšlenky, že grafický způsob zápisu programu je signifikantnější než ostatní vlastnosti. Když jsem navrhl flamewar, tak jsem rozhodně doufal, že nebudou padat žádné rozumné argumenty.

jindroush

Mě nevadí odsazování. Odsazuju a buzeruju všechny, kdo nejsou ochotni dodržet štábní kulturu.

Mě vadí to smíchání štábní kultura dle pana Rossuma = výrazový prostředek jazyka. Neskutečná demence a důvod k zavrhnutí (a vyvrhnutí a vrhnutí).

V práci vždycky říkám, že jazyk bez vlaštovek (tj. { }) není jazyk, ale nějaká hračka pro pojídače koláčů. ;)

petrblahos

Tak tady se pleteš. Vlaštovka je u Pythonu jeden z významějších artefaktů. Jenom jinde než bys čekal.

http://www.youtube.com/watch?v=y2R3FvS4xr4

JaGa

Přesně!

Ať mě klidně nutí odsazovat
ale ať to proboha nefunguje zároveň
jako svorky(blok příkazů).

Michal Augustýn

Čti pozorněji – nepíšu, že to je peklo a nesmysl – píšu, že mi to tak přijde (tj. můj názor).

Ad odsazení – proč by mi měl někdo diktovat štábní kulturu mýho kódu? Jsem rád, když mě jazyk moc neomezuje a umožní mi vyjádřit se tak, jak se to líbí mně.

Ad přiblížení programovacího jazyka běžné angličtině – jaký to má smysl? Aby si mohli managoři číst zdrojáky? Aby mohli běžní uživatelé psát programy bez znalosti programování? To snad ne…

Cechjos

Ad přibližení prog. jazyka běžné angličtině – možná i programátoři jsou lidi a tak jim může připadat lepší číst a psát zdrojový kód přirozeněji („přirozeněji“ myšleno vzhledem k normálním anglickým větám). .)

Roman

Ideálně aby se pletl kód s komentářema. Mohlo by být zábavné kompilovat a spouštět commenty :-)

Antonin Hildebrand

Pisu javascript celkem rad a naucil jsem se zit s jeho nedostatky.

Ale tohle je javascript na steroidech. Cekaji nas svetle zitrky!

manakmichal

CoffeeScript vypadá skvěle. Něco podobného mohlo přijít dřív a JavaScript by nebyl taková otrava. Ale zase je pravda, že pomocí některých frameworků se také píše dobře. Určitě stojí za bližší prozkoumání.

V poslední době, koukám, se rojí čím dál víc JS knihoven. Kterou si ale vybrat :)

xBl4d3x

Upřímně nevím, co kdo vidí na CoffeeScript hezkého pro praktický vývoj, ne jen jako „proof of concept“. Otázkou je, kdo je cílová skupina – možná to může přispět člověku, který JS nikdy neviděl a vidět nechce, ale z pohledu JS vývojáře je to dle mého názoru v době existence mnoha více či méně kvalitních JS frameworků zbytečnost.

@manakmichal:

Jestli chceš využívat javascript jako OOP programovací jazyk, ne jen jako prostředek pro manipulaci s DOM, můžu z osobní zkušenosti doporučit Dojo Toolkit – podporuje OOP principy (vč. vícenásobné dědičnosti a rozšiřování základních objektů), má dobře vymyšlený systém widgetů pro UI, je zdarma i pro komerční projekty a podporují ho velké a stabilní společnosti.

xBl4d3x

Dobrá, tak jinak – ani po přečtení článku ani pár nadšených reakcích, které jsi poslal (a ne nutně znamenají, že dotyční opravdu JS umí – kdyby to tak bylo, neměli by důvod ke změně dobře fungujícího čitelného JS kódu na mnohem abstraktnější rovinu) stále nevidím důvod migrovat projekty kvalitně napsané např. v Dojo Toolkit s řádově stovkami komplexních JS souborů, každý o stovkách až tisících řádků na CoffeeScript.

Glin

Existuje prekladac pythonu do JS, jestli si dobre vzpominam tak je soucasti pyjamas (dlouho jsem na tam nekoukal).

Martin Soušek

Dejte si pozor, že jazyk programátora nedělá.

Pokud někdo fakt umí, píše v čemkoliv. A když někdo neumí, tak jiný jazyk z něj geniálního programátora neudělá!

Znám mnoho lidí, kteří těkají od jazyka k jazyka a od frameworku k frameworku a jejich snový projekt je pořád stejně daleko k dokončení…

Josef Richter

– Coffee script bude nativně podporován v Rails 3.1. Ale lze už dnes v Rails 3.0 pomocí gemu Barista https://github.com/Sutto/barista
– Na macu lze installovat i pomocí Homebrew: brew install coffee-script
– S touhle srandou se dá coffee-script používat v Express + Node.js: http://thechangelog.com/post/1582034775/zappa-razor-sharp-dsl-for-modern-web-apps
– Tohle by mohl být jeden z dalších dopňků, kterej by spolu s coffee-scriptem mohl udělat z JS ještě lepší nástroj: http://documentcloud.github.com/underscore/ (a nebije se s jQuery)

mormegil

To se jako fakt používá? Vždyť to je nesmyslný překlad.

Michal Augustýn

Taky jsem to viděl poprvé. Osobně bych zůstal u originálu „first class function“.

Karel

Z dlouhé chvíle si po nocích vytvářím vlastní programovací jazyk. Také jsem ho chtěl udělat bez „return“ ve funkcích, ale narazil jsem na celou řadu problémů. Jak třeba CoffeeScript řeší konstrukci typu: funkce a = (x) { if x < 0 then x }. Jazyk tedy vrací hodnotu posledního výrazu v bloku, ale jaká hodnota to tedy je? Pokud je x menší než 0, pak je to x. Pokud je ale x třebas 0 nebo něco většího, tak co vrátí? Prázdnou hodnotu, protože na zásobníku nic nezbylo? Nebo „false“ coby hodnotu posledního vyhodnoceného výrazu (podmínka v if)? Nebo se tam implicitně doplní větev typu „else <null>“? Stejný problém nastane se smyčkou, která se nikdy nevykoná. Máme tak funkci, která něco dělá (a může mít i vedlejší efekty), ale vlastně v ní není žádný „poslední výraz“.

Josef Richter

zkusil jsem to, vrací „undefined“. nicméně return tam sice být nemusí, ale může…

jdi na http://jashkenas.github.com/coffee-script/, nahoře na liště klikni na „try coffee script“ a vyzkoušej si sám.

třeba:

a = (x) ->
if x < 0
x
else
„nothing“
alert a(10)

se přeloží na:

var a;
a = function(x) {
if (x < 0) {
return x;
} else {
return „nothing“;
}
};
alert(a(10));

Michal Augustýn

Filozofie JavaScriptu mi říká, že by tam měl doplnit „else undefined“.

JS

Doporucuji se podivat na Common Lisp nebo Scheme, to jsou jazyky, kde je vse vyraz. Napriklad v Common Lispu vraci „if“ vysledek prislusne vetve (nebo nil pokud tam druha vetev neni).

Ladislav Thon

Pokud všechno je výraz, pak „není žádný poslední výraz“ je nesmysl :-) Prostě je třeba ty okrajové hodnoty dodefinovat.

Např.: Je-li hodnotou výrazu while seznam, jehož každým prvkem je hodnota posledního výrazu v těle smyčky, a smyčka neproběhne ani jednou, je to celkem přirozeně prázdný seznam. Výraz if asi bude vracet buďto hodnotu posledního výrazu v provedené větvi, nebo hodnotu podmínky, pokud se žádná větev neprovede (tedy false :-) ).

pepiino

alespoň mně. Už jsem si našel chvilku, abych si s ním pohrál a jsem docela nadšen. Osobně mám docela rád i čistý JavaScript, ale CoffeeScript má všechny jeho dobré vlastnosti, přidává další a jako bonus zdarma je úspornější a (dle mého) i expresivnější, (Fuj to jsem stvořil ošklivé slovo. Všem, kterým se z něj udělalo zle, se omlouvám.)

K námitkám: to že se snaží vypadat trochu jako angličtina mi nevadí. Líbí se mi SmallTalk, Scalu… .) A odsazování… no to snad neni nutné komentovat…

dekel

Javascript má rád kdekdo, pretože je príliš jednoduchý (podobne ako Ruby alebo Smalltalk) a pochopí ho aj cvičená opica, a aj ľudia, ktorým robí problém pochopenie zložitejších jazykových konštrukcií, lebo im ani nerozumejú. Javascript toho veľa nedokáže takže sa v ňom ani nedá veľa pokaziť. Možnosti JS sú na úrovni Turbo Pascalu z konca 80tych rokov. Aj Turbo Pascal alebo Basic bol medzi amatérmi obľúbený práve kôli jednoduchosti. Dnes už Basic (VB.NET) umožnuje všetko čo plnohodnotné jazyky je zložitejší, bežným programátorom laikom robí problém čítanie cudzích zdrojákov, nechú strácať čas štúdiom a preto sa vrátili k primitívnym jazykom ako PHP a JavaScript. CoffeeScript je len syntaktický cukor, pythonovské odsadzovanie medzerzami je nezmysel, pretože každý editor odsadzuje inak.

Pavel Křivánek

Františku, mohl bys trochu rozvést o jakých vlastnostech programovacích jazyků mluvíš?

Dekel

Prečítaj si to v mojom príspevku.

pepiino

Ale pane kolego, pročpak se nám tady čertíte :D Snad jste nezapomněl, že prog. jazyk je jen nástroj. Slouží nám k tomu, abychom řešili problémy a vyráběli produkty.

Pokud se cítíte lépe, když používáte nějaký záhadný a složitý nástroj, jelikož vám dává pocit výjimečnosti, přeji vám to.

Já rád použiji nástroj pro cvičené opice, pokud mi stačí k tomu, abych měl hotovo a mohl se soustředit na produkt, ne na nástroj.

Samozřejmě že CoffeeScript je v podstatě jen syntaktický cukr, ale tvrdí tady někdo snad něco jiného?

Odsazování považuju za věc osobních preferencí, posouvat tady svůj názor na obe/cnou pravdu je legrační a vůbec mě tohle téma k diskusi nezajímá.

MyOwnClone

Mistre, troufam si rict, ze jste trosku mimo. Na slovensku asi oznacujete slovem Javascript jiny jazyk…

Michal Augustýn

Taky jsem koukal a nevěřil vlastním očím :) Asi nezná JavaScript moc dobře (ostatně podceňování JavaScriptu je celkem běžné)…

hroch32

Jsem cvičená opice a nestydím se za to! Ano, nejsem ochotný se zabývat složitostmi třeba takového C++, ve kterém se nevyzná už ani jeho autor. Proč taky, když to samé dokáže slušně navržený objektový jazyk vyřešit mnohem jednodušeji a nezřídka efektivněji, o spolehlivosti nemluvě. To samé platí o VB. Tím ovšem netvrdím, že nejsou situace, kdy je jeden z nich vhodným nástrojem – jsou.

Programovací jazyk je vždy tvořen k nějakému účelu, universálně použitelný neexistuje. JavaScript byl navržen pro určitou potřebu a pro tu byl navržen poměrně dobře. Je to plnohodnotný objektový jazyk, možná jednoduchý, ale pro dané potřeby velice užitečný.

Kvalitní, dobře navržené věci se obecně nevyznačují složitostí, naopak, jejich znaky jsou jednoduchost, účelnost a krása. Krása programovacího jazyka je IMHO v jeho účelnosti, takže ten to má jednodušší než třeba kuchyňský robot ;-)

A kdyby někdo pohyboval – v JavaScriptu skoro vůbec neprogramuji, znám ho, ale není vhodným nástrojem k tomu, co dělám – tak proč jej prznit a sebe mučit.

Radek Miček

Na první pohled to vypadá docela dobře. Škoda, že tam zatím nejde definovat vlastní operátory.

juzna

Nejdriv jsem myslel, ze je to jen dalsi blbost, ktera upadne v zapomneni. Ale pak se mi to zalibilo, vyzkousel jsem a zacina se mi to libit cim dal vic. A uz si zvykam i na to odsazovani misto curly brackets; a take to neni tak hrozne, jak jsem cekal.

Diky za pekny clanek, tesim se na pokracovani

David Grudl

Nejdůležitější věta celého článku zní „Zásadním problémem je debugování – případnou chybu budete hledat kdesi v (naštěstí čitelném) JavaScriptu, a pak budete muset přijít na to, která pasáž ve zdrojovém CfS kódu odpovídá tomu místu.“ Je umístěna na konci, jako budíček po pěkném snu.

Satai

Instance obecnejsiho problemu: kazda novy jazyk a framework hned po startu narazi na nedostatecny tooling. (Aneb smutne pravidlo „v Jave to bude rychleji nez ve vasem lepsim jazyce“.)

imploder

Jo, to je dost zásadní problém. Autor CfS by se měl zamyslet jak to řešit, podpora bude asi nutná na obou stranách – překladače i debuggeru. Překladač by měl umět generovat ke kódu debug symboly a do debuggeru (Firebug, …) se pak dá dodělat jejich podpora. Zatím to ale ani jedna strana neumí, takže to asi bude až za dlouho. IMHO u překladače s verzí „1.0“ by mělo být generování debug symbolů samozřejmostí, ale u tohohle se to asi teda nechystá.

xmanas

Jo, stále to samé – trochu pokory lidičky! Bez toho se nikdy nikdo daleko nedostal. Neexistuje universální řešení, ale jejich kombinace vede k cíli a poznání ;)

Daniel Steigerwald

Pochybuji, že se CoffeeScript ujme. Vlastně nepochybuji, sem si zcela jist, neujme se, protože ekosystém.
Široká audience nikdy CoffeeScript nepřijme, protože nejsou příklady, nejsou editory, nejsou code syntax highlightery, nejsou debuggery, nejsou přátelé na IM, prostě CoffeeScript je v ekosystému RIA aplikací vetřelec. Syntax pro rychlejší a přehlednější psaní js není to podstatné, ač sem si sám dlouho myslel opak, co rozhoduje. Je smutné, když někdo investuje svůj čas do reimplementace kola, viz. http://ajaxian.com/archives/xopus-application-framework-objective-j-done-different

josefrichter

Tyhle příspěvky mě nepřestávají fascinovat.

Už dnes má coffeescript velmi hezkou dokumentaci, o které si mnohé „dospělejší“ projekty můžou nechat zdát, tři prdele příkladů, syntax highlightery, skoro 1000 watcherů na githubu, velmi solidně zaplněnej IRC kanál, bude mít nativní podporu v Rails 3.1, atd. atd.

Přesto se najde nějakej českej jouda, kterej si už teď je „zcela jist, že se to neujme“. Trošku míň zaprděnýho maloměšťáctví a otevřenější pohled na svět by to chtělo.

Daniel Steigerwald

Jistě se používat bude, ale mainstreamem se myslím přesto nestane. Ne v dohledných deseti letech, dál nevidím ;)
Soudím tak ne díky zapršťáctví, ale právě naopak, díky zkušenostem často very early adoptera.

Daniel Steigerwald

Dobře, myslím že jsem se ve své předpovědi spletl. Alespoň co se týká mne, protože Coffeescript používám, a líbí se mi ;)
Jestli se stane mainstreamem nevím, a vlastně na tom ani tak moc nezáleží, protože kompilovaný výstup je kvalitní, a čte i debuguje se bez problému.

Přezdívka

Je to pěkný, líbí se mi že ze všeho vzali to nejlepší. Bloky z pythonu, úspornou postfixovou syntaxi a volitelné závorky u funkcí z perlu. Akorát je škoda že to není standalone, a potřebuje to ten hnusnej JS backend.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.