CoffeeScript - przyszłość, wrażenia

O ile składnia i elastyczność wygląda naprawdę wyśmienicie o tyle wątpię aby CoffeeScript naprawdę się przebił(między innymi poza RoR).
Ciekaw jestem czy jest już on wystarczająco stabilny żeby naklepać dość dużo kodu/dużą aplikacje.
O ile dla małych programików wszystko działa ok, ciekawi mnie jak wygląda to wszystko dla czegoś dużego.

A jakie są wasze wrażenia wg CoffeeScriptu?
Pisaliście coś sporawego w tym?
Jaką przyszłość przewidujecie dla tego rozwiązania?

Ja ostatnio pisałem (w sumie cały czas piszę) całkiem sporą aplikację w coffeescript - z użyciem Backbone.js. Muszę przyznać że bardzo przyjemnie. Jakbym miał to wszystko klepać w Javascript to chyba bym się zapłakał.

A co do stabilności - nie bardzo rozumiem problem. “The golden rule of CoffeeScript is: “It’s just JavaScript”. The code compiles one-to-one into the equivalent JS, and there is no interpretation at runtime.” Więc tak naprawdę to Javascript. Tylko upiększony.

Chodzi o to czy występują jakieś błędy w trakcie kompilacji do JS.
Przy małych programikach to wszystko pięknie banglać, ale chciałem się dowiedzieć jak przedstawia się sprawa w czymś większym.
Można to porównać do najnowszej Javki w której wszystko ładnie działa jeśli kod jest mały, ale wysypuje się w większych projektach np w Lucene.
http://webhosting.pl/Wydajac.Java.SE.7.Oracle.nie.uniknelo.wstydliwej.wpadki.Jak.programowac.bez.petli

No ale skoro wszystko jest Ok przy czymś dużym to warto rzucić na to okiem.

Coffescript jest domyslnie w rails 3.1 wiec watpie aby wrzucili go bez wyprobowania na duzych projektach

Wypróbowali głównie w aplikacjach mobilnych 37signals z tego co wiem.

U nas już całkiem dużo kodu w coffeescripcie siedzi i większych problemów nie ma. Czasami oczywiście zdarzy się, że wyskakuje jakiś błąd przy kompilacji, ale komunikaty z reguły są na tyle jasne, że nie ma problemów.

Co do samego projektu, to chyba już na forum pisałem. Kod jest na pewno dużo krótszy i bardziej przejrzysty, ale ja zawsze lubiłem javascript, więc nie ma to dla mnie większego znaczenia czy piszę w czystym w javascripcie, czy w coffee script.

Projekt już zyskał dość dużą popularność i nie sądzę, żeby został tylko i wyłącznie pupilkiem railsowców, chociaż na pewno w railsach będzie częściej wykorzystywany niż we frameworkach, które nie mają wsparcia out of the box.

Ostatnio pokazywałem coffeescript kumplowi, specjaliście od js. I już po kilka minutach wytknął kilka głupich błędów w kompilacji. Musiał bym poszukać o co chodziło, ale na pewno nie było to coś co wykładało kod, a bardziej stwarzało lukę (niezgodność z parserem js). Tak więc polecam wrzucić kilka ciekawszych kawałków kodu na ich stronie i zobaczyć czy to co wypluje jest w 100% poprawne.

Chwalą się, że:

You can use any existing JavaScript library seamlessly (and vice-versa). The compiled output is readable and pretty-printed, passes through JavaScript Lint without warnings, will work in every JavaScript implementation, and tends to run as fast or faster than the equivalent handwritten JavaScript.

Polecam wkleić to co wypluwa coffee script w parser Lint i zobaczyć czy nie będzie warningów. U mnie były.

PS Warto zwrócić uwagę, że parser Lint do jakiego oni linkują na stronie jest dość pobłążliwy. Polecam wkleić choć by pierwszy z przykładów ze strony coffe script do JsLint (the Crockford one) http://www.jslint.com/ błędów będzie na pewno cała masa.

Ich kod wypluty z przykładu nr 1

var cubes, list, math, num, number, opposite, race, square; var __slice = Array.prototype.slice; number = 42; opposite = true; if (opposite) number = -42; square = function(x) { return x * x; }; list = [1, 2, 3, 4, 5]; math = { root: Math.sqrt, square: square, cube: function(x) { return x * square(x); } }; race = function() { var runners, winner; winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return print(winner, runners); }; if (typeof elvis !== "undefined" && elvis !== null) alert("I knew it!"); cubes = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = list.length; _i < _len; _i++) { num = list[_i]; _results.push(math.cube(num)); } return _results; })();
Odpowiedź parsera:

