From 53eb66e5c4b0b7860a04a3a288f1d7e54cb74e1f Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Tue, 21 Dec 2010 22:24:24 -0500 Subject: [PATCH] trying to shorten the table of contents. --- documentation/index.html.erb | 155 +++---- index.html | 819 +++++++++++++++++------------------ 2 files changed, 472 insertions(+), 502 deletions(-) diff --git a/documentation/index.html.erb b/documentation/index.html.erb index 43c8f98a..12ff8627 100644 --- a/documentation/index.html.erb +++ b/documentation/index.html.erb @@ -46,32 +46,25 @@ Overview Installation and Usage Language Reference - Significant Whitespace - Functions and Invocation - Objects and Arrays + Literals: Functions, Objects and Arrays Lexical Scoping and Variable Safety If, Else, Unless, and Conditional Assignment - Aliases Splats... - While, Until, and Loop - Comprehensions (Arrays, Objects, and Ranges) + Loops and Comprehensions Array Slicing and Splicing Everything is an Expression - The Existential Operator + Operators and Aliases Classes, Inheritance, and Super Pattern Matching Function Binding Embedded JavaScript - The Switch Statement - Try/Catch/Finally + Switch and Try/Catch Chained Comparisons String Interpolation, Heredocs, and Block Comments Extended Regular Expressions Cake, and Cakefiles "text/coffeescript" Script Tags - Examples - Resources - Web Chat (IRC) + Examples and Resources Change Log @@ -339,8 +332,6 @@ coffee --bare --print --stdio "Try CoffeeScript" in the toolbar, and play with them from there.

- - Significant Whitespace CoffeeScript uses Python-style significant whitespace: You don't need to use semicolons ; to terminate expressions, ending the line will do just as well. Semicolons can still be used to fit @@ -362,7 +353,7 @@ coffee --bare --print --stdio

- + Functions Functions are defined by a list of parameters, an arrow, and the function body. The empty function looks like this: -> @@ -444,63 +435,6 @@ coffee --bare --print --stdio

<%= code_for('conditionals') %> -

- - Aliases - Because the == operator frequently causes undesirable coercion, - is intransitive, and has a different meaning than in other languages, - CoffeeScript compiles == into ===, and != into - !==. - In addition, is compiles into ===, - and isnt into !==. -

-

- You can use not as an alias for !. -

-

- For logic, and compiles to &&, and or - into ||. -

-

- Instead of a newline or semicolon, then can be used to separate - conditions from expressions, in while, - if/else, and switch/when statements. -

-

- As in YAML, on and yes - are the same as boolean true, while off and no are boolean false. -

-

- For single-line statements, unless can be used as the inverse of if. -

-

- As a shortcut for this.property, you can use @property. -

-

- You can use in to test for array presence, and of to - test for JavaScript object-key presence. -

- -

- All together now: -

- - - - - - - - - - - - - -
CoffeeScriptJavaScript
is===
isnt!==
not!
and&&
or||
true, yes, ontrue
false, no, offfalse
@, thisthis
ofin
inno JS equivalent
- - <%= code_for('aliases') %> -

Splats... @@ -512,8 +446,8 @@ coffee --bare --print --stdio <%= code_for('splats', true) %>

- - While, Until, and Loop + + Loops The only low-level loop that CoffeeScript provides is the while loop. The main difference from JavaScript is that the while loop can be used as an expression, returning an array containing the result of each iteration @@ -523,18 +457,14 @@ coffee --bare --print --stdio

For readability, the until keyword is equivalent to while not, and the loop keyword is equivalent to while true. - Other JavaScript loops, such as for loops and do-while loops - can be mimicked by variations on loop, but the hope is that you - won't need to do that with CoffeeScript, either because you're using - each (forEach) style iterators, or...

- Comprehensions (Arrays, Objects, and Ranges) - For your looping needs, CoffeeScript provides array comprehensions - similar to Python's. They replace (and compile into) for loops, with - optional guard clauses and the value of the current array index. + Comprehensions + Hopefully, the majority of your loops can be implemented with comprehensions + over arrays, objects, and ranges. Comprehensions replace (and compile into) + for loops, with optional guard clauses and the value of the current array index. Unlike for loops, array comprehensions are expressions, and can be returned and assigned. They should be able to handle most places where you otherwise would use a loop, each/forEach, map, or select/filter. @@ -627,9 +557,65 @@ coffee --bare --print --stdio and return. If you make use of them within a block of code, CoffeeScript won't try to perform the conversion.

