| | {{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}}) во избежание путаницы. |
| | |
 |  | Все сравнения ({{==}}, {{!=}}) проводятся без приведения типа (по значению); однако, рекомендуется использовать эквивалентные слова-операторы ({{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) |
 |  | phantom.exit() |
| | {code} |
| | или |
| | {code:java|title=a+b (сокращённо)} |
| | sys = require 'system' |
| | |
| | [a, b] = sys.stdin.readLine().split ' ' |
| | console.log parseInt(a) + parseInt(b) |
 | | phantom.exit() |
| | {code} |