{{CoffeeScript}} -- язык скриптования Web-страниц, интерпретируемый либо транслируемый в [JavaScript]. Предоставляет менее C-подобный синтаксис с меньшим количеством противоречий. (Однако транслируется он "напрямую", и потому изменения затрагивают только элементы синтаксиса.) Основные примеры синтаксиса можно найти на [сайте CoffeeScript|http://coffeescript.org].

На DL CoffeeScript компилируется в JavaScript (с использованием [компилятора версии 1.10.0|http://dl.gsu.by/images/agulenko/js/scripts/coffee-script.js] и самописного [враппера|http://dl.gsu.by/images/agulenko/js/scripts/coffee.js]), после чего запускается под PhantomJS 1.9.8 (см. [JavaScript]). {color:red}Внимание{color}: на некорректном коде компилятор зависает.

h2. Особенности

Скобки вокруг списка параметров вызываемой функции необязательны (исключение: пустой список параметров; рекомендуемое использование: только при одном параметре). Последовательные вызовы вкладываются:
{code:java|title=CoffeeScript}
f a, b, c d, e
{code}
{code:java|title=JavaScript}
f(a, b, c(d, e));
{code}
Все сравнения ({{==}}, {{\!=}}) проводятся без приведения типа (по значению); однако, рекомендуется использовать эквивалентные слова-операторы ({{is}}, {{isnt}}) во избежание путаницы.

Язык поддерживает деструктуризацию объектов и массивов:
{code:java|title=CoffeeScript}
f = ({a, b}) -> [a, b]
o = {
a: 5
b: 6
}
[x, y] = f o
{code}
{code:java|title=JavaScript}
var
f = function (o) { return [o.a, o.b] },
o = {
a: 5,
b: 6,
},
xy = f(o),
x = xy[0], y = xy[1];
{code}
Каждая (по возможности) операция является выражением:
{code:java|title=CoffeeScript}
fact = (n) ->
if n < 2
1
else
n * fact n-1
{code}
{code:java|title=JavaScript}
var fact = function (n) {
if (n < 2)
return 1;
else
return n * fact(n - 1);
}
{code}
В языке неоднократно используются однострочные команды и "псевдонимы" для упрощения кода.
{code:java|title=CoffeeScript}
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
{code}
{code:java|title=JavaScript}
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; // undefined
if (typeof lottery.drawWinner === "function") {
let address = lottery.drawWinner().address;
if (address != null)
zip = address;
}
{code}
Также язык поддерживает такую штуку, как [comprehensions|https://en.wikipedia.org/wiki/List_comprehension] (термин, не имеющий _полноценного_ перевода на русский язык).
{code:java|title=CoffeeScript}
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}"
{code}
{code:java|title=JavaScript}
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]);
{code}

h2. Примеры

{code:java|title=a+b}
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)
{code}
или
{code:java|title=a+b (сокращённо)}
sys = require 'system'

[a, b] = sys.stdin.readLine().split ' '
console.log parseInt(a) + parseInt(b)
{code}