Skip to content

CoffeeScript

22/04/2010

Сегодня я хочу немного отвлечься от описания различных частей Node.js и посмотреть на проект, связанный с Node лишь частично. CoffeeScript — язык, компилирующийся в JavaScript, но избавленный от всевозможных «тяжёлых» конструкций. Код в нём выглядит очень похожим на Ruby — ничего лишнего, всё довольно просто и понятно. Сам автор называет его «Unfancy Javascript».

CoffeeScript изначально ориентирован на работу и с браузером, и с Node.js. Т.к. начиная с версии 0.1.90 можно назначать обработчики типам подключаемых файлов, модули на CoffeeScript можно использовать наравне с JavaScript и C-модулями. Сегодня я хочу поставить компилятор CoffeeScript и немного с ним поиграться.

Установка

Я ставил из git:

    git clone git://github.com/jashkenas/coffee-script.git
    

Ставим сам компилятор:

    cd coffee-script
    bin/cake install
    

Пробуем:

    coffee -v
    

Компилятор должен показать версию CoffeScript (у меня это 0.6.1)

Hello, World

Вот так может выглядеть Hello, World:

    sys: require "sys"
    message: "Hello World"
    sys.puts message
    

(Жаль, но WordPress не подсвечивает синтаксис CoffeeScript). Сначала мы объявляем переменную message, потом передаём её sys.puts. Как видите, скобки при вызовах функций можно опускать, var тоже добавляется по необходимости (интересно, как это потом себя проявит с локальными/глобальными переменными).

Попробуем написать более традиционный для Node.js «Hello, world» — в виде веб-сервера.

sys: require "sys"
http: require "http"
message: "Hello World"

http.createServer (req, res)->
  setTimeout (()->
    res.writeHead 200, {'Content-type':'text-plain'}
    res.end message), 200
.listen 8000
sys.puts "Server running at http://127.0.0.1:8000/"
    

Обратите внимание как объявлена анонимная функция в setTimeout. Этот код — аналог стандартного «Hello World» с nodejs.org. Сравните:

var sys = require('sys'),
   http = require('http');
http.createServer(function (req, res) {
  setTimeout(function () {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
  }, 2000);
}).listen(8000);
sys.puts('Server running at http://127.0.0.1:8000/');
    

Запускается файл CoffeeScript довольно просто:

    coffee helloworld.coffee
    

Coffee скомпилирует файл в JavaScript и сразу передаст его Node. Если Вы хотите посмотреть на получившийся JavaScript, получить его можно так:

    coffee -c helloworld.coffee
    

В той же директории будет создан файл helloworld.js.

Подключение coffee-модулей к node.js

Напишем простой подключаемый модуль, как в документации Node:

square: exports ? this

square.area:(x)-> x * x
square.perimeter: (x)-> x * 4
    

Первая строка нужна чтобы экспортировать объекты из «обёртки безопасности», используемой CoffeeScript. Модуль предоставляет две функции. Area получает x и возвращает x * x, perimeter возвращает x * 4. Сохраним как square.coffee.

Теперь пишем скрипт для Node.js:

    var coffee = require('./coffee-script/lib');

    var circle = require('./coffee/square'),
        sys = require('sys');

    sys.puts(circle.area(10));
    

Скрипт должен вывести "100".

Вот так. Не факт что впоследствии я буду использовать CoffeeScript, но проект сам по себе интересный. Возможно, если привыкнуть, какие то небольшие вещи действительно будет удобно писать в таком виде.

Реклама
3 комментария
  1. Да, я видел этот проект раньше. Сам не использовал, но идея неплохая. Единственное, что, если речь идёт о производительности по скорости и оптимальности конструкций — за автосгенерированный код ручаться сложно. С другой стороны — оптимизация в плане элегантных не громоздких конструкций синтаксиса — тоже важна, поскольку с кодом работает прежде всего человек.

    Я бы тоже повыкидывал некоторый избыточных Си-шный синтаксис из JS (разного вида скобки и т.д.), но не в виде библиотеки, а на уровне реализации. Есть смысл предложить это комитету.

    Кстати, часть этого уже реализована — например, в SpiderMonkey, начиная с версии 1.8, при описании функции, фигурные скобки блока и return — опциональны.

    • Ну тут автогенерация не такая уж «своевольная», по идее просто один синтаксис расширяется до другого. Но неожиданные грабли есть конечно.

      Облегчённый синтаксис в виде стандарта — это интересно, и возможно даже будет принято. Приняли же E4X.

      А как, кстати, обозначается тогда блок в SpiderMonkey, если скобки опциональны? Отступами?

      • Kolyaj permalink

        >> А как, кстати, обозначается тогда блок в SpiderMonkey, если скобки
        >> опциональны? Отступами?
        Как lambda-функции в Python — тело функции имеет одно выражение, результат выполнения которого и возвращается.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: