CoffeeScript – язык скриптования Web-страниц, интерпретируемый либо транслируемый в JavaScript. Предоставляет менее C-подобный синтаксис с меньшим количеством противоречий. (Однако транслируется он "напрямую", и потому изменения затрагивают только элементы синтаксиса.) Основные примеры синтаксиса можно найти на сайте CoffeeScript
.
На DL CoffeeScript компилируется в JavaScript (с использованием компилятора версии 1.10.0
и самописного враппера
), после чего запускается под PhantomJS 1.9.8 (см. JavaScript). Внимание: на некорректном коде компилятор зависает.
Особенности
Скобки вокруг списка параметров вызываемой функции необязательны (исключение: пустой список параметров; рекомендуемое использование: только при одном параметре). Последовательные вызовы вкладываются:
Все сравнения (==, !=) проводятся без приведения типа (по значению); однако, рекомендуется использовать эквивалентные слова-операторы (is, isnt) во избежание путаницы.
Язык поддерживает деструктуризацию объектов и массивов:
f = ({a, b}) -> [a, b]
o = {
a: 5
b: 6
}
[x, y] = f o
var
f = function (o) { return [o.a, o.b] },
o = {
a: 5,
b: 6,
},
xy = f(o),
x = xy[0], y = xy[1];
Каждая (по возможности) операция является выражением:
fact = (n) ->
if n < 2
1
else
n * fact n-1
var fact = function (n) {
if (n < 2)
return 1;
else
return n * fact(n - 1);
}
В языке неоднократно используются однострочные команды и "псевдонимы" для упрощения кода.
launch() if ignition is on
volume = 10 if band isnt SpinalTap
letTheWildRumpusBegin() unless answer is no
if car.speed < limit then accelerate()
winner = yes if pick in [47, 92, 13]
print inspect "My name is #{@name}"
solipsism = true if mind? and not world?
zip = lottery.drawWinner?().address?.zipcode
if (ignition === true)
launch();
if (band !== SpinalTap)
volume = 10;
if (!(answer === false))
letTheWildRumpusBegin();
if (car.speed < limit)
accelerate();
if ((pick === 47) || (pick === 92) || (pick === 13))
winner = true;
print( inspect("My name is " + this.name) );
if ((typeof mind !== "undefined" && mind !== null) && (typeof world === "undefined" || world === null))
solipsism = true;
var zip; if (typeof lottery.drawWinner === "function") {
let address = lottery.drawWinner().address;
if (address != null)
zip = address;
}
Также язык поддерживает такую штуку, как comprehensions
(термин, не имеющий полноценного перевода на русский язык).
squares = (x**2 for x in list)
evens = (x for x in list when x % 2 is 0).length
repr = for key, value of object
"#{key}: #{value}"
var squares = [];
for (var i = 0; i < list.length; i++)
squares.push( Math.pow(list[i], 2) );
var evens = 0;
for (i = 0; i < list.length; i++)
if (list[i] % 2 === 0)
evens++;
var repr = [];
for (var key in object)
repr.push(key + ": " + object[key]);
Примеры
sys = require 'system'
readAll = (fin) ->
[a, b] = fin.readLine().split ' '
return {
a: parseInt(a)
b: parseInt(b)
}
printAll = (fout, res) -> fout.writeLine res
calc = ({a, b}) -> a + b
printAll(sys.stdout, calc readAll sys.stdin)
или
sys = require 'system'
[a, b] = sys.stdin.readLine().split ' '
console.log parseInt(a) + parseInt(b)