Просмотр источника
{{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} |