+ +

+ + Operators and Aliases + Because the == operator frequently causes undesirable coercion, + is intransitive, and has a different meaning than in other languages, + CoffeeScript compiles == into ===, and != into + !==. + In addition, is compiles into ===, + and isnt into !==. +

+

+ You can use not as an alias for !. +

+

+ For logic, and compiles to &&, and or + into ||. +

+

+ Instead of a newline or semicolon, then can be used to separate + conditions from expressions, in while, + if/else, and switch/when statements. +

+

+ As in YAML, on and yes + are the same as boolean true, while off and no are boolean false. +

+

+ For single-line statements, unless can be used as the inverse of if. +

+

+ As a shortcut for this.property, you can use @property. +

+

+ You can use in to test for array presence, and of to + test for JavaScript object-key presence. +

+ +

+ All together now: +

+ + + + + + + + + + + + + +
CoffeeScriptJavaScript
is===
isnt!==
not!
and&&
or||
true, yes, ontrue
false, no, offfalse
@, thisthis
ofin
inno JS equivalent
+ + <%= code_for('aliases') %>

- The Existential Operator It's a little difficult to check for the existence of a variable in JavaScript. if (variable) ... comes close, but fails for zero, @@ -897,7 +883,7 @@ coffee --bare --print --stdio

- + Examples

@@ -931,7 +917,6 @@ coffee --bare --print --stdio

- Resources

diff --git a/index.html b/index.html index 1f6ecfa5..8da1a9ce 100644 --- a/index.html +++ b/index.html @@ -24,32 +24,25 @@ Overview Installation and Usage Language Reference - Significant Whitespace - Functions and Invocation - Objects and Arrays + Literals: Functions, Objects and Arrays Lexical Scoping and Variable Safety If, Else, Unless, and Conditional Assignment - Aliases Splats... - While, Until, and Loop - Comprehensions (Arrays, Objects, and Ranges) + Loops and Comprehensions Array Slicing and Splicing Everything is an Expression - The Existential Operator + Operators and Aliases Classes, Inheritance, and Super Pattern Matching Function Binding Embedded JavaScript - The Switch Statement - Try/Catch/Finally + Switch and Try/Catch Chained Comparisons String Interpolation, Heredocs, and Block Comments Extended Regular Expressions Cake, and Cakefiles "text/coffeescript" Script Tags - Examples - Resources - Web Chat (IRC) + Examples and Resources Change Log @@ -414,8 +407,6 @@ coffee --bare --print --stdio "Try CoffeeScript" in the toolbar, and play with them from there.

- - Significant Whitespace CoffeeScript uses Python-style significant whitespace: You don't need to use semicolons ; to terminate expressions, ending the line will do just as well. Semicolons can still be used to fit @@ -437,7 +428,7 @@ coffee --bare --print --stdio

