|
|
|
@ -126,34 +126,33 @@ alert reverse '.eeffoC yrT'</textarea></div>
|
|
|
|
|
<p><i>CoffeeScript on the left, compiled JavaScript output on the right.</i></p>
|
|
|
|
|
|
|
|
|
|
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> Assignment:</span>
|
|
|
|
|
number<span class="Keyword">:</span> <span class="Number">42</span>
|
|
|
|
|
opposite<span class="Keyword">:</span> <span class="BuiltInConstant">true</span>
|
|
|
|
|
number <span class="Keyword">=</span> <span class="Number">42</span>
|
|
|
|
|
opposite <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Conditions:</span>
|
|
|
|
|
number<span class="Keyword">:</span> <span class="Keyword">-</span><span class="Number">42</span> <span class="Keyword">if</span> opposite
|
|
|
|
|
number <span class="Keyword">=</span> <span class="Keyword">-</span><span class="Number">42</span> <span class="Keyword">if</span> opposite
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Functions:</span>
|
|
|
|
|
<span class="FunctionName">square</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">x</span><span class="FunctionArgument">)</span> <span class="Storage">-></span> x <span class="Keyword">*</span> x
|
|
|
|
|
square <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">x</span><span class="FunctionArgument">)</span> <span class="Storage">-></span> x <span class="Keyword">*</span> x
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Arrays:</span>
|
|
|
|
|
list<span class="Keyword">:</span> [<span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>]
|
|
|
|
|
list <span class="Keyword">=</span> [<span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>]
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Objects:</span>
|
|
|
|
|
math<span class="Keyword">:</span> {
|
|
|
|
|
math <span class="Keyword">=</span>
|
|
|
|
|
root<span class="Keyword">:</span> Math.sqrt
|
|
|
|
|
square<span class="Keyword">:</span> square
|
|
|
|
|
<span class="FunctionName">cube</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">x</span><span class="FunctionArgument">)</span> <span class="Storage">-></span> x <span class="Keyword">*</span> square x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Splats:</span>
|
|
|
|
|
<span class="FunctionName">race</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">winner, runners...</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
race <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">winner, runners...</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
print winner, runners
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Existence:</span>
|
|
|
|
|
alert <span class="String"><span class="String">"</span>I knew it!<span class="String">"</span></span> <span class="Keyword">if</span> elvis<span class="Keyword">?</span>
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Array comprehensions:</span>
|
|
|
|
|
cubes<span class="Keyword">:</span> math.cube num <span class="Keyword">for</span> num <span class="Keyword">in</span> list
|
|
|
|
|
cubes <span class="Keyword">=</span> math.cube num <span class="Keyword">for</span> num <span class="Keyword">in</span> list
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, _d, cubes, list, math, num, number, opposite, race, square;
|
|
|
|
|
<span class="Storage">var</span> __slice <span class="Keyword">=</span> <span class="LibraryClassType">Array</span>.<span class="LibraryConstant">prototype</span>.slice;
|
|
|
|
|
number <span class="Keyword">=</span> <span class="Number">42</span>;
|
|
|
|
@ -174,8 +173,7 @@ math <span class="Keyword">=</span> {
|
|
|
|
|
};
|
|
|
|
|
<span class="FunctionName">race</span> = <span class="Storage">function</span>(<span class="FunctionArgument">winner</span>) {
|
|
|
|
|
<span class="Storage">var</span> runners;
|
|
|
|
|
<span class="Storage">var</span> _a <span class="Keyword">=</span> arguments.<span class="LibraryConstant">length</span>, _b <span class="Keyword">=</span> _a <span class="Keyword">>=</span> <span class="Number">2</span>;
|
|
|
|
|
runners <span class="Keyword">=</span> __slice.<span class="LibraryFunction">call</span>(arguments, <span class="Number">1</span>, _a <span class="Keyword">-</span> <span class="Number">0</span>);
|
|
|
|
|
runners <span class="Keyword">=</span> __slice.<span class="LibraryFunction">call</span>(arguments, <span class="Number">1</span>);
|
|
|
|
|
<span class="Keyword">return</span> <span class="LibraryFunction">print</span>(winner, runners);
|
|
|
|
|
};
|
|
|
|
|
<span class="Keyword">if</span> (<span class="Keyword">typeof</span> elvis <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> elvis <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) {
|
|
|
|
@ -209,8 +207,7 @@ math = {
|
|
|
|
|
};
|
|
|
|
|
race = function(winner) {
|
|
|
|
|
var runners;
|
|
|
|
|
var _a = arguments.length, _b = _a >= 2;
|
|
|
|
|
runners = __slice.call(arguments, 1, _a - 0);
|
|
|
|
|
runners = __slice.call(arguments, 1);
|
|
|
|
|
return print(winner, runners);
|
|
|
|
|
};
|
|
|
|
|
if (typeof elvis !== "undefined" && elvis !== null) {
|
|
|
|
@ -223,8 +220,7 @@ cubes = (function() {
|
|
|
|
|
_a.push(math.cube(num));
|
|
|
|
|
}
|
|
|
|
|
return _a;
|
|
|
|
|
})();
|
|
|
|
|
;alert(cubes);'>run: cubes</button><br class='clear' /></div>
|
|
|
|
|
})();;alert(cubes);'>run: cubes</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
For a longer CoffeeScript example, check out
|
|
|
|
@ -441,8 +437,8 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
|
|
|
|
|
Functions are defined by a list of parameters, an arrow, and the
|
|
|
|
|
function body. The empty function looks like this: <tt>-></tt>
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="FunctionName">square</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">x</span><span class="FunctionArgument">)</span> <span class="Storage">-></span> x <span class="Keyword">*</span> x
|
|
|
|
|
<span class="FunctionName">cube</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">x</span><span class="FunctionArgument">)</span> <span class="Storage">-></span> square(x) <span class="Keyword">*</span> x
|
|
|
|
|
<div class='code'><pre class="idle">square <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">x</span><span class="FunctionArgument">)</span> <span class="Storage">-></span> x <span class="Keyword">*</span> x
|
|
|
|
|
cube <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">x</span><span class="FunctionArgument">)</span> <span class="Storage">-></span> square(x) <span class="Keyword">*</span> x
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> cube, square;
|
|
|
|
|
<span class="FunctionName">square</span> = <span class="Storage">function</span>(<span class="FunctionArgument">x</span>) {
|
|
|
|
|
<span class="Keyword">return</span> x <span class="Keyword">*</span> x;
|
|
|
|
@ -456,8 +452,7 @@ square = function(x) {
|
|
|
|
|
};
|
|
|
|
|
cube = function(x) {
|
|
|
|
|
return square(x) * x;
|
|
|
|
|
};
|
|
|
|
|
;alert(cube(5));'>run: cube(5)</button><br class='clear' /></div>
|
|
|
|
|
};;alert(cube(5));'>run: cube(5)</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
If you'd like to assign a function literal to a variable, but not have
|
|
|
|
|
it be named, just wrap the function definition in parentheses:
|
|
|
|
@ -472,15 +467,14 @@ cube = function(x) {
|
|
|
|
|
mathy things. While colons are preferred, the two may be used interchangeably,
|
|
|
|
|
even within object literals.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">greeting<span class="Keyword">:</span> <span class="String"><span class="String">"</span>Hello CoffeeScript<span class="String">"</span></span>
|
|
|
|
|
difficulty<span class="Keyword">:</span> <span class="Number">0.5</span>
|
|
|
|
|
<div class='code'><pre class="idle">greeting <span class="Keyword">=</span> <span class="String"><span class="String">"</span>Hello CoffeeScript<span class="String">"</span></span>
|
|
|
|
|
difficulty <span class="Keyword">=</span> <span class="Number">0.5</span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> difficulty, greeting;
|
|
|
|
|
greeting <span class="Keyword">=</span> <span class="String"><span class="String">"</span>Hello CoffeeScript<span class="String">"</span></span>;
|
|
|
|
|
difficulty <span class="Keyword">=</span> <span class="Number">0.5</span>;
|
|
|
|
|
</pre><button onclick='javascript: var difficulty, greeting;
|
|
|
|
|
greeting = "Hello CoffeeScript";
|
|
|
|
|
difficulty = 0.5;
|
|
|
|
|
;alert(greeting);'>run: greeting</button><br class='clear' /></div>
|
|
|
|
|
difficulty = 0.5;;alert(greeting);'>run: greeting</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
All declaration of new variables is pushed up to the top of the nearest
|
|
|
|
|
lexical scope, so that assignment may always be performed within expressions.
|
|
|
|
@ -495,42 +489,50 @@ difficulty = 0.5;
|
|
|
|
|
assigning local variables, and can be moved around freely. Feel free to mix
|
|
|
|
|
and match the two styles.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">song<span class="Keyword">:</span> [<span class="String"><span class="String">"</span>do<span class="String">"</span></span>, <span class="String"><span class="String">"</span>re<span class="String">"</span></span>, <span class="String"><span class="String">"</span>mi<span class="String">"</span></span>, <span class="String"><span class="String">"</span>fa<span class="String">"</span></span>, <span class="String"><span class="String">"</span>so<span class="String">"</span></span>]
|
|
|
|
|
<div class='code'><pre class="idle">song <span class="Keyword">=</span> [<span class="String"><span class="String">"</span>do<span class="String">"</span></span>, <span class="String"><span class="String">"</span>re<span class="String">"</span></span>, <span class="String"><span class="String">"</span>mi<span class="String">"</span></span>, <span class="String"><span class="String">"</span>fa<span class="String">"</span></span>, <span class="String"><span class="String">"</span>so<span class="String">"</span></span>]
|
|
|
|
|
|
|
|
|
|
ages<span class="Keyword">:</span> {
|
|
|
|
|
singers <span class="Keyword">=</span> {Jagger<span class="Keyword">:</span> <span class="String"><span class="String">'</span>Rock<span class="String">'</span></span>, Elvis<span class="Keyword">:</span> <span class="String"><span class="String">'</span>Roll<span class="String">'</span></span>}
|
|
|
|
|
|
|
|
|
|
ages <span class="Keyword">=</span>
|
|
|
|
|
max<span class="Keyword">:</span> <span class="Number">10</span>
|
|
|
|
|
ida<span class="Keyword">:</span> <span class="Number">9</span>
|
|
|
|
|
tim<span class="Keyword">:</span> <span class="Number">11</span>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
matrix<span class="Keyword">:</span> [
|
|
|
|
|
matrix <span class="Keyword">=</span> [
|
|
|
|
|
<span class="Number">1</span>, <span class="Number">0</span>, <span class="Number">1</span>
|
|
|
|
|
<span class="Number">0</span>, <span class="Number">0</span>, <span class="Number">1</span>
|
|
|
|
|
<span class="Number">1</span>, <span class="Number">1</span>, <span class="Number">0</span>
|
|
|
|
|
]
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> ages, matrix, song;
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> ages, matrix, singers, song;
|
|
|
|
|
song <span class="Keyword">=</span> [<span class="String"><span class="String">"</span>do<span class="String">"</span></span>, <span class="String"><span class="String">"</span>re<span class="String">"</span></span>, <span class="String"><span class="String">"</span>mi<span class="String">"</span></span>, <span class="String"><span class="String">"</span>fa<span class="String">"</span></span>, <span class="String"><span class="String">"</span>so<span class="String">"</span></span>];
|
|
|
|
|
singers <span class="Keyword">=</span> {
|
|
|
|
|
Jagger: <span class="String"><span class="String">'</span>Rock<span class="String">'</span></span>,
|
|
|
|
|
Elvis: <span class="String"><span class="String">'</span>Roll<span class="String">'</span></span>
|
|
|
|
|
};
|
|
|
|
|
ages <span class="Keyword">=</span> {
|
|
|
|
|
max: <span class="Number">10</span>,
|
|
|
|
|
ida: <span class="Number">9</span>,
|
|
|
|
|
tim: <span class="Number">11</span>
|
|
|
|
|
};
|
|
|
|
|
matrix <span class="Keyword">=</span> [<span class="Number">1</span>, <span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">0</span>, <span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">1</span>, <span class="Number">1</span>, <span class="Number">0</span>];
|
|
|
|
|
</pre><button onclick='javascript: var ages, matrix, song;
|
|
|
|
|
</pre><button onclick='javascript: var ages, matrix, singers, song;
|
|
|
|
|
song = ["do", "re", "mi", "fa", "so"];
|
|
|
|
|
singers = {
|
|
|
|
|
Jagger: 'Rock',
|
|
|
|
|
Elvis: 'Roll'
|
|
|
|
|
};
|
|
|
|
|
ages = {
|
|
|
|
|
max: 10,
|
|
|
|
|
ida: 9,
|
|
|
|
|
tim: 11
|
|
|
|
|
};
|
|
|
|
|
matrix = [1, 0, 1, 0, 0, 1, 1, 1, 0];
|
|
|
|
|
;alert(song.join(","));'>run: song.join(",")</button><br class='clear' /></div>
|
|
|
|
|
matrix = [1, 0, 1, 0, 0, 1, 1, 1, 0];;alert(song.join(","));'>run: song.join(",")</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
In JavaScript, you can't use reserved words, like <tt>class</tt>, as properties
|
|
|
|
|
of an object, without quoting them as strings. CoffeeScript notices and quotes
|
|
|
|
|
them for you, so you don't have to worry about it (say, when using jQuery).
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">$(<span class="String"><span class="String">'</span>.account<span class="String">'</span></span>).css {class<span class="Keyword">:</span> <span class="String"><span class="String">'</span>active<span class="String">'</span></span>}
|
|
|
|
|
<div class='code'><pre class="idle">$(<span class="String"><span class="String">'</span>.account<span class="String">'</span></span>).css class<span class="Keyword">:</span> <span class="String"><span class="String">'</span>active<span class="String">'</span></span>
|
|
|
|
|
</pre><pre class="idle"><span class="Keyword">$</span>(<span class="String"><span class="String">'</span>.account<span class="String">'</span></span>).css({
|
|
|
|
|
<span class="String"><span class="String">'</span>class<span class="String">'</span></span>: <span class="String"><span class="String">'</span>active<span class="String">'</span></span>
|
|
|
|
|
});
|
|
|
|
@ -543,18 +545,17 @@ matrix = [1, 0, 1, 0, 0, 1, 1, 1, 0];
|
|
|
|
|
are properly declared within lexical scope — you never need to write
|
|
|
|
|
<tt>var</tt> yourself.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">outer<span class="Keyword">:</span> <span class="Number">1</span>
|
|
|
|
|
<span class="FunctionName">changeNumbers</span><span class="Keyword">:</span> <span class="Storage">-></span>
|
|
|
|
|
inner<span class="Keyword">:</span> <span class="Keyword">-</span><span class="Number">1</span>
|
|
|
|
|
outer<span class="Keyword">:</span> <span class="Number">10</span>
|
|
|
|
|
inner<span class="Keyword">:</span> changeNumbers()
|
|
|
|
|
<div class='code'><pre class="idle">outer <span class="Keyword">=</span> <span class="Number">1</span>
|
|
|
|
|
changeNumbers <span class="Keyword">=</span> <span class="Storage">-></span>
|
|
|
|
|
inner <span class="Keyword">=</span> <span class="Keyword">-</span><span class="Number">1</span>
|
|
|
|
|
outer <span class="Keyword">=</span> <span class="Number">10</span>
|
|
|
|
|
inner <span class="Keyword">=</span> changeNumbers()
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> changeNumbers, inner, outer;
|
|
|
|
|
outer <span class="Keyword">=</span> <span class="Number">1</span>;
|
|
|
|
|
<span class="FunctionName">changeNumbers</span> = <span class="Storage">function</span>() {
|
|
|
|
|
<span class="Storage">var</span> inner;
|
|
|
|
|
inner <span class="Keyword">=</span> <span class="Keyword">-</span><span class="Number">1</span>;
|
|
|
|
|
outer <span class="Keyword">=</span> <span class="Number">10</span>;
|
|
|
|
|
<span class="Keyword">return</span> outer;
|
|
|
|
|
<span class="Keyword">return</span> (outer <span class="Keyword">=</span> <span class="Number">10</span>);
|
|
|
|
|
};
|
|
|
|
|
inner <span class="Keyword">=</span> changeNumbers();
|
|
|
|
|
</pre><button onclick='javascript: var changeNumbers, inner, outer;
|
|
|
|
@ -562,11 +563,9 @@ outer = 1;
|
|
|
|
|
changeNumbers = function() {
|
|
|
|
|
var inner;
|
|
|
|
|
inner = -1;
|
|
|
|
|
outer = 10;
|
|
|
|
|
return outer;
|
|
|
|
|
return (outer = 10);
|
|
|
|
|
};
|
|
|
|
|
inner = changeNumbers();
|
|
|
|
|
;alert(inner);'>run: inner</button><br class='clear' /></div>
|
|
|
|
|
inner = changeNumbers();;alert(inner);'>run: inner</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
Notice how the all of the variable declarations have been pushed up to
|
|
|
|
|
the top of the closest scope, the first time they appear.
|
|
|
|
@ -611,15 +610,17 @@ inner = changeNumbers();
|
|
|
|
|
is no explicit ternary statement in CoffeeScript — you simply use
|
|
|
|
|
a regular <b>if</b> statement inline.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">mood<span class="Keyword">:</span> greatlyImproved <span class="Keyword">if</span> singing
|
|
|
|
|
<div class='code'><pre class="idle">mood <span class="Keyword">=</span> greatlyImproved <span class="Keyword">if</span> singing
|
|
|
|
|
|
|
|
|
|
<span class="Keyword">if</span> happy <span class="Keyword">and</span> knowsIt
|
|
|
|
|
clapsHands()
|
|
|
|
|
chaChaCha()
|
|
|
|
|
<span class="Keyword">else</span>
|
|
|
|
|
showIt()
|
|
|
|
|
|
|
|
|
|
date<span class="Keyword">:</span> <span class="Keyword">if</span> friday <span class="Keyword">then</span> sue <span class="Keyword">else</span> jill
|
|
|
|
|
date <span class="Keyword">=</span> <span class="Keyword">if</span> friday <span class="Keyword">then</span> sue <span class="Keyword">else</span> jill
|
|
|
|
|
|
|
|
|
|
options<span class="Keyword">:</span> <span class="Keyword">or</span> defaultOptions
|
|
|
|
|
options <span class="Keyword">=</span> <span class="Keyword">or</span> defaults
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> date, mood, options;
|
|
|
|
|
<span class="Keyword">if</span> (singing) {
|
|
|
|
|
mood <span class="Keyword">=</span> greatlyImproved;
|
|
|
|
@ -627,9 +628,11 @@ options<span class="Keyword">:</span> <span class="Keyword">or</span> defaultOpt
|
|
|
|
|
<span class="Keyword">if</span> (happy <span class="Keyword">&</span><span class="Keyword">&</span> knowsIt) {
|
|
|
|
|
clapsHands();
|
|
|
|
|
chaChaCha();
|
|
|
|
|
} <span class="Keyword">else</span> {
|
|
|
|
|
showIt();
|
|
|
|
|
}
|
|
|
|
|
date <span class="Keyword">=</span> friday ? sue : jill;
|
|
|
|
|
options <span class="Keyword">=</span> options <span class="Keyword">||</span> defaultOptions;
|
|
|
|
|
options <span class="Keyword">=</span> options <span class="Keyword">||</span> defaults;
|
|
|
|
|
</pre><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
You can assign a variable to a half-expression to perform an operation
|
|
|
|
@ -675,13 +678,13 @@ options <span class="Keyword">=</span> options <span class="Keyword">||</span> d
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">launch() <span class="Keyword">if</span> ignition <span class="Keyword">is</span> <span class="BuiltInConstant">on</span>
|
|
|
|
|
|
|
|
|
|
volume<span class="Keyword">:</span> <span class="Number">10</span> <span class="Keyword">if</span> band <span class="Keyword">isnt</span> SpinalTap
|
|
|
|
|
volume <span class="Keyword">=</span> <span class="Number">10</span> <span class="Keyword">if</span> band <span class="Keyword">isnt</span> SpinalTap
|
|
|
|
|
|
|
|
|
|
letTheWildRumpusBegin() <span class="Keyword">unless</span> answer <span class="Keyword">is</span> <span class="BuiltInConstant">no</span>
|
|
|
|
|
|
|
|
|
|
<span class="Keyword">if</span> car.speed <span class="Keyword"><</span> limit <span class="Keyword">then</span> accelerate()
|
|
|
|
|
|
|
|
|
|
winner<span class="Keyword">:</span> <span class="BuiltInConstant">yes</span> <span class="Keyword">if</span> pick <span class="Keyword">in</span> [<span class="Number">47</span>, <span class="Number">92</span>, <span class="Number">13</span>]
|
|
|
|
|
winner <span class="Keyword">=</span> <span class="BuiltInConstant">yes</span> <span class="Keyword">if</span> pick <span class="Keyword">in</span> [<span class="Number">47</span>, <span class="Number">92</span>, <span class="Number">13</span>]
|
|
|
|
|
|
|
|
|
|
print <span class="String"><span class="String">"</span>My name is <span class="String">"</span></span> <span class="Keyword">+</span> <span class="Variable">@name</span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> volume, winner;
|
|
|
|
@ -709,14 +712,14 @@ car.speed <span class="Keyword"><</span> limit ? accelerate() : <span class="
|
|
|
|
|
splats <tt>...</tt>, both for function definition as well as invocation,
|
|
|
|
|
making variable numbers of arguments a little bit more palatable.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">gold<span class="Keyword">:</span> silver<span class="Keyword">:</span> rest<span class="Keyword">:</span> <span class="String"><span class="String">"</span>unknown<span class="String">"</span></span>
|
|
|
|
|
<div class='code'><pre class="idle">gold <span class="Keyword">=</span> silver <span class="Keyword">=</span> rest <span class="Keyword">=</span> <span class="String"><span class="String">"</span>unknown<span class="String">"</span></span>
|
|
|
|
|
|
|
|
|
|
<span class="FunctionName">awardMedals</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">first, second, rest...</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
gold<span class="Keyword">:</span> first
|
|
|
|
|
silver<span class="Keyword">:</span> second
|
|
|
|
|
rest<span class="Keyword">:</span> rest
|
|
|
|
|
awardMedals <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">first, second, others...</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
gold <span class="Keyword">=</span> first
|
|
|
|
|
silver <span class="Keyword">=</span> second
|
|
|
|
|
rest <span class="Keyword">=</span> others
|
|
|
|
|
|
|
|
|
|
contenders<span class="Keyword">:</span> [
|
|
|
|
|
contenders <span class="Keyword">=</span> [
|
|
|
|
|
<span class="String"><span class="String">"</span>Michael Phelps<span class="String">"</span></span>
|
|
|
|
|
<span class="String"><span class="String">"</span>Liu Xiang<span class="String">"</span></span>
|
|
|
|
|
<span class="String"><span class="String">"</span>Yao Ming<span class="String">"</span></span>
|
|
|
|
@ -738,12 +741,11 @@ alert <span class="String"><span class="String">"</span>The Field: <span cl
|
|
|
|
|
<span class="Storage">var</span> __slice <span class="Keyword">=</span> <span class="LibraryClassType">Array</span>.<span class="LibraryConstant">prototype</span>.slice;
|
|
|
|
|
gold <span class="Keyword">=</span> (silver <span class="Keyword">=</span> (rest <span class="Keyword">=</span> <span class="String"><span class="String">"</span>unknown<span class="String">"</span></span>));
|
|
|
|
|
<span class="FunctionName">awardMedals</span> = <span class="Storage">function</span>(<span class="FunctionArgument">first, second</span>) {
|
|
|
|
|
<span class="Storage">var</span> _a <span class="Keyword">=</span> arguments.<span class="LibraryConstant">length</span>, _b <span class="Keyword">=</span> _a <span class="Keyword">>=</span> <span class="Number">3</span>;
|
|
|
|
|
rest <span class="Keyword">=</span> __slice.<span class="LibraryFunction">call</span>(arguments, <span class="Number">2</span>, _a <span class="Keyword">-</span> <span class="Number">0</span>);
|
|
|
|
|
<span class="Storage">var</span> others;
|
|
|
|
|
others <span class="Keyword">=</span> __slice.<span class="LibraryFunction">call</span>(arguments, <span class="Number">2</span>);
|
|
|
|
|
gold <span class="Keyword">=</span> first;
|
|
|
|
|
silver <span class="Keyword">=</span> second;
|
|
|
|
|
rest <span class="Keyword">=</span> rest;
|
|
|
|
|
<span class="Keyword">return</span> rest;
|
|
|
|
|
<span class="Keyword">return</span> (rest <span class="Keyword">=</span> others);
|
|
|
|
|
};
|
|
|
|
|
contenders <span class="Keyword">=</span> [<span class="String"><span class="String">"</span>Michael Phelps<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Liu Xiang<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Yao Ming<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Allyson Felix<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Shawn Johnson<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Roman Sebrle<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Guo Jingjing<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Tyson Gay<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Asafa Powell<span class="String">"</span></span>, <span class="String"><span class="String">"</span>Usain Bolt<span class="String">"</span></span>];
|
|
|
|
|
awardMedals.<span class="LibraryFunction">apply</span>(<span class="Variable">this</span>, contenders);
|
|
|
|
@ -754,19 +756,17 @@ awardMedals.<span class="LibraryFunction">apply</span>(<span class="Variable">th
|
|
|
|
|
var __slice = Array.prototype.slice;
|
|
|
|
|
gold = (silver = (rest = "unknown"));
|
|
|
|
|
awardMedals = function(first, second) {
|
|
|
|
|
var _a = arguments.length, _b = _a >= 3;
|
|
|
|
|
rest = __slice.call(arguments, 2, _a - 0);
|
|
|
|
|
var others;
|
|
|
|
|
others = __slice.call(arguments, 2);
|
|
|
|
|
gold = first;
|
|
|
|
|
silver = second;
|
|
|
|
|
rest = rest;
|
|
|
|
|
return rest;
|
|
|
|
|
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(this, contenders);
|
|
|
|
|
alert("Gold: " + gold);
|
|
|
|
|
alert("Silver: " + silver);
|
|
|
|
|
alert("The Field: " + rest);
|
|
|
|
|
;'>run</button><br class='clear' /></div>
|
|
|
|
|
alert("The Field: " + rest);;'>run</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<span id="while" class="bookmark"></span>
|
|
|
|
@ -782,8 +782,8 @@ alert("The Field: " + rest);
|
|
|
|
|
sell() <span class="Keyword">until</span> supply <span class="Keyword">></span> demand
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Nursery Rhyme</span>
|
|
|
|
|
num<span class="Keyword">:</span> <span class="Number">6</span>
|
|
|
|
|
lyrics<span class="Keyword">:</span> <span class="Keyword">while</span> num<span class="Keyword">:</span> <span class="Keyword">-</span> <span class="Number">1</span>
|
|
|
|
|
num <span class="Keyword">=</span> <span class="Number">6</span>
|
|
|
|
|
lyrics <span class="Keyword">=</span> <span class="Keyword">while</span> num <span class="Keyword">-</span><span class="Keyword">=</span> <span class="Number">1</span>
|
|
|
|
|
num <span class="Keyword">+</span> <span class="String"><span class="String">"</span> little monkeys, jumping on the bed.</span>
|
|
|
|
|
<span class="String"> One fell out and bumped his head.<span class="String">"</span></span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, lyrics, num;
|
|
|
|
@ -821,8 +821,7 @@ lyrics = (function() {
|
|
|
|
|
One fell out and bumped his head.");
|
|
|
|
|
}
|
|
|
|
|
return _a;
|
|
|
|
|
})();
|
|
|
|
|
;alert(lyrics.join("\n"));'>run: lyrics.join("\n")</button><br class='clear' /></div>
|
|
|
|
|
})();;alert(lyrics.join("\n"));'>run: lyrics.join("\n")</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
For readability, the <b>until</b> keyword is equivalent to <tt>while not</tt>,
|
|
|
|
|
and the <b>loop</b> keyword is equivalent to <tt>while true</tt>.
|
|
|
|
@ -843,7 +842,7 @@ One fell out and bumped his head.");
|
|
|
|
|
would use a loop, <b>each</b>/<b>forEach</b>, <b>map</b>, or <b>select</b>/<b>filter</b>.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> Eat lunch.</span>
|
|
|
|
|
lunch<span class="Keyword">:</span> eat food <span class="Keyword">for</span> food <span class="Keyword">in</span> [<span class="String"><span class="String">'</span>toast<span class="String">'</span></span>, <span class="String"><span class="String">'</span>cheese<span class="String">'</span></span>, <span class="String"><span class="String">'</span>wine<span class="String">'</span></span>]
|
|
|
|
|
lunch <span class="Keyword">=</span> eat food <span class="Keyword">for</span> food <span class="Keyword">in</span> [<span class="String"><span class="String">'</span>toast<span class="String">'</span></span>, <span class="String"><span class="String">'</span>cheese<span class="String">'</span></span>, <span class="String"><span class="String">'</span>wine<span class="String">'</span></span>]
|
|
|
|
|
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Naive collision detection.</span>
|
|
|
|
|
<span class="Keyword">for</span> roid <span class="Keyword">in</span> asteroids
|
|
|
|
@ -877,12 +876,12 @@ _f <span class="Keyword">=</span> asteroids;
|
|
|
|
|
in fixed-size increments, you can use a range to specify the start and
|
|
|
|
|
end of your comprehension.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">countdown<span class="Keyword">:</span> num <span class="Keyword">for</span> num <span class="Keyword">in</span> [<span class="Number">10</span>..<span class="Number">1</span>]
|
|
|
|
|
<div class='code'><pre class="idle">countdown <span class="Keyword">=</span> num <span class="Keyword">for</span> num <span class="Keyword">in</span> [<span class="Number">10</span>..<span class="Number">1</span>]
|
|
|
|
|
|
|
|
|
|
<span class="FunctionName">deliverEggs</span><span class="Keyword">:</span> <span class="Storage">-></span>
|
|
|
|
|
deliverEggs <span class="Keyword">=</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Keyword">for</span> i <span class="Keyword">in</span> [<span class="Number">0</span>...eggs.length] <span class="Keyword">by</span> <span class="Number">12</span>
|
|
|
|
|
dozen<span class="Keyword">:</span> eggs[i...i<span class="Keyword">+</span><span class="Number">12</span>]
|
|
|
|
|
deliver <span class="Keyword">new</span> <span class="TypeName">eggCarton</span>(dozen)
|
|
|
|
|
dozen <span class="Keyword">=</span> eggs[i...i<span class="Keyword">+</span><span class="Number">12</span>]
|
|
|
|
|
deliver <span class="Keyword">new</span> <span class="TypeName">eggCarton</span> dozen
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, countdown, deliverEggs, num;
|
|
|
|
|
countdown <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
|
|
|
|
_a <span class="Keyword">=</span> [];
|
|
|
|
@ -920,16 +919,15 @@ deliverEggs = function() {
|
|
|
|
|
})());
|
|
|
|
|
}
|
|
|
|
|
return _b;
|
|
|
|
|
};
|
|
|
|
|
;alert(countdown);'>run: countdown</button><br class='clear' /></div>
|
|
|
|
|
};;alert(countdown);'>run: countdown</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
Comprehensions can also be used to iterate over the keys and values in
|
|
|
|
|
an object. Use <tt>of</tt> to signal comprehension over the properties of
|
|
|
|
|
an object instead of the values in an array.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">yearsOld<span class="Keyword">:</span> {max<span class="Keyword">:</span> <span class="Number">10</span>, ida<span class="Keyword">:</span> <span class="Number">9</span>, tim<span class="Keyword">:</span> <span class="Number">11</span>}
|
|
|
|
|
<div class='code'><pre class="idle">yearsOld <span class="Keyword">=</span> max<span class="Keyword">:</span> <span class="Number">10</span>, ida<span class="Keyword">:</span> <span class="Number">9</span>, tim<span class="Keyword">:</span> <span class="Number">11</span>
|
|
|
|
|
|
|
|
|
|
ages<span class="Keyword">:</span> <span class="Keyword">for</span> child, age <span class="Keyword">of</span> yearsOld
|
|
|
|
|
ages <span class="Keyword">=</span> <span class="Keyword">for</span> child, age <span class="Keyword">of</span> yearsOld
|
|
|
|
|
child <span class="Keyword">+</span> <span class="String"><span class="String">"</span> is <span class="String">"</span></span> <span class="Keyword">+</span> age
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, age, ages, child, yearsOld;
|
|
|
|
|
<span class="Storage">var</span> __hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty;
|
|
|
|
@ -962,8 +960,7 @@ ages = (function() {
|
|
|
|
|
_a.push(child + " is " + age);
|
|
|
|
|
}
|
|
|
|
|
return _a;
|
|
|
|
|
})();
|
|
|
|
|
;alert(ages.join(", "));'>run: ages.join(", ")</button><br class='clear' /></div>
|
|
|
|
|
})();;alert(ages.join(", "));'>run: ages.join(", ")</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<span id="slice_splice" class="bookmark"></span>
|
|
|
|
@ -975,11 +972,11 @@ ages = (function() {
|
|
|
|
|
the slice, and the second is the index of the last one. Three dots signify
|
|
|
|
|
a range that excludes the end.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">numbers<span class="Keyword">:</span> [<span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>]
|
|
|
|
|
<div class='code'><pre class="idle">numbers <span class="Keyword">=</span> [<span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>]
|
|
|
|
|
|
|
|
|
|
threeToSix<span class="Keyword">:</span> numbers[<span class="Number">3</span>..<span class="Number">6</span>]
|
|
|
|
|
threeToSix <span class="Keyword">=</span> numbers[<span class="Number">3</span>..<span class="Number">6</span>]
|
|
|
|
|
|
|
|
|
|
copy<span class="Keyword">:</span> numbers[<span class="Number">0</span>...numbers.length]
|
|
|
|
|
copy <span class="Keyword">=</span> numbers[<span class="Number">0</span>...numbers.length]
|
|
|
|
|
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> copy, numbers, threeToSix;
|
|
|
|
|
numbers <span class="Keyword">=</span> [<span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>];
|
|
|
|
@ -988,15 +985,14 @@ copy <span class="Keyword">=</span> numbers.<span class="LibraryFunction">slice<
|
|
|
|
|
</pre><button onclick='javascript: var copy, numbers, threeToSix;
|
|
|
|
|
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
|
|
|
threeToSix = numbers.slice(3, 6 + 1);
|
|
|
|
|
copy = numbers.slice(0, numbers.length);
|
|
|
|
|
;alert(copy);'>run: copy</button><br class='clear' /></div>
|
|
|
|
|
copy = numbers.slice(0, numbers.length);;alert(copy);'>run: copy</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
The same syntax can be used with assignment to replace a segment of an
|
|
|
|
|
array with new values (to splice it).
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">numbers<span class="Keyword">:</span> [<span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>]
|
|
|
|
|
<div class='code'><pre class="idle">numbers <span class="Keyword">=</span> [<span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>]
|
|
|
|
|
|
|
|
|
|
numbers[<span class="Number">3</span>..<span class="Number">6</span>]<span class="Keyword">:</span> [<span class="Keyword">-</span><span class="Number">3</span>, <span class="Keyword">-</span><span class="Number">4</span>, <span class="Keyword">-</span><span class="Number">5</span>, <span class="Keyword">-</span><span class="Number">6</span>]
|
|
|
|
|
numbers[<span class="Number">3</span>..<span class="Number">6</span>] <span class="Keyword">=</span> [<span class="Keyword">-</span><span class="Number">3</span>, <span class="Keyword">-</span><span class="Number">4</span>, <span class="Keyword">-</span><span class="Number">5</span>, <span class="Keyword">-</span><span class="Number">6</span>]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> numbers;
|
|
|
|
@ -1004,8 +1000,7 @@ numbers <span class="Keyword">=</span> [<span class="Number">0</span>, <span cla
|
|
|
|
|
numbers.splice.<span class="LibraryFunction">apply</span>(numbers, [<span class="Number">3</span>, <span class="Number">6</span> <span class="Keyword">-</span> <span class="Number">3</span> <span class="Keyword">+</span> <span class="Number">1</span>].<span class="LibraryFunction">concat</span>([<span class="Keyword">-</span><span class="Number">3</span>, <span class="Keyword">-</span><span class="Number">4</span>, <span class="Keyword">-</span><span class="Number">5</span>, <span class="Keyword">-</span><span class="Number">6</span>]));
|
|
|
|
|
</pre><button onclick='javascript: var numbers;
|
|
|
|
|
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
|
|
|
numbers.splice.apply(numbers, [3, 6 - 3 + 1].concat([-3, -4, -5, -6]));
|
|
|
|
|
;alert(numbers);'>run: numbers</button><br class='clear' /></div>
|
|
|
|
|
numbers.splice.apply(numbers, [3, 6 - 3 + 1].concat([-3, -4, -5, -6]));;alert(numbers);'>run: numbers</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<span id="expressions" class="bookmark"></span>
|
|
|
|
@ -1017,7 +1012,7 @@ numbers.splice.apply(numbers, [3, 6 - 3 + 1].concat([-3, -4, -5, -6]));
|
|
|
|
|
pushed down into each possible branch of execution, in the function
|
|
|
|
|
below.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="FunctionName">grade</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">student</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<div class='code'><pre class="idle">grade <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">student</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Keyword">if</span> student.excellentWork
|
|
|
|
|
<span class="String"><span class="String">"</span>A+<span class="String">"</span></span>
|
|
|
|
|
<span class="Keyword">else</span> <span class="Keyword">if</span> student.okayStuff
|
|
|
|
@ -1025,7 +1020,7 @@ numbers.splice.apply(numbers, [3, 6 - 3 + 1].concat([-3, -4, -5, -6]));
|
|
|
|
|
<span class="Keyword">else</span>
|
|
|
|
|
<span class="String"><span class="String">"</span>C<span class="String">"</span></span>
|
|
|
|
|
|
|
|
|
|
eldest<span class="Keyword">:</span> <span class="Keyword">if</span> <span class="Number">24</span> <span class="Keyword">></span> <span class="Number">21</span> <span class="Keyword">then</span> <span class="String"><span class="String">"</span>Liz<span class="String">"</span></span> <span class="Keyword">else</span> <span class="String"><span class="String">"</span>Ike<span class="String">"</span></span>
|
|
|
|
|
eldest <span class="Keyword">=</span> <span class="Keyword">if</span> <span class="Number">24</span> <span class="Keyword">></span> <span class="Number">21</span> <span class="Keyword">then</span> <span class="String"><span class="String">"</span>Liz<span class="String">"</span></span> <span class="Keyword">else</span> <span class="String"><span class="String">"</span>Ike<span class="String">"</span></span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> eldest, grade;
|
|
|
|
|
<span class="FunctionName">grade</span> = <span class="Storage">function</span>(<span class="FunctionArgument">student</span>) {
|
|
|
|
|
<span class="Keyword">if</span> (student.excellentWork) {
|
|
|
|
@ -1047,8 +1042,7 @@ grade = function(student) {
|
|
|
|
|
return "C";
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
eldest = 24 > 21 ? "Liz" : "Ike";
|
|
|
|
|
;alert(eldest);'>run: eldest</button><br class='clear' /></div>
|
|
|
|
|
eldest = 24 > 21 ? "Liz" : "Ike";;alert(eldest);'>run: eldest</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
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
|
|
|
|
@ -1058,12 +1052,11 @@ eldest = 24 > 21 ? "Liz" : "Ike";
|
|
|
|
|
Because variable declarations occur at the top of scope, assignment can
|
|
|
|
|
be used within expressions, even for variables that haven't been seen before:
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">six<span class="Keyword">:</span> (one<span class="Keyword">:</span> <span class="Number">1</span>) <span class="Keyword">+</span> (two<span class="Keyword">:</span> <span class="Number">2</span>) <span class="Keyword">+</span> (three<span class="Keyword">:</span> <span class="Number">3</span>)
|
|
|
|
|
<div class='code'><pre class="idle">six <span class="Keyword">=</span> (one <span class="Keyword">=</span> <span class="Number">1</span>) <span class="Keyword">+</span> (two <span class="Keyword">=</span> <span class="Number">2</span>) <span class="Keyword">+</span> (three <span class="Keyword">=</span> <span class="Number">3</span>)
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> one, six, three, two;
|
|
|
|
|
six <span class="Keyword">=</span> (one <span class="Keyword">=</span> <span class="Number">1</span>) <span class="Keyword">+</span> (two <span class="Keyword">=</span> <span class="Number">2</span>) <span class="Keyword">+</span> (three <span class="Keyword">=</span> <span class="Number">3</span>);
|
|
|
|
|
</pre><button onclick='javascript: var one, six, three, two;
|
|
|
|
|
six = (one = 1) + (two = 2) + (three = 3);
|
|
|
|
|
;alert(six);'>run: six</button><br class='clear' /></div>
|
|
|
|
|
six = (one = 1) + (two = 2) + (three = 3);;alert(six);'>run: six</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
Things that would otherwise be statements in JavaScript, when used
|
|
|
|
|
as part of an expression in CoffeeScript, are converted into expressions
|
|
|
|
@ -1072,28 +1065,29 @@ six = (one = 1) + (two = 2) + (three = 3);
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> The first ten global properties.</span>
|
|
|
|
|
|
|
|
|
|
globals<span class="Keyword">:</span> (name <span class="Keyword">for</span> name <span class="Keyword">of</span> window)[<span class="Number">0</span>...<span class="Number">10</span>]
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, globals, name;
|
|
|
|
|
globals <span class="Keyword">=</span> (name <span class="Keyword">for</span> name <span class="Keyword">of</span> window)[<span class="Number">0</span>...<span class="Number">10</span>]
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, globals, name;
|
|
|
|
|
<span class="Storage">var</span> __hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty;
|
|
|
|
|
globals <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
|
|
|
|
_a <span class="Keyword">=</span> []; _b <span class="Keyword">=</span> <span class="LibraryClassType">window</span>;
|
|
|
|
|
<span class="Keyword">for</span> (name <span class="Keyword">in</span> _b) {
|
|
|
|
|
<span class="Keyword">if</span> (<span class="Keyword">!</span>__hasProp.<span class="LibraryFunction">call</span>(_b, name)) <span class="Keyword">continue</span>;
|
|
|
|
|
_a.<span class="LibraryFunction">push</span>(name);
|
|
|
|
|
_b <span class="Keyword">=</span> []; _c <span class="Keyword">=</span> <span class="LibraryClassType">window</span>;
|
|
|
|
|
<span class="Keyword">for</span> (name <span class="Keyword">in</span> _c) {
|
|
|
|
|
<span class="Keyword">if</span> (<span class="Keyword">!</span>__hasProp.<span class="LibraryFunction">call</span>(_c, name)) <span class="Keyword">continue</span>;
|
|
|
|
|
_a <span class="Keyword">=</span> _c[name];
|
|
|
|
|
_b.<span class="LibraryFunction">push</span>(name);
|
|
|
|
|
}
|
|
|
|
|
<span class="Keyword">return</span> _a;
|
|
|
|
|
<span class="Keyword">return</span> _b;
|
|
|
|
|
})().<span class="LibraryFunction">slice</span>(<span class="Number">0</span>, <span class="Number">10</span>);
|
|
|
|
|
</pre><button onclick='javascript: var _a, _b, globals, name;
|
|
|
|
|
</pre><button onclick='javascript: var _a, _b, _c, globals, name;
|
|
|
|
|
var __hasProp = Object.prototype.hasOwnProperty;
|
|
|
|
|
globals = (function() {
|
|
|
|
|
_a = []; _b = window;
|
|
|
|
|
for (name in _b) {
|
|
|
|
|
if (!__hasProp.call(_b, name)) continue;
|
|
|
|
|
_a.push(name);
|
|
|
|
|
_b = []; _c = window;
|
|
|
|
|
for (name in _c) {
|
|
|
|
|
if (!__hasProp.call(_c, name)) continue;
|
|
|
|
|
_a = _c[name];
|
|
|
|
|
_b.push(name);
|
|
|
|
|
}
|
|
|
|
|
return _a;
|
|
|
|
|
})().slice(0, 10);
|
|
|
|
|
;alert(globals);'>run: globals</button><br class='clear' /></div>
|
|
|
|
|
return _b;
|
|
|
|
|
})().slice(0, 10);;alert(globals);'>run: globals</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
As well as silly things, like passing a <b>try/catch</b> statement directly
|
|
|
|
|
into a function call:
|
|
|
|
@ -1117,8 +1111,7 @@ globals = (function() {
|
|
|
|
|
} catch (error) {
|
|
|
|
|
return "And the error is ... " + error;
|
|
|
|
|
}
|
|
|
|
|
})());
|
|
|
|
|
;'>run</button><br class='clear' /></div>
|
|
|
|
|
})());;'>run</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
There are a handful of statements in JavaScript that can't be meaningfully
|
|
|
|
|
converted into expressions, namely <tt>break</tt>, <tt>continue</tt>,
|
|
|
|
@ -1139,7 +1132,7 @@ globals = (function() {
|
|
|
|
|
It can also be used for safer conditional assignment than <tt>||=</tt>
|
|
|
|
|
provides, for cases where you may be handling numbers or strings.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">solipsism<span class="Keyword">:</span> <span class="BuiltInConstant">true</span> <span class="Keyword">if</span> mind<span class="Keyword">?</span> <span class="Keyword">and</span> <span class="Keyword">not</span> world<span class="Keyword">?</span>
|
|
|
|
|
<div class='code'><pre class="idle">solipsism <span class="Keyword">=</span> <span class="BuiltInConstant">true</span> <span class="Keyword">if</span> mind<span class="Keyword">?</span> <span class="Keyword">and</span> <span class="Keyword">not</span> world<span class="Keyword">?</span>
|
|
|
|
|
|
|
|
|
|
speed <span class="Keyword">?</span><span class="Keyword">=</span> <span class="Number">140</span>
|
|
|
|
|
|
|
|
|
@ -1156,8 +1149,7 @@ speed <span class="Keyword">=</span> (<span class="Keyword">typeof</span> speed
|
|
|
|
|
if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
|
|
|
|
|
solipsism = true;
|
|
|
|
|
}
|
|
|
|
|
speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;
|
|
|
|
|
;alert(speed);'>run: speed</button><br class='clear' /></div>
|
|
|
|
|
speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;;alert(speed);'>run: speed</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
The accessor variant of the existential operator <tt>?.</tt> can be used to soak
|
|
|
|
|
up null references in a chain of properties. Use it instead
|
|
|
|
@ -1199,27 +1191,23 @@ speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;
|
|
|
|
|
in a single assignable expression.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="Storage">class</span> <span class="TypeName">Animal</span>
|
|
|
|
|
<span class="FunctionName">constructor</span><span class="Keyword">:</span> (<span class="Variable">@name</span>) <span class="Storage">-></span>
|
|
|
|
|
|
|
|
|
|
<span class="FunctionName">move</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">meters</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
alert <span class="Variable">@name</span> <span class="Keyword">+</span> <span class="String"><span class="String">"</span> moved <span class="String">"</span></span> <span class="Keyword">+</span> meters <span class="Keyword">+</span> <span class="String"><span class="String">"</span>m.<span class="String">"</span></span>
|
|
|
|
|
|
|
|
|
|
<span class="Storage">class</span> <span class="TypeName">Snake</span><span class="InheritedClass"> <span class="Keyword">extends</span> Animal</span>
|
|
|
|
|
<span class="FunctionName">constructor</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">name</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Variable">@name</span><span class="Keyword">:</span> name
|
|
|
|
|
|
|
|
|
|
<span class="FunctionName">move</span><span class="Keyword">:</span> <span class="Storage">-></span>
|
|
|
|
|
alert <span class="String"><span class="String">"</span>Slithering...<span class="String">"</span></span>
|
|
|
|
|
<span class="Variable">super</span> <span class="Number">5</span>
|
|
|
|
|
|
|
|
|
|
<span class="Storage">class</span> <span class="TypeName">Horse</span><span class="InheritedClass"> <span class="Keyword">extends</span> Animal</span>
|
|
|
|
|
<span class="FunctionName">constructor</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">name</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Variable">@name</span><span class="Keyword">:</span> name
|
|
|
|
|
|
|
|
|
|
<span class="FunctionName">move</span><span class="Keyword">:</span> <span class="Storage">-></span>
|
|
|
|
|
alert <span class="String"><span class="String">"</span>Galloping...<span class="String">"</span></span>
|
|
|
|
|
<span class="Variable">super</span> <span class="Number">45</span>
|
|
|
|
|
|
|
|
|
|
sam<span class="Keyword">:</span> <span class="Keyword">new</span> <span class="TypeName">Snake</span> <span class="String"><span class="String">"</span>Sammy the Python<span class="String">"</span></span>
|
|
|
|
|
tom<span class="Keyword">:</span> <span class="Keyword">new</span> <span class="TypeName">Horse</span> <span class="String"><span class="String">"</span>Tommy the Palomino<span class="String">"</span></span>
|
|
|
|
|
sam <span class="Keyword">=</span> <span class="Keyword">new</span> <span class="TypeName">Snake</span> <span class="String"><span class="String">"</span>Sammy the Python<span class="String">"</span></span>
|
|
|
|
|
tom <span class="Keyword">=</span> <span class="Keyword">new</span> <span class="TypeName">Horse</span> <span class="String"><span class="String">"</span>Tommy the Palomino<span class="String">"</span></span>
|
|
|
|
|
|
|
|
|
|
sam.move()
|
|
|
|
|
tom.move()
|
|
|
|
@ -1229,29 +1217,30 @@ tom.move()
|
|
|
|
|
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> Animal, Horse, Snake, sam, tom;
|
|
|
|
|
<span class="Storage">var</span> <span class="FunctionName">__extends</span> = <span class="Storage">function</span>(<span class="FunctionArgument">child, parent</span>) {
|
|
|
|
|
<span class="Storage">var</span> <span class="FunctionName">ctor</span> = <span class="Storage">function</span>(){ };
|
|
|
|
|
<span class="LibraryClassType">ctor</span>.<span class="LibraryConstant">prototype</span> = parent.<span class="LibraryConstant">prototype</span>;
|
|
|
|
|
<span class="LibraryClassType">child</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">ctor</span>();
|
|
|
|
|
<span class="LibraryClassType">child</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">constructor</span> = child;
|
|
|
|
|
<span class="Keyword">if</span> (<span class="Keyword">typeof</span> parent.extended <span class="Keyword">===</span> <span class="String"><span class="String">"</span>function<span class="String">"</span></span>) parent.extended(child);
|
|
|
|
|
child.__superClass__ <span class="Keyword">=</span> parent.<span class="LibraryConstant">prototype</span>;
|
|
|
|
|
<span class="Storage">var</span> <span class="FunctionName">ctor</span> = <span class="Storage">function</span>(){};
|
|
|
|
|
<span class="LibraryClassType">ctor</span>.<span class="LibraryConstant">prototype</span> = parent.<span class="LibraryConstant">prototype</span>;
|
|
|
|
|
<span class="LibraryClassType">child</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">ctor</span>();
|
|
|
|
|
<span class="LibraryClassType">child</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">constructor</span> = child;
|
|
|
|
|
<span class="Keyword">if</span> (<span class="Keyword">typeof</span> parent.extended <span class="Keyword">===</span> <span class="String"><span class="String">"</span>function<span class="String">"</span></span>) parent.extended(child);
|
|
|
|
|
child.__superClass__ <span class="Keyword">=</span> parent.<span class="LibraryConstant">prototype</span>;
|
|
|
|
|
};
|
|
|
|
|
<span class="FunctionName">Animal</span> = <span class="Storage">function</span>(<span class="FunctionArgument">_a</span>) {
|
|
|
|
|
<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> _a;
|
|
|
|
|
<span class="Keyword">return</span> <span class="Variable">this</span>;
|
|
|
|
|
};
|
|
|
|
|
<span class="FunctionName">Animal</span> = <span class="Storage">function</span>() {};
|
|
|
|
|
<span class="LibraryClassType">Animal</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>(<span class="FunctionArgument">meters</span>) {
|
|
|
|
|
<span class="Keyword">return</span> <span class="LibraryFunction">alert</span>(<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">+</span> <span class="String"><span class="String">"</span> moved <span class="String">"</span></span> <span class="Keyword">+</span> meters <span class="Keyword">+</span> <span class="String"><span class="String">"</span>m.<span class="String">"</span></span>);
|
|
|
|
|
};
|
|
|
|
|
<span class="FunctionName">Snake</span> = <span class="Storage">function</span>(<span class="FunctionArgument">name</span>) {
|
|
|
|
|
<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name;
|
|
|
|
|
<span class="Keyword">return</span> <span class="Variable">this</span>;
|
|
|
|
|
<span class="FunctionName">Snake</span> = <span class="Storage">function</span>() {
|
|
|
|
|
<span class="Keyword">return</span> Animal.<span class="LibraryFunction">apply</span>(<span class="Variable">this</span>, arguments);
|
|
|
|
|
};
|
|
|
|
|
__extends(Snake, Animal);
|
|
|
|
|
<span class="LibraryClassType">Snake</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>() {
|
|
|
|
|
<span class="LibraryFunction">alert</span>(<span class="String"><span class="String">"</span>Slithering...<span class="String">"</span></span>);
|
|
|
|
|
<span class="Keyword">return</span> Snake.__superClass__.move.<span class="LibraryFunction">call</span>(<span class="Variable">this</span>, <span class="Number">5</span>);
|
|
|
|
|
};
|
|
|
|
|
<span class="FunctionName">Horse</span> = <span class="Storage">function</span>(<span class="FunctionArgument">name</span>) {
|
|
|
|
|
<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name;
|
|
|
|
|
<span class="Keyword">return</span> <span class="Variable">this</span>;
|
|
|
|
|
<span class="FunctionName">Horse</span> = <span class="Storage">function</span>() {
|
|
|
|
|
<span class="Keyword">return</span> Animal.<span class="LibraryFunction">apply</span>(<span class="Variable">this</span>, arguments);
|
|
|
|
|
};
|
|
|
|
|
__extends(Horse, Animal);
|
|
|
|
|
<span class="LibraryClassType">Horse</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>() {
|
|
|
|
@ -1264,29 +1253,30 @@ sam.move();
|
|
|
|
|
tom.move();
|
|
|
|
|
</pre><button onclick='javascript: var Animal, Horse, Snake, sam, tom;
|
|
|
|
|
var __extends = function(child, parent) {
|
|
|
|
|
var ctor = function(){ };
|
|
|
|
|
ctor.prototype = parent.prototype;
|
|
|
|
|
child.prototype = new ctor();
|
|
|
|
|
child.prototype.constructor = child;
|
|
|
|
|
if (typeof parent.extended === "function") parent.extended(child);
|
|
|
|
|
child.__superClass__ = parent.prototype;
|
|
|
|
|
var ctor = function(){};
|
|
|
|
|
ctor.prototype = parent.prototype;
|
|
|
|
|
child.prototype = new ctor();
|
|
|
|
|
child.prototype.constructor = child;
|
|
|
|
|
if (typeof parent.extended === "function") parent.extended(child);
|
|
|
|
|
child.__superClass__ = parent.prototype;
|
|
|
|
|
};
|
|
|
|
|
Animal = function(_a) {
|
|
|
|
|
this.name = _a;
|
|
|
|
|
return this;
|
|
|
|
|
};
|
|
|
|
|
Animal = function() {};
|
|
|
|
|
Animal.prototype.move = function(meters) {
|
|
|
|
|
return alert(this.name + " moved " + meters + "m.");
|
|
|
|
|
};
|
|
|
|
|
Snake = function(name) {
|
|
|
|
|
this.name = name;
|
|
|
|
|
return this;
|
|
|
|
|
Snake = function() {
|
|
|
|
|
return Animal.apply(this, arguments);
|
|
|
|
|
};
|
|
|
|
|
__extends(Snake, Animal);
|
|
|
|
|
Snake.prototype.move = function() {
|
|
|
|
|
alert("Slithering...");
|
|
|
|
|
return Snake.__superClass__.move.call(this, 5);
|
|
|
|
|
};
|
|
|
|
|
Horse = function(name) {
|
|
|
|
|
this.name = name;
|
|
|
|
|
return this;
|
|
|
|
|
Horse = function() {
|
|
|
|
|
return Animal.apply(this, arguments);
|
|
|
|
|
};
|
|
|
|
|
__extends(Horse, Animal);
|
|
|
|
|
Horse.prototype.move = function() {
|
|
|
|
@ -1296,8 +1286,7 @@ Horse.prototype.move = function() {
|
|
|
|
|
sam = new Snake("Sammy the Python");
|
|
|
|
|
tom = new Horse("Tommy the Palomino");
|
|
|
|
|
sam.move();
|
|
|
|
|
tom.move();
|
|
|
|
|
;'>run</button><br class='clear' /></div>
|
|
|
|
|
tom.move();;'>run</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
If structuring your prototypes classically isn't your cup of tea, CoffeeScript
|
|
|
|
|
provides a couple of lower-level conveniences. The <tt>extends</tt> operator
|
|
|
|
@ -1305,15 +1294,14 @@ tom.move();
|
|
|
|
|
quick access to an object's prototype, and <tt>super()</tt>
|
|
|
|
|
is converted into a call against the immediate ancestor's method of the same name.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="FunctionName">String::dasherize</span><span class="Keyword">:</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Variable">this</span>.replace(<span class="String"><span class="String">/</span>_<span class="String">/</span>g</span>, <span class="String"><span class="String">"</span>-<span class="String">"</span></span>)
|
|
|
|
|
<div class='code'><pre class="idle">String<span class="Keyword">:</span><span class="Keyword">:</span>dasherize <span class="Keyword">=</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Variable">this</span>.replace <span class="String"><span class="String">/</span>_<span class="String">/</span>g</span>, <span class="String"><span class="String">"</span>-<span class="String">"</span></span>
|
|
|
|
|
</pre><pre class="idle"><span class="LibraryClassType">String</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">dasherize</span> = <span class="Storage">function</span>() {
|
|
|
|
|
<span class="Keyword">return</span> <span class="Variable">this</span>.<span class="LibraryFunction">replace</span>(<span class="String"><span class="String">/</span>_<span class="String">/</span>g</span>, <span class="String"><span class="String">"</span>-<span class="String">"</span></span>);
|
|
|
|
|
};
|
|
|
|
|
</pre><button onclick='javascript: String.prototype.dasherize = function() {
|
|
|
|
|
return this.replace(/_/g, "-");
|
|
|
|
|
};
|
|
|
|
|
;alert("one_two".dasherize());'>run: "one_two".dasherize()</button><br class='clear' /></div>
|
|
|
|
|
};;alert("one_two".dasherize());'>run: "one_two".dasherize()</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
Finally, you may assign Class-level (static) properties within a class
|
|
|
|
|
definition by using<br /><tt>@property: value</tt>
|
|
|
|
@ -1330,10 +1318,10 @@ tom.move();
|
|
|
|
|
on the right to the variables on the left. In the simplest case, it can be
|
|
|
|
|
used for parallel assignment:
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">theBait<span class="Keyword">:</span> <span class="Number">1000</span>
|
|
|
|
|
theSwitch<span class="Keyword">:</span> <span class="Number">0</span>
|
|
|
|
|
<div class='code'><pre class="idle">theBait <span class="Keyword">=</span> <span class="Number">1000</span>
|
|
|
|
|
theSwitch <span class="Keyword">=</span> <span class="Number">0</span>
|
|
|
|
|
|
|
|
|
|
<span class="Keyword">[</span>theBait, theSwitch<span class="Keyword">]:</span> [theSwitch, theBait]
|
|
|
|
|
[theBait, theSwitch] <span class="Keyword">=</span> [theSwitch, theBait]
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, theBait, theSwitch;
|
|
|
|
|
theBait <span class="Keyword">=</span> <span class="Number">1000</span>;
|
|
|
|
|
theSwitch <span class="Keyword">=</span> <span class="Number">0</span>;
|
|
|
|
@ -1345,17 +1333,16 @@ theBait = 1000;
|
|
|
|
|
theSwitch = 0;
|
|
|
|
|
_a = [theSwitch, theBait];
|
|
|
|
|
theBait = _a[0];
|
|
|
|
|
theSwitch = _a[1];
|
|
|
|
|
;alert(theBait);'>run: theBait</button><br class='clear' /></div>
|
|
|
|
|
theSwitch = _a[1];;alert(theBait);'>run: theBait</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
But it's also helpful for dealing with functions that return multiple
|
|
|
|
|
values.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="FunctionName">weatherReport</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">location</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<div class='code'><pre class="idle">weatherReport <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">location</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Comment"><span class="Comment">#</span> Make an Ajax request to fetch the weather...</span>
|
|
|
|
|
[location, <span class="Number">72</span>, <span class="String"><span class="String">"</span>Mostly Sunny<span class="String">"</span></span>]
|
|
|
|
|
|
|
|
|
|
<span class="Keyword">[</span>city, temp, forecast<span class="Keyword">]:</span> weatherReport <span class="String"><span class="String">"</span>Berkeley, CA<span class="String">"</span></span>
|
|
|
|
|
[city, temp, forecast] <span class="Keyword">=</span> weatherReport <span class="String"><span class="String">"</span>Berkeley, CA<span class="String">"</span></span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, city, forecast, temp, weatherReport;
|
|
|
|
|
<span class="FunctionName">weatherReport</span> = <span class="Storage">function</span>(<span class="FunctionArgument">location</span>) {
|
|
|
|
|
<span class="Keyword">return</span> [location, <span class="Number">72</span>, <span class="String"><span class="String">"</span>Mostly Sunny<span class="String">"</span></span>];
|
|
|
|
@ -1371,25 +1358,22 @@ weatherReport = function(location) {
|
|
|
|
|
_a = weatherReport("Berkeley, CA");
|
|
|
|
|
city = _a[0];
|
|
|
|
|
temp = _a[1];
|
|
|
|
|
forecast = _a[2];
|
|
|
|
|
;alert(forecast);'>run: forecast</button><br class='clear' /></div>
|
|
|
|
|
forecast = _a[2];;alert(forecast);'>run: forecast</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
Pattern matching can be used with any depth of array and object nesting,
|
|
|
|
|
to help pull out deeply nested properties.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">futurists<span class="Keyword">:</span> {
|
|
|
|
|
<div class='code'><pre class="idle">futurists <span class="Keyword">=</span>
|
|
|
|
|
sculptor<span class="Keyword">:</span> <span class="String"><span class="String">"</span>Umberto Boccioni<span class="String">"</span></span>
|
|
|
|
|
painter<span class="Keyword">:</span> <span class="String"><span class="String">"</span>Vladimir Burliuk<span class="String">"</span></span>
|
|
|
|
|
poet<span class="Keyword">:</span> {
|
|
|
|
|
poet<span class="Keyword">:</span>
|
|
|
|
|
name<span class="Keyword">:</span> <span class="String"><span class="String">"</span>F.T. Marinetti<span class="String">"</span></span>
|
|
|
|
|
address<span class="Keyword">:</span> [
|
|
|
|
|
<span class="String"><span class="String">"</span>Via Roma 42R<span class="String">"</span></span>
|
|
|
|
|
<span class="String"><span class="String">"</span>Bellagio, Italy 22021<span class="String">"</span></span>
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{poet<span class="Keyword">:</span> {name, address<span class="Keyword">:</span> [street, city]}}<span class="Keyword">:</span> futurists
|
|
|
|
|
{poet<span class="Keyword">:</span> {name, address<span class="Keyword">:</span> [street, city]}} <span class="Keyword">=</span> futurists
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, city, futurists, name, street;
|
|
|
|
|
futurists <span class="Keyword">=</span> {
|
|
|
|
|
sculptor: <span class="String"><span class="String">"</span>Umberto Boccioni<span class="String">"</span></span>,
|
|
|
|
@ -1419,14 +1403,13 @@ _b = _a.poet;
|
|
|
|
|
name = _b.name;
|
|
|
|
|
_c = _b.address;
|
|
|
|
|
street = _c[0];
|
|
|
|
|
city = _c[1];
|
|
|
|
|
;alert(name + " — " + street);'>run: name + " — " + street</button><br class='clear' /></div>
|
|
|
|
|
city = _c[1];;alert(name + " — " + street);'>run: name + " — " + street</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
Pattern matching can even be combined with splats.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">tag<span class="Keyword">:</span> <span class="String"><span class="String">"</span><impossible><span class="String">"</span></span>
|
|
|
|
|
<div class='code'><pre class="idle">tag <span class="Keyword">=</span> <span class="String"><span class="String">"</span><impossible><span class="String">"</span></span>
|
|
|
|
|
|
|
|
|
|
<span class="Keyword">[</span>open, contents..., close<span class="Keyword">]:</span> tag.split(<span class="String"><span class="String">"</span><span class="String">"</span></span>)
|
|
|
|
|
[open, contents..., close] <span class="Keyword">=</span> tag.split(<span class="String"><span class="String">"</span><span class="String">"</span></span>)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1444,8 +1427,7 @@ tag = "<impossible>";
|
|
|
|
|
_a = tag.split("");
|
|
|
|
|
open = _a[0];
|
|
|
|
|
contents = __slice.call(_a, 1, _a.length - 1);
|
|
|
|
|
close = _a[_a.length - 1];
|
|
|
|
|
;alert(contents.join(""));'>run: contents.join("")</button><br class='clear' /></div>
|
|
|
|
|
close = _a[_a.length - 1];;alert(contents.join(""));'>run: contents.join("")</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<span id="fat_arrow" class="bookmark"></span>
|
|
|
|
@ -1465,24 +1447,22 @@ close = _a[_a.length - 1];
|
|
|
|
|
to use with <tt>bind</tt>. Functions created with the fat arrow are able to access
|
|
|
|
|
properties of the <tt>this</tt> where they're defined.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle"><span class="FunctionName">Account</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">customer, cart</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Variable">@customer</span><span class="Keyword">:</span> customer
|
|
|
|
|
<span class="Variable">@cart</span><span class="Keyword">:</span> cart
|
|
|
|
|
<div class='code'><pre class="idle">Account <span class="Keyword">=</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">customer, cart</span><span class="FunctionArgument">)</span> <span class="Storage">-></span>
|
|
|
|
|
<span class="Variable">@customer</span> <span class="Keyword">=</span> customer
|
|
|
|
|
<span class="Variable">@cart</span> <span class="Keyword">=</span> cart
|
|
|
|
|
|
|
|
|
|
$(<span class="String"><span class="String">'</span>.shopping_cart<span class="String">'</span></span>).bind <span class="String"><span class="String">'</span>click<span class="String">'</span></span>, <span class="FunctionArgument">(</span><span class="FunctionArgument">event</span><span class="FunctionArgument">)</span> <span class="Storage">=></span>
|
|
|
|
|
<span class="Variable">@customer</span>.purchase <span class="Variable">@cart</span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> Account;
|
|
|
|
|
<span class="Storage">var</span> <span class="FunctionName">__bind</span> = <span class="Storage">function</span>(<span class="FunctionArgument">func, context</span>) {
|
|
|
|
|
<span class="Keyword">return</span> <span class="Storage">function</span>(){ <span class="Keyword">return</span> func.<span class="LibraryFunction">apply</span>(context, arguments); };
|
|
|
|
|
};
|
|
|
|
|
<span class="FunctionName">Account</span> = <span class="Storage">function</span>(<span class="FunctionArgument">customer, cart</span>) {
|
|
|
|
|
<span class="Variable">this</span>.customer <span class="Keyword">=</span> customer;
|
|
|
|
|
<span class="Variable">this</span>.cart <span class="Keyword">=</span> cart;
|
|
|
|
|
<span class="Keyword">return</span> <span class="Keyword">$</span>(<span class="String"><span class="String">'</span>.shopping_cart<span class="String">'</span></span>).bind(<span class="String"><span class="String">'</span>click<span class="String">'</span></span>, (<span class="Storage">function</span>(__this) {
|
|
|
|
|
<span class="Storage">var</span> <span class="FunctionName">__func</span> = <span class="Storage">function</span>(<span class="FunctionArgument">event</span>) {
|
|
|
|
|
<span class="Keyword">return</span> <span class="Variable">this</span>.customer.purchase(<span class="Variable">this</span>.cart);
|
|
|
|
|
};
|
|
|
|
|
<span class="Keyword">return</span> (<span class="Storage">function</span>() {
|
|
|
|
|
<span class="Keyword">return</span> __func.<span class="LibraryFunction">apply</span>(__this, arguments);
|
|
|
|
|
});
|
|
|
|
|
})(<span class="Variable">this</span>));
|
|
|
|
|
<span class="Keyword">return</span> <span class="Keyword">$</span>(<span class="String"><span class="String">'</span>.shopping_cart<span class="String">'</span></span>).bind(<span class="String"><span class="String">'</span>click<span class="String">'</span></span>, __bind(<span class="Storage">function</span>(<span class="LibraryClassType">event</span>) {
|
|
|
|
|
<span class="Keyword">return</span> <span class="Variable">this</span>.customer.purchase(<span class="Variable">this</span>.cart);
|
|
|
|
|
}, <span class="Variable">this</span>));
|
|
|
|
|
};
|
|
|
|
|
</pre><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
@ -1498,20 +1478,19 @@ close = _a[_a.length - 1];
|
|
|
|
|
snippets of JavaScript within your CoffeeScript, you can
|
|
|
|
|
use backticks to pass it straight through.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">hi<span class="Keyword">:</span> <span class="String"><span class="String">`</span>function() {</span>
|
|
|
|
|
<div class='code'><pre class="idle">hi <span class="Keyword">=</span> <span class="String"><span class="String">`</span>function() {</span>
|
|
|
|
|
<span class="String"> return [document.title, "Hello JavaScript"].join(": ");</span>
|
|
|
|
|
<span class="String">}<span class="String">`</span></span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> hi;
|
|
|
|
|
<span class="FunctionName">hi</span> = <span class="Storage">function</span>() {
|
|
|
|
|
<span class="Keyword">return</span> [<span class="LibraryClassType">document</span>.<span class="LibraryConstant">title</span>, <span class="String"><span class="String">"</span>Hello JavaScript<span class="String">"</span></span>].<span class="LibraryFunction">join</span>(<span class="String"><span class="String">"</span>: <span class="String">"</span></span>);
|
|
|
|
|
<span class="Keyword">return</span> [<span class="LibraryClassType">document</span>.<span class="LibraryConstant">title</span>, <span class="String"><span class="String">"</span>Hello JavaScript<span class="String">"</span></span>].<span class="LibraryFunction">join</span>(<span class="String"><span class="String">"</span>: <span class="String">"</span></span>);
|
|
|
|
|
};
|
|
|
|
|
</pre><button onclick='javascript: var hi;
|
|
|
|
|
hi = function() {
|
|
|
|
|
return [document.title, "Hello JavaScript"].join(": ");
|
|
|
|
|
};
|
|
|
|
|
;alert(hi());'>run: hi()</button><br class='clear' /></div>
|
|
|
|
|
return [document.title, "Hello JavaScript"].join(": ");
|
|
|
|
|
};;alert(hi());'>run: hi()</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<span id="switch" class="bookmark"></span>
|
|
|
|
@ -1588,9 +1567,9 @@ return [document.title, "Hello JavaScript"].join(": ");
|
|
|
|
|
from Python — making it easy to test if a value falls within a
|
|
|
|
|
certain range.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">cholesterol<span class="Keyword">:</span> <span class="Number">127</span>
|
|
|
|
|
<div class='code'><pre class="idle">cholesterol <span class="Keyword">=</span> <span class="Number">127</span>
|
|
|
|
|
|
|
|
|
|
healthy<span class="Keyword">:</span> <span class="Number">200</span> <span class="Keyword">></span> cholesterol <span class="Keyword">></span> <span class="Number">60</span>
|
|
|
|
|
healthy <span class="Keyword">=</span> <span class="Number">200</span> <span class="Keyword">></span> cholesterol <span class="Keyword">></span> <span class="Number">60</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> cholesterol, healthy;
|
|
|
|
@ -1598,8 +1577,7 @@ cholesterol <span class="Keyword">=</span> <span class="Number">127</span>;
|
|
|
|
|
healthy <span class="Keyword">=</span> (<span class="Number">200</span> <span class="Keyword">></span> cholesterol) <span class="Keyword">&</span><span class="Keyword">&</span> (cholesterol <span class="Keyword">></span> <span class="Number">60</span>);
|
|
|
|
|
</pre><button onclick='javascript: var cholesterol, healthy;
|
|
|
|
|
cholesterol = 127;
|
|
|
|
|
healthy = (200 > cholesterol) && (cholesterol > 60);
|
|
|
|
|
;alert(healthy);'>run: healthy</button><br class='clear' /></div>
|
|
|
|
|
healthy = (200 > cholesterol) && (cholesterol > 60);;alert(healthy);'>run: healthy</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<span id="interpolation" class="bookmark"></span>
|
|
|
|
@ -1608,41 +1586,39 @@ healthy = (200 > cholesterol) && (cholesterol > 60);
|
|
|
|
|
is included in CoffeeScript. Simple variables can be included by marking
|
|
|
|
|
them with a dollar sign.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">author<span class="Keyword">:</span> <span class="String"><span class="String">"</span>Wittgenstein<span class="String">"</span></span>
|
|
|
|
|
quote<span class="Keyword">:</span> <span class="String"><span class="String">"</span>A picture is a fact. -- <span class="String"><span class="String">$</span>author</span><span class="String">"</span></span>
|
|
|
|
|
<div class='code'><pre class="idle">author <span class="Keyword">=</span> <span class="String"><span class="String">"</span>Wittgenstein<span class="String">"</span></span>
|
|
|
|
|
quote <span class="Keyword">=</span> <span class="String"><span class="String">"</span>A picture is a fact. -- #author<span class="String">"</span></span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> author, quote;
|
|
|
|
|
author <span class="Keyword">=</span> <span class="String"><span class="String">"</span>Wittgenstein<span class="String">"</span></span>;
|
|
|
|
|
quote <span class="Keyword">=</span> (<span class="String"><span class="String">"</span>A picture is a fact. -- <span class="String">"</span></span> <span class="Keyword">+</span> author);
|
|
|
|
|
</pre><button onclick='javascript: var author, quote;
|
|
|
|
|
author = "Wittgenstein";
|
|
|
|
|
quote = ("A picture is a fact. -- " + author);
|
|
|
|
|
;alert(quote);'>run: quote</button><br class='clear' /></div>
|
|
|
|
|
quote = ("A picture is a fact. -- " + author);;alert(quote);'>run: quote</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
And arbitrary expressions can be interpolated by using brackets <tt>${ ... }</tt><br />
|
|
|
|
|
Interpolation works the same way within regular expressions.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">sentence<span class="Keyword">:</span> <span class="String"><span class="String">"</span><span class="String"><span class="String">${</span> <span class="Number">22</span> <span class="Keyword">/</span> <span class="Number">7</span> <span class="String">}</span></span> is a decent approximation of π<span class="String">"</span></span>
|
|
|
|
|
<div class='code'><pre class="idle">sentence <span class="Keyword">=</span> <span class="String"><span class="String">"</span>#{ 22 / 7 } is a decent approximation of π<span class="String">"</span></span>
|
|
|
|
|
|
|
|
|
|
sep<span class="Keyword">:</span> <span class="String"><span class="String">"</span>[.<span class="UserDefinedConstant">\\</span>/<span class="UserDefinedConstant">\\</span>- ]<span class="String">"</span></span>
|
|
|
|
|
dates<span class="Keyword">:</span><span class="String"> <span class="String">/</span><span class="UserDefinedConstant">\d</span>+<span class="String"><span class="String">$</span>sep</span><span class="UserDefinedConstant">\d</span>+<span class="String"><span class="String">$</span>sep</span><span class="UserDefinedConstant">\d</span>+<span class="String">/</span>g</span>
|
|
|
|
|
sep <span class="Keyword">=</span> <span class="String"><span class="String">"</span>[.<span class="UserDefinedConstant">\\</span>/<span class="UserDefinedConstant">\\</span>- ]<span class="String">"</span></span>
|
|
|
|
|
dates <span class="Keyword">=</span><span class="String"> <span class="String">/</span><span class="UserDefinedConstant">\d</span>+<span class="String"><span class="String">$</span>sep</span><span class="UserDefinedConstant">\d</span>+<span class="String"><span class="String">$</span>sep</span><span class="UserDefinedConstant">\d</span>+<span class="String">/</span>g</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> dates, sentence, sep;
|
|
|
|
|
sentence <span class="Keyword">=</span> (<span class="String"><span class="String">"</span><span class="String">"</span></span> <span class="Keyword">+</span> (<span class="Number">22</span> / <span class="Number">7</span>) <span class="Keyword">+</span> <span class="String"><span class="String">"</span> is a decent approximation of π<span class="String">"</span></span>);
|
|
|
|
|
sep <span class="Keyword">=</span> <span class="String"><span class="String">"</span>[.<span class="UserDefinedConstant">\\</span>/<span class="UserDefinedConstant">\\</span>- ]<span class="String">"</span></span>;
|
|
|
|
|
dates <span class="Keyword">=</span> (<span class="Keyword">new</span> <span class="TypeName">RegExp</span>((<span class="String"><span class="String">"</span><span class="UserDefinedConstant">\\</span>d+<span class="String">"</span></span> <span class="Keyword">+</span> sep <span class="Keyword">+</span> <span class="String"><span class="String">"</span><span class="UserDefinedConstant">\\</span>d+<span class="String">"</span></span> <span class="Keyword">+</span> sep <span class="Keyword">+</span> <span class="String"><span class="String">"</span><span class="UserDefinedConstant">\\</span>d+<span class="String">"</span></span>), <span class="String"><span class="String">"</span>g<span class="String">"</span></span>));
|
|
|
|
|
dates <span class="Keyword">=</span><span class="String"> <span class="String">/</span><span class="UserDefinedConstant">\d</span>+$sep<span class="UserDefinedConstant">\d</span>+$sep<span class="UserDefinedConstant">\d</span>+<span class="String">/</span>g</span>;
|
|
|
|
|
</pre><button onclick='javascript: var dates, sentence, sep;
|
|
|
|
|
sentence = ("" + (22 / 7) + " is a decent approximation of π");
|
|
|
|
|
sep = "[.\\/\\- ]";
|
|
|
|
|
dates = (new RegExp(("\\d+" + sep + "\\d+" + sep + "\\d+"), "g"));
|
|
|
|
|
;alert(sentence);'>run: sentence</button><br class='clear' /></div>
|
|
|
|
|
dates = /\d+$sep\d+$sep\d+/g;;alert(sentence);'>run: sentence</button><br class='clear' /></div>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<span id="heredocs" class="bookmark"></span>
|
|
|
|
|
<b class="header">Multiline Strings, Heredocs, and Block Comments</b>
|
|
|
|
|
Multiline strings are allowed in CoffeeScript.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">mobyDick<span class="Keyword">:</span> <span class="String"><span class="String">"</span>Call me Ishmael. Some years ago --</span>
|
|
|
|
|
<div class='code'><pre class="idle">mobyDick <span class="Keyword">=</span> <span class="String"><span class="String">"</span>Call me Ishmael. Some years ago --</span>
|
|
|
|
|
<span class="String">never mind how long precisely -- having little</span>
|
|
|
|
|
<span class="String">or no money in my purse, and nothing particular</span>
|
|
|
|
|
<span class="String">to interest me on shore, I thought I would sail</span>
|
|
|
|
@ -1663,19 +1639,18 @@ never mind how long precisely -- having little \
|
|
|
|
|
or no money in my purse, and nothing particular \
|
|
|
|
|
to interest me on shore, I thought I would sail \
|
|
|
|
|
about a little and see the watery part of the \
|
|
|
|
|
world...";
|
|
|
|
|
;alert(mobyDick);'>run: mobyDick</button><br class='clear' /></div>
|
|
|
|
|
world...";;alert(mobyDick);'>run: mobyDick</button><br class='clear' /></div>
|
|
|
|
|
<p>
|
|
|
|
|
Heredocs can be used to hold formatted or indentation-sensitive text
|
|
|
|
|
(or, if you just don't feel like escaping quotes and apostrophes). The
|
|
|
|
|
indentation level that begins the heredoc is maintained throughout, so
|
|
|
|
|
you can keep it all aligned with the body of your code.
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">html<span class="Keyword">:</span> <span class="String"><span class="String">'''</span></span>
|
|
|
|
|
<span class="String"> <strong></span>
|
|
|
|
|
<span class="String"> cup of coffeescript</span>
|
|
|
|
|
<span class="String"> </strong></span>
|
|
|
|
|
<span class="String"> <span class="String">'''</span></span>
|
|
|
|
|
<div class='code'><pre class="idle">html <span class="Keyword">=</span> <span class="String"><span class="String">'''</span></span>
|
|
|
|
|
<span class="String"> <strong></span>
|
|
|
|
|
<span class="String"> cup of coffeescript</span>
|
|
|
|
|
<span class="String"> </strong></span>
|
|
|
|
|
<span class="String"> <span class="String">'''</span></span>
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> html;
|
|
|
|
|
html <span class="Keyword">=</span> <span class="String"><span class="String">'</span><strong><span class="UserDefinedConstant">\n</span> cup of coffeescript<span class="UserDefinedConstant">\n</span></strong><span class="String">'</span></span>;
|
|
|
|
|
</pre><br class='clear' /></div>
|
|
|
|
@ -1721,15 +1696,15 @@ html <span class="Keyword">=</span> <span class="String"><span class="String">'<
|
|
|
|
|
be made available in the <tt>options</tt> object. Here's a task that uses
|
|
|
|
|
the Node.js API to rebuild CoffeeScript's parser:
|
|
|
|
|
</p>
|
|
|
|
|
<div class='code'><pre class="idle">fs<span class="Keyword">:</span> require <span class="String"><span class="String">'</span>fs<span class="String">'</span></span>
|
|
|
|
|
<div class='code'><pre class="idle">fs <span class="Keyword">=</span> require <span class="String"><span class="String">'</span>fs<span class="String">'</span></span>
|
|
|
|
|
|
|
|
|
|
option <span class="String"><span class="String">'</span>-o<span class="String">'</span></span>, <span class="String"><span class="String">'</span>--output [DIR]<span class="String">'</span></span>, <span class="String"><span class="String">'</span>directory for compiled code<span class="String">'</span></span>
|
|
|
|
|
|
|
|
|
|
task <span class="String"><span class="String">'</span>build:parser<span class="String">'</span></span>, <span class="String"><span class="String">'</span>rebuild the Jison parser<span class="String">'</span></span>, <span class="Storage">-></span>
|
|
|
|
|
require <span class="String"><span class="String">'</span>jison<span class="String">'</span></span>
|
|
|
|
|
code<span class="Keyword">:</span> require(<span class="String"><span class="String">'</span>./lib/grammar<span class="String">'</span></span>).parser.generate()
|
|
|
|
|
dir<span class="Keyword">:</span> options.output <span class="Keyword">or</span> <span class="String"><span class="String">'</span>lib<span class="String">'</span></span>
|
|
|
|
|
fs.writeFile <span class="String"><span class="String">"</span><span class="String"><span class="String">$</span>dir</span>/parser.js<span class="String">"</span></span>, code
|
|
|
|
|
code <span class="Keyword">=</span> require(<span class="String"><span class="String">'</span>./lib/grammar<span class="String">'</span></span>).parser.generate()
|
|
|
|
|
dir <span class="Keyword">=</span> options.output <span class="Keyword">or</span> <span class="String"><span class="String">'</span>lib<span class="String">'</span></span>
|
|
|
|
|
fs.writeFile <span class="String"><span class="String">"</span>#dir/parser.js<span class="String">"</span></span>, code
|
|
|
|
|
</pre><pre class="idle"><span class="Storage">var</span> fs;
|
|
|
|
|
fs <span class="Keyword">=</span> require(<span class="String"><span class="String">'</span>fs<span class="String">'</span></span>);
|
|
|
|
|
option(<span class="String"><span class="String">'</span>-o<span class="String">'</span></span>, <span class="String"><span class="String">'</span>--output [DIR]<span class="String">'</span></span>, <span class="String"><span class="String">'</span>directory for compiled code<span class="String">'</span></span>);
|
|
|
|
|