CoffeeScript: řádně oslazený JavaScript

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.
Seriál: CoffeeScript (2 díly)
- CoffeeScript: řádně oslazený JavaScript 2. 12. 2010
- CoffeeScript: druhá dávka steroidů pro vaše skripty 8. 12. 2010
Nálepky:
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
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).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.
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 bloku.
Ř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
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.
proč je to peklo a nesmysl?
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).
Č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?)
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).
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.
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.
> 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
a
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ě.
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čí.
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
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>
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.
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.
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áčů. ;)
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
Přesně!
Ať mě klidně nutí odsazovat
ale ať to proboha nefunguje zároveň
jako svorky(blok příkazů).
Č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…
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). .)
Ideálně aby se pletl kód s komentářema. Mohlo by být zábavné kompilovat a spouštět commenty :-)
Pisu javascript celkem rad a naucil jsem se zit s jeho nedostatky.
Ale tohle je javascript na steroidech. Cekaji nas svetle zitrky!
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 :)
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.
Tak se podíváme:
railsjedi: CoffeeScript is to Javascript what SASS is to CSS. Both are tools I can no longer live without
evmcl: The more javascript I write, the more appealing CoffeeScript looks…
liio: Finally! My site is equipped with all possible buzzwords, #html5 tags, #raphaeljs for #svg animations, #coffeescript b/c plain #js is dull…
picardo: learning coffeescript. this is the way javascript should be!
liammclennan: I did a small project with CoffeeScript. Much more fun that JS would have been.
fbjork: I believe it’s time to switch to @CoffeeScript, such a pleasure to work with. Much like the switch to HAML & Sass in all my projects.
JakCharlton: I like the look of CoffeeScript – just can’t figure out if Javascript really needs an abstraction …
robotpony: CoffeeScript shaves the bullshit off of JavaScript. A neat little language, clean, and fun to use.
micho: Ah, the joy of @CoffeeScript! Migrating our code, and considering node.js for a rather big feature in the future
spurrymoses: I’m working on the CoffeeScript syntax highlighting scheme for EditPadPro – a lot changed since my last submission
(výběr z „1 day ago“)
Podle těch reakcí bych si skoro tipnul, že jej používají právě ti, co JS umí. Co myslíte?
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.
Žádný takový důvod není; navíc to odporuje pravidlu „co funguje, do toho se nehrabe“. Neber článek o CfS jako dogma: Tak, a teď se musí všechno dělat jinak, všechno staré zahodit! Nikdo nic takového netvrdí. Je to jen další možnost, která nevylučuje ty předchozí, ale doplňuje je.
Existuje prekladac pythonu do JS, jestli si dobre vzpominam tak je soucasti pyjamas (dlouho jsem na tam nekoukal).
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í…
– 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)
To se jako fakt používá? Vždyť to je nesmyslný překlad.
Taky jsem to viděl poprvé. Osobně bych zůstal u originálu „first class function“.
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“.
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));
Filozofie JavaScriptu mi říká, že by tam měl doplnit „else undefined“.
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).
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ýrazif
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 :-) ).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…
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.
Františku, mohl bys trochu rozvést o jakých vlastnostech programovacích jazyků mluvíš?
Prečítaj si to v mojom príspevku.
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á.
Mistre, troufam si rict, ze jste trosku mimo. Na slovensku asi oznacujete slovem Javascript jiny jazyk…
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é)…
Děkuji za tento komentář, v příštím pokračování ho ocituju. Bude se tam velmi hodit!
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.
Na první pohled to vypadá docela dobře. Škoda, že tam zatím nejde definovat vlastní operátory.
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
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.
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“.)
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á.
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í ;)
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
Příklady: Počkej dalšího půl roku. Editor: libovolný textový. Highlighter: vyber si. Debugger: Firebug. Přátelé na IM jsou na twitteru a na fórech. Syntax pro rychlejší a přehlednější psaní není to podstatné, co CfS má, ale (logicky) začínáme od ní. A zrovna u JS jde srozumitelnost čehokoli trošku složitějšího velice rapidně dolů.
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.
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.
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.
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.