- + Functions Functions are defined by a list of parameters, an arrow, and the function body. The empty function looks like this: -> @@ -662,8 +653,400 @@ options || (options =

Load

- - Aliases + + Splats... + The JavaScript arguments object is a useful way to work with + functions that accept variable numbers of arguments. CoffeeScript provides + splats ..., both for function definition as well as invocation, + making variable numbers of arguments a little bit more palatable. +

+
gold = silver = rest = "unknown"
+
+awardMedals = (first, second, others...) ->
+  gold   = first
+  silver = second
+  rest   = others
+
+contenders = [
+  "Michael Phelps"
+  "Liu Xiang"
+  "Yao Ming"
+  "Allyson Felix"
+  "Shawn Johnson"
+  "Roman Sebrle"
+  "Guo Jingjing"
+  "Tyson Gay"
+  "Asafa Powell"
+  "Usain Bolt"
+]
+
+awardMedals contenders...
+
+alert "Gold: " + gold
+alert "Silver: " + silver
+alert "The Field: " + rest
+
+
+
var awardMedals, contenders, gold, rest, silver;
+var __slice = Array.prototype.slice;
+gold = silver = rest = "unknown";
+awardMedals = function() {
+  var first, others, second;
+  first = arguments[0], second = arguments[1], others = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
+  gold = first;
+  silver = second;
+  return rest = others;
+};
+contenders = ["Michael Phelps", "Liu Xiang", "Yao Ming", "Allyson Felix", "Shawn Johnson", "Roman Sebrle", "Guo Jingjing", "Tyson Gay", "Asafa Powell", "Usain Bolt"];
+awardMedals.apply(null, contenders);
+alert("Gold: " + gold);
+alert("Silver: " + silver);
+alert("The Field: " + rest);
+
Load
run

+ +

+ + Loops + The only low-level loop that CoffeeScript provides is the while loop. The + main difference from JavaScript is that the while loop can be used + as an expression, returning an array containing the result of each iteration + through the loop. +

+
# Econ 101
+if this.studyingEconomics
+  buy()  while supply > demand
+  sell() until supply > demand
+
+# Nursery Rhyme
+num = 6
+lyrics = while num -= 1
+  num + " little monkeys, jumping on the bed.
+    One fell out and bumped his head."
+
var lyrics, num;
+if (this.studyingEconomics) {
+  while (supply > demand) {
+    buy();
+  }
+  while (!(supply > demand)) {
+    sell();
+  }
+}
+num = 6;
+lyrics = function() {
+  var _results;
+  _results = [];
+  while (num -= 1) {
+    _results.push(num + " little monkeys, jumping on the bed.    One fell out and bumped his head.");
+  }
+  return _results;
+}();
+
Load
run: lyrics.join("\n")

+

+ For readability, the until keyword is equivalent to while not, + and the loop keyword is equivalent to while true. +

+ +

+ + Comprehensions + Hopefully, the majority of your loops can be implemented with comprehensions + over arrays, objects, and ranges. Comprehensions replace (and compile into) + for loops, with optional guard clauses and the value of the current array index. + Unlike for loops, array comprehensions are expressions, and can be returned + and assigned. They should be able to handle most places where you otherwise + would use a loop, each/forEach, map, or select/filter. +

+
# Eat lunch.
+eat food for food in ['toast', 'cheese', 'wine']
+
var food, _i, _len, _ref;
+_ref = ['toast', 'cheese', 'wine'];
+for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+  food = _ref[_i];
+  eat(food);
+}
+
Load

+

+ If you know the start and end of your loop, or would like to step through + in fixed-size increments, you can use a range to specify the start and + end of your comprehension. +

+
countdown = (num for num in [10..1])
+
+
var countdown, num;
+countdown = (function() {
+  var _results;
+  _results = [];
+  for (num = 10; num >= 1; num--) {
+    _results.push(num);
+  }
+  return _results;
+}());
+
Load
run: countdown

+

+ Note how because we are assigning the value of the comprehensions to a + variable in the example above, CoffeeScript is collecting the result of + each iteration into an array. Sometimes functions end with loops that are + intended to run only for their side-effects. Be careful that you're not + accidentally returning the results of the comprehension in these cases, + by adding a meaningful return value, like true, or null, + to the bottom of your function. +

+

+ To step through a range comprehension in fixed-size chunks, + use by, for example:
+ evens = (x for x in [0..10] by 2) +

+

+ Comprehensions can also be used to iterate over the keys and values in + an object. Use of to signal comprehension over the properties of + an object instead of the values in an array. +

+
yearsOld = max: 10, ida: 9, tim: 11
+
+ages = for child, age of yearsOld
+  child + " is " + age
+
var age, ages, child, yearsOld;
+yearsOld = {
+  max: 10,
+  ida: 9,
+  tim: 11
+};
+ages = function() {
+  var _results;
+  _results = [];
+  for (child in yearsOld) {
+    age = yearsOld[child];
+    _results.push(child + " is " + age);
+  }
+  return _results;
+}();
+
Load
run: ages.join(", ")

+

+ If you would like to iterate over just the keys that are defined on the + object itself, by adding a hasOwnProperty + check to avoid properties that may be interited from the prototype, use
+ for own key, value of object +

+