[code]Error:
Problem at line 2 character 5: Unexpected dangling ‘_’ in ‘__slice’.

var __slice = Array.prototype.slice;

Problem at line 5 character 15: Expected ‘{’ and instead saw ‘number’.

if (opposite) number = -42;

Problem at line 6 character 18: Expected exactly one space between ‘function’ and ‘(’.

square = function(x) {

Problem at line 7 character 3: Missing ‘use strict’ statement.

return x * x;

Problem at line 7 character 3: Expected ‘return’ at column 5, not column 3.

return x * x;

Problem at line 11 character 3: Expected ‘root’ at column 5, not column 3.

root: Math.sqrt,

Problem at line 12 character 3: Expected ‘square’ at column 5, not column 3.

square: square,

Problem at line 13 character 3: Expected ‘cube’ at column 5, not column 3.

cube: function(x) {

Problem at line 13 character 17: Expected exactly one space between ‘function’ and ‘(’.

cube: function(x) {

Problem at line 14 character 5: Missing ‘use strict’ statement.

return x * square(x);

Problem at line 14 character 5: Expected ‘return’ at column 9, not column 5.

return x * square(x);

Problem at line 15 character 3: Expected ‘}’ at column 5, not column 3.

}

Problem at line 17 character 16: Expected exactly one space between ‘function’ and ‘(’.

race = function() {

Problem at line 18 character 3: Missing ‘use strict’ statement.

var runners, winner;

Problem at line 18 character 3: Expected ‘var’ at column 5, not column 3.

var runners, winner;

Problem at line 19 character 3: Expected ‘winner’ at column 5, not column 3.

winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(argum…

Problem at line 19 character 12: Use a named parameter.

winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(argum…

Problem at line 19 character 24: Expected ‘;’ and instead saw ‘,’.

winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(argum…

Problem at line 19 character 24: Expected an identifier and instead saw ‘,’.

winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(argum…

Problem at line 19 character 24: Stopping. (61% scanned).

Unused variable: runners 17 ‘race’[/code]
Nie jestem specjalistą od JS, ani tym bardziej coffe script, ale może ktoś mądrzejszy się wypowie?

Pics or it didn’t happen.

Co do jslinta ze strony crockforda. Większość z tych błędów to indentacja, nie wiem właściwie po co tego typu rzeczy sprawdzać. Reszta to albo “use script” (czyli coś, czego coffeescript wrzucać nie powinien, jeżeli chcesz mieć strict mode, to Twój wybór i sam dorzuć), albo jakieś pierdoły typu użycie dodatkowego znaku ‘_’ w nazwie zmiennej.

Problem at line 14 character 5: Expected 'return' at column 9, not column 5.

Lol, przecież to jest zwyczajna analność o białe znaki.

Nie mam zdania o coffescript, bo jeszcze nie używałem ponad zwyczajowe zabawy, słyszałem też opinie z obu stron – ale argument typu “powinien inaczej wciąć wygenerowany kod javascriptowy” jest strzałem w stopę i przegraniem flejma.

czy zna ktoś literaturę dla początkujących dotyczącą CoffeScript? Ale tak od zera-zera - bez wcześniejszej znajomości samego javascriptu?

Rada ode mnie: nie idź tą drogą.

Coffescript, to nie less czy sass, gdzie bez znajomości zmiennych, mixinów itp. można pisać niemal jak w css z kilkoma kosmetycznymi zmianami. Szczególnie bolesne może to być przy wyłapywaniu błędów.

Do CoffeeScriptu podejdź dopiero znając sekrety JavaScript. I to takie sekrety bardziej sekretne: prototypy, dziedziczenie, kontekst wykonania funkcji itd.

Ja jestem zadowolony, i moi współpracownicy w większości również. CoffeeScript porządkuje trochę, np. mamy jedno podejśćie do dziedziczenia i code re-use a nie każdy developer pisze sobie pseudoklasy jak mu się podoba w JavaScript, poza tym wynikowy JavaScript jest raczej wolny od błędów w stylu “zapomniany przecinek”.

Bez przesady, jak ktoś zaczyna to i tak olewa takie sprawy :wink: A jak już trochę popisze, to siłą rzeczy się nauczy.

Moim zdaniem spokojnie można zacząć od coffescriptu, tylko trzeba pamiętać, że to nie jest inny język, ale translator. Tzn. jak chcesz zrobić onmouseover na jakimś elemencie jquery, to normalnie patrzysz na dokumentację eventów w javascripcie, zmienia się tylko składnia.

Czekałem na taką odpowiedź :slight_smile: Ale mimo wszystko i tak chociaż trochę popracuję na początek z czystym js-em :wink:

http://arcturo.github.com/library/coffeescript/