| {{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]). |
| | На 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} |