+ + Array Slicing and Splicing with Ranges + Ranges can also be used to extract slices of arrays. + With two dots (3..6), the range is inclusive (3, 4, 5, 6); + with three docs (3...6), the range excludes the end (3, 4, 5). +

+
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+copy    = numbers[0...numbers.length]
+
+middle  = copy[3..6]
+
+
+
var copy, middle, numbers;
+numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+copy = numbers.slice(0, numbers.length);
+middle = copy.slice(3, 7);
+
Load
run: middle

+

+ The same syntax can be used with assignment to replace a segment of an array + with new values, splicing it. +

+
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+numbers[3..6] = [-3, -4, -5, -6]
+
+
+
var numbers;
+numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+[].splice.apply(numbers, [3, 4].concat([-3, -4, -5, -6]));
+
Load
run: numbers

+

+ Note that JavaScript strings are immutable, and can't be spliced. +

+

+ + Everything is an Expression (at least, as much as possible) + You might have noticed how even though we don't add return statements + to CoffeeScript functions, they nonetheless return their final value. + The CoffeeScript compiler tries to make sure that all statements in the + language can be used as expressions. Watch how the return gets + pushed down into each possible branch of execution, in the function + below. +

+
grade = (student) ->
+  if student.excellentWork
+    "A+"
+  else if student.okayStuff
+    if student.triedHard then "B" else "B-"
+  else
+    "C"
+
+eldest = if 24 > 21 then "Liz" else "Ike"
+
var eldest, grade;
+grade = function(student) {
+  if (student.excellentWork) {
+    return "A+";
+  } else if (student.okayStuff) {
+    if (student.triedHard) {
+      return "B";
+    } else {
+      return "B-";
+    }
+  } else {
+    return "C";
+  }
+};
+eldest = 24 > 21 ? "Liz" : "Ike";
+
Load
run: eldest

+

+ Even though functions will always return their final value, it's both possible + and encouraged to return early from a function body writing out the explicit + return (return value), when you know that you're done. +

+

+ Because variable declarations occur at the top of scope, assignment can + be used within expressions, even for variables that haven't been seen before: +

+
six = (one = 1) + (two = 2) + (three = 3)
+
+
+
var one, six, three, two;
+six = (one = 1) + (two = 2) + (three = 3);
+
Load
run: six

+

+ Things that would otherwise be statements in JavaScript, when used + as part of an expression in CoffeeScript, are converted into expressions + by wrapping them in a closure. This lets you do useful things, like assign + the result of a comprehension to a variable: +

+
# The first ten global properties.
+
+globals = (name for name of window)[0...10]
+
var globals, name;
+globals = (function() {
+  var _results;
+  _results = [];
+  for (name in window) {
+    _results.push(name);
+  }
+  return _results;
+}()).slice(0, 10);
+
Load
run: globals

+

+ As well as silly things, like passing a try/catch statement directly + into a function call: +

+
alert(
+  try
+    nonexistent / undefined
+  catch error
+    "And the error is ... " + error
+)
+
+
alert(function() {
+  try {
+    return nonexistent / void 0;
+  } catch (error) {
+    return "And the error is ... " + error;
+  }
+}());
+
Load
run

+

+ There are a handful of statements in JavaScript that can't be meaningfully + converted into expressions, namely break, continue, + and return. If you make use of them within a block of code, + CoffeeScript won't try to perform the conversion. +

+ +

+ + Operators and Aliases Because the == operator frequently causes undesirable coercion, is intransitive, and has a different meaning than in other languages, CoffeeScript compiles == into ===, and != into @@ -744,406 +1127,9 @@ print inspect "My name is winner = true; } print(inspect("My name is " + this.name)); -

Load

+
Load

- - Splats... - The JavaScript arguments object is a useful way to work with - functions that accept variable numbers of arguments. CoffeeScript provides - splats ..., both for function definition as well as invocation, - making variable numbers of arguments a little bit more palatable. -

