Рабочий стол > DL Руководство пользователя > ... > JavaScript > CoffeeScript > Просмотр
CoffeeScript Войти | Зарегистрироваться   Просмотр версии для печати текущей страницы.

Добавлено Гуленко Алексей, последний раз изменено Гуленко Алексей Feb 16, 2017  (просмотр изменений)
Метки: 
(нет)

CoffeeScript – язык скриптования Web-страниц, интерпретируемый либо транслируемый в JavaScript. Предоставляет менее C-подобный синтаксис с меньшим количеством противоречий. (Однако транслируется он "напрямую", и потому изменения затрагивают только элементы синтаксиса.) Основные примеры синтаксиса можно найти на сайте CoffeeScript.

На DL CoffeeScript компилируется в JavaScript (с использованием компилятора версии 1.10.0 и самописного враппера), после чего запускается под PhantomJS 1.9.8 (см. JavaScript). Внимание: на некорректном коде компилятор зависает.

Особенности

Скобки вокруг списка параметров вызываемой функции необязательны (исключение: пустой список параметров; рекомендуемое использование: только при одном параметре). Последовательные вызовы вкладываются:

CoffeeScript
f a, b, c d, e
JavaScript
f(a, b, c(d, e));

Все сравнения (==, !=) проводятся без приведения типа (по значению); однако, рекомендуется использовать эквивалентные слова-операторы (is, isnt) во избежание путаницы.

Язык поддерживает деструктуризацию объектов и массивов:

CoffeeScript
f = ({a, b}) -> [a, b]
o = {
  a: 5
  b: 6
}
[x, y] = f o
JavaScript
var
  f = function (o) { return [o.a, o.b] },
  o = {
    a: 5,
    b: 6,
  },
  xy = f(o),
  x = xy[0], y = xy[1];

Каждая (по возможности) операция является выражением:

CoffeeScript
fact = (n) ->
  if n < 2
    1
  else
    n * fact n-1
JavaScript
var fact = function (n) {
  if (n < 2)
    return 1;
  else
    return n * fact(n - 1);
}

В языке неоднократно используются однострочные команды и "псевдонимы" для упрощения кода.

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
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;
}

Также язык поддерживает такую штуку, как comprehensions (термин, не имеющий полноценного перевода на русский язык).

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}"
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]);

Примеры

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)

или

a+b (сокращённо)
sys = require 'system'

[a, b] = sys.stdin.readLine().split ' '
console.log parseInt(a) + parseInt(b)
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: http://www.atlassian.com/software/confluence Build:#2.6.1 916) - Ошибка/новая особенность - Свяжитесь с Администраторами