-
gold = silver = rest = "unknown"
-
-awardMedals = (first, second, others...) ->
-  gold   = first
-  silver = second
-  rest   = others
-
-contenders = [
-  "Michael Phelps"
-  "Liu Xiang"
-  "Yao Ming"
-  "Allyson Felix"
-  "Shawn Johnson"
-  "Roman Sebrle"
-  "Guo Jingjing"
-  "Tyson Gay"
-  "Asafa Powell"
-  "Usain Bolt"
-]
-
-awardMedals contenders...
-
-alert "Gold: " + gold
-alert "Silver: " + silver
-alert "The Field: " + rest
-
-
-
var awardMedals, contenders, gold, rest, silver;
-var __slice = Array.prototype.slice;
-gold = silver = rest = "unknown";
-awardMedals = function() {
-  var first, others, second;
-  first = arguments[0], second = arguments[1], others = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
-  gold = first;
-  silver = second;
-  return rest = others;
-};
-contenders = ["Michael Phelps", "Liu Xiang", "Yao Ming", "Allyson Felix", "Shawn Johnson", "Roman Sebrle", "Guo Jingjing", "Tyson Gay", "Asafa Powell", "Usain Bolt"];
-awardMedals.apply(null, contenders);
-alert("Gold: " + gold);
-alert("Silver: " + silver);
-alert("The Field: " + rest);
-
Load
run

- -

- - While, Until, and Loop - The only low-level loop that CoffeeScript provides is the while loop. The - main difference from JavaScript is that the while loop can be used - as an expression, returning an array containing the result of each iteration - through the loop. -

-
# Econ 101
-if this.studyingEconomics
-  buy()  while supply > demand
-  sell() until supply > demand
-
-# Nursery Rhyme
-num = 6
-lyrics = while num -= 1
-  num + " little monkeys, jumping on the bed.
-    One fell out and bumped his head."
-
var lyrics, num;
-if (this.studyingEconomics) {
-  while (supply > demand) {
-    buy();
-  }
-  while (!(supply > demand)) {
-    sell();
-  }
-}
-num = 6;
-lyrics = function() {
-  var _results;
-  _results = [];
-  while (num -= 1) {
-    _results.push(num + " little monkeys, jumping on the bed.    One fell out and bumped his head.");
-  }
-  return _results;
-}();
-
Load
run: lyrics.join("\n")

-

- For readability, the until keyword is equivalent to while not, - and the loop keyword is equivalent to while true. - Other JavaScript loops, such as for loops and do-while loops - can be mimicked by variations on loop, but the hope is that you - won't need to do that with CoffeeScript, either because you're using - each (forEach) style iterators, or... -

- -

- - Comprehensions (Arrays, Objects, and Ranges) - For your looping needs, CoffeeScript provides array comprehensions - similar to Python's. They replace (and compile into) for loops, with - optional guard clauses and the value of the current array index. - Unlike for loops, array comprehensions are expressions, and can be returned - and assigned. They should be able to handle most places where you otherwise - would use a loop, each/forEach, map, or select/filter. -

-
# Eat lunch.
-eat food for food in ['toast', 'cheese', 'wine']
-
var food, _i, _len, _ref;
-_ref = ['toast', 'cheese', 'wine'];
-for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-  food = _ref[_i];
-  eat(food);
-}
-
Load

-

- If you know the start and end of your loop, or would like to step through - in fixed-size increments, you can use a range to specify the start and - end of your comprehension. -

-
countdown = (num for num in [10..1])
-
-
var countdown, num;
-countdown = (function() {
-  var _results;
-  _results = [];
-  for (num = 10; num >= 1; num--) {
-    _results.push(num);
-  }
-  return _results;
-}());
-
Load
run: countdown

-

- Note how because we are assigning the value of the comprehensions to a - variable in the example above, CoffeeScript is collecting the result of - each iteration into an array. Sometimes functions end with loops that are - intended to run only for their side-effects. Be careful that you're not - accidentally returning the results of the comprehension in these cases, - by adding a meaningful return value, like true, or null, - to the bottom of your function. -

-

- To step through a range comprehension in fixed-size chunks, - use by, for example:
- evens = (x for x in [0..10] by 2) -

-

- Comprehensions can also be used to iterate over the keys and values in - an object. Use of to signal comprehension over the properties of - an object instead of the values in an array. -

-
yearsOld = max: 10, ida: 9, tim: 11
-
-ages = for child, age of yearsOld
-  child + " is " + age
-
var age, ages, child, yearsOld;
-yearsOld = {
-  max: 10,
-  ida: 9,
-  tim: 11
-};
-ages = function() {
-  var _results;
-  _results = [];
-  for (child in yearsOld) {
-    age = yearsOld[child];
-    _results.push(child + " is " + age);
-  }
-  return _results;
-}();
-
Load
run: ages.join(", ")

-

- If you would like to iterate over just the keys that are defined on the - object itself, by adding a hasOwnProperty - check to avoid properties that may be interited from the prototype, use
- for own key, value of object -

-

- - Array Slicing and Splicing with Ranges - Ranges can also be used to extract slices of arrays. - With two dots (3..6), the range is inclusive (3, 4, 5, 6); - with three docs (3...6), the range excludes the end (3, 4, 5). -

-
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
-copy    = numbers[0...numbers.length]
-
-middle  = copy[3..6]
-
-
-
var copy, middle, numbers;
-numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
-copy = numbers.slice(0, numbers.length);
-middle = copy.slice(3, 7);
-
Load
run: middle

-

- The same syntax can be used with assignment to replace a segment of an array - with new values, splicing it. -

-
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
-numbers[3..6] = [-3, -4, -5, -6]
-
-
-
var numbers;
-numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
-[].splice.apply(numbers, [3, 4].concat([-3, -4, -5, -6]));
-
Load
run: numbers

-

- Note that JavaScript strings are immutable, and can't be spliced. -

-

- - Everything is an Expression (at least, as much as possible) - You might have noticed how even though we don't add return statements - to CoffeeScript functions, they nonetheless return their final value. - The CoffeeScript compiler tries to make sure that all statements in the - language can be used as expressions. Watch how the return gets - pushed down into each possible branch of execution, in the function - below. -

-
grade = (student) ->
-  if student.excellentWork
-    "A+"
-  else if student.okayStuff
-    if student.triedHard then "B" else "B-"
-  else
-    "C"
-
-eldest = if 24 > 21 then "Liz" else "Ike"
-
var eldest, grade;
-grade = function(student) {
-  if (student.excellentWork) {
-    return "A+";
-  } else if (student.okayStuff) {
-    if (student.triedHard) {
-      return "B";
-    } else {
-      return "B-";
-    }
-  } else {
-    return "C";
-  }
-};
-eldest = 24 > 21 ? "Liz" : "Ike";
-
Load
run: eldest

-

- Even though functions will always return their final value, it's both possible - and encouraged to return early from a function body writing out the explicit - return (return value), when you know that you're done. -

-

- Because variable declarations occur at the top of scope, assignment can - be used within expressions, even for variables that haven't been seen before: -

-
six = (one = 1) + (two = 2) + (three = 3)
-
-
-
var one, six, three, two;
-six = (one = 1) + (two = 2) + (three = 3);
-
Load
run: six

-

- Things that would otherwise be statements in JavaScript, when used - as part of an expression in CoffeeScript, are converted into expressions - by wrapping them in a closure. This lets you do useful things, like assign - the result of a comprehension to a variable: -

-
# The first ten global properties.
-
-globals = (name for name of window)[0...10]
-
var globals, name;
-globals = (function() {
-  var _results;
-  _results = [];
-  for (name in window) {
-    _results.push(name);
-  }
-  return _results;
-}()).slice(0, 10);
-
Load
run: globals

-

- As well as silly things, like passing a try/catch statement directly - into a function call: -

-
alert(
-  try
-    nonexistent / undefined
-  catch error
-    "And the error is ... " + error
-)
-
-
alert(function() {
-  try {
-    return nonexistent / void 0;
-  } catch (error) {
-    return "And the error is ... " + error;
-  }
-}());
-
Load
run

-

- There are a handful of statements in JavaScript that can't be meaningfully - converted into expressions, namely break, continue, - and return. If you make use of them within a block of code, - CoffeeScript won't try to perform the conversion. -

- -

- The Existential Operator It's a little difficult to check for the existence of a variable in JavaScript. if (variable) ... comes close, but fails for zero, @@ -1790,7 +1776,7 @@ task('build:parser + Examples @@ -1824,7 +1810,6 @@ task('build:parser Resources