CoffeeScript 0.5.5, with string interpolation and internal documentation

This commit is contained in:
Jeremy Ashkenas 2010-03-08 06:34:07 -05:00
parent 90f2e0dbb9
commit bcf7b3f95b
13 changed files with 227 additions and 109 deletions

View File

@ -28,6 +28,13 @@ task 'build', 'build the CoffeeScript language from source', ->
run ['-c', '-o', 'lib'].concat(files) run ['-c', '-o', 'lib'].concat(files)
task 'build:full', 'checkout /lib, rebuild the source twice, and run the tests', ->
exec 'git co lib && bin/cake build && bin/cake build && bin/cake test', (err, stdout, stderr) ->
print stdout if stdout
print stderr if stderr
throw err if err
task 'build:parser', 'rebuild the Jison parser (run build first)', -> task 'build:parser', 'rebuild the Jison parser (run build first)', ->
require.paths.unshift 'vendor/jison/lib' require.paths.unshift 'vendor/jison/lib'
parser: require('grammar').parser parser: require('grammar').parser

View File

@ -0,0 +1,2 @@
author: "Wittgenstein"
quote: "A picture is a fact. -- $author"

View File

@ -0,0 +1,4 @@
sentence: "${ 22 / 7 } is a decent approximation of π"

View File

@ -124,7 +124,7 @@ div.code {
#error { #error {
position: absolute; position: absolute;
-webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px;
right: 15px; top: 15px; left: 565px; right: 15px; top: 15px; left: 722px;
height: 15px; height: 15px;
padding: 2px 5px; padding: 2px 5px;
background: #fdcdcc; background: #fdcdcc;
@ -142,14 +142,14 @@ div.code {
float: left; float: left;
padding: 0 20px; padding: 0 20px;
border: 1px solid #bbb; border: 1px solid #bbb;
border-top: 0; border-bottom: 0; border-top: 0; border-bottom: 0; border-left-width: 0;
cursor: pointer; cursor: pointer;
} }
body.full_screen .navigation { body.full_screen .navigation {
position: static; position: static;
} }
.navigation.try { .navigation.toc {
border-left: 0; border-left-width: 1px;
} }
.navigation:hover, .navigation:hover,
.navigation.active { .navigation.active {
@ -206,7 +206,7 @@ div.code {
} }
.navigation .contents a { .navigation .contents a {
display: block; display: block;
width: 300px; width: 290px;
text-transform: none; text-transform: none;
text-decoration: none; text-decoration: none;
font-weight: normal; font-weight: normal;

View File

@ -12,7 +12,7 @@ execute all scripts present in <code>text/coffeescript</code> tags.</p>
<span class="k">else</span> <span class="k">else</span>
<span class="nv">lexer: </span><span class="k">new</span> <span class="nx">Lexer</span><span class="p">()</span> <span class="nv">lexer: </span><span class="k">new</span> <span class="nx">Lexer</span><span class="p">()</span>
<span class="nv">parser: </span><span class="nx">exports</span><span class="p">.</span><span class="nx">parser</span> <span class="nv">parser: </span><span class="nx">exports</span><span class="p">.</span><span class="nx">parser</span>
<span class="k">this</span><span class="p">.</span><span class="nv">exports: </span><span class="k">this</span><span class="p">.</span><span class="nv">CoffeeScript: </span><span class="p">{}</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-3">#</a> </div> <p>The current CoffeeScript version number.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.VERSION: </span><span class="s1">&#39;0.5.4&#39;</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison <span class="k">this</span><span class="p">.</span><span class="nv">exports: </span><span class="k">this</span><span class="p">.</span><span class="nv">CoffeeScript: </span><span class="p">{}</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-3">#</a> </div> <p>The current CoffeeScript version number.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.VERSION: </span><span class="s1">&#39;0.5.5&#39;</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison
compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.compile: </span><span class="p">(</span><span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span> compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.compile: </span><span class="p">(</span><span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">try</span> <span class="k">try</span>
<span class="p">(</span><span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">code</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">options</span> <span class="p">(</span><span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">code</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">options</span>

View File

@ -30,7 +30,7 @@
<div id="flybar"> <div id="flybar">
<a id="logo" href="#top"> </a> <a id="logo" href="#top"> </a>
<div class="navigation"> <div class="navigation toc">
<div class="button"> <div class="button">
Table of Contents Table of Contents
</div> </div>
@ -60,6 +60,7 @@
<a href="#try">Try/Catch/Finally</a> <a href="#try">Try/Catch/Finally</a>
<a href="#comparisons">Chained Comparisons</a> <a href="#comparisons">Chained Comparisons</a>
<a href="#strings">Multiline Strings and Heredocs</a> <a href="#strings">Multiline Strings and Heredocs</a>
<a href="#interpolation">String Interpolation</a>
<a href="#cake">Cake, and Cakefiles</a> <a href="#cake">Cake, and Cakefiles</a>
<a href="#scripts">"text/coffeescript" Script Tags</a> <a href="#scripts">"text/coffeescript" Script Tags</a>
<a href="#resources">Resources</a> <a href="#resources">Resources</a>
@ -84,6 +85,23 @@ alert reverse '!tpircseeffoC'</textarea></div>
</div> </div>
</div> </div>
</div> </div>
<div class="navigation annotated">
<div class="button">
Annotated Source
</div>
<div class="contents">
<a href="documentation/docs/grammar.html">The Grammar &mdash; src/grammar</a>
<a href="documentation/docs/lexer.html">The Lexer &mdash; src/lexer</a>
<a href="documentation/docs/rewriter.html">The Rewriter &mdash; src/rewriter</a>
<a href="documentation/docs/nodes.html">The Syntax Tree &mdash; src/nodes</a>
<a href="documentation/docs/scope.html">Lexical Scope &mdash; src/scope</a>
<a href="documentation/docs/coffee-script.html">The CoffeeScript Module &mdash; src/coffee-script</a>
<a href="documentation/docs/cake.html">Cake &amp; Cakefiles &mdash; src/cake</a>
<a href="documentation/docs/command.html">"coffee" Command-Line Utility &mdash; src/command</a>
<a href="documentation/docs/optparse.html">Option Parsing &mdash; src/optparse</a>
<a href="documentation/docs/repl.html">Interactive REPL &mdash; src/repl</a>
</div>
</div>
<div id="error" style="display:none;"></div> <div id="error" style="display:none;"></div>
</div> </div>
@ -111,7 +129,7 @@ alert reverse '!tpircseeffoC'</textarea></div>
<p> <p>
<b>Latest Version:</b> <b>Latest Version:</b>
<a href="http://github.com/jashkenas/coffee-script/tarball/0.5.4">0.5.4</a> <a href="http://github.com/jashkenas/coffee-script/tarball/0.5.5">0.5.5</a>
</p> </p>
<h2> <h2>
@ -153,11 +171,11 @@ alert reverse '!tpircseeffoC'</textarea></div>
<p> <p>
To install, first make sure you have a working version of To install, first make sure you have a working version of
<a href="http://nodejs.org/">Node.js</a> version 0.1.31 or higher. <a href="http://nodejs.org/">Node.js</a> version 0.1.31 or higher.
Then clone the CoffeeScript Then clone the CoffeeScript
<a href="http://github.com/jashkenas/coffee-script">source repository</a> <a href="http://github.com/jashkenas/coffee-script">source repository</a>
from GitHub, or download the latest from GitHub, or download the latest
release: <a href="http://github.com/jashkenas/coffee-script/tarball/0.5.4">0.5.4</a>. release: <a href="http://github.com/jashkenas/coffee-script/tarball/0.5.5">0.5.5</a>.
To install the CoffeeScript compiler system-wide To install the CoffeeScript compiler system-wide
under <tt>/usr/local</tt>, open the directory and run: under <tt>/usr/local</tt>, open the directory and run:
</p> </p>
@ -185,8 +203,8 @@ sudo bin/cake install</pre>
<tr> <tr>
<td width="25%"><code>-i, --interactive</code></td> <td width="25%"><code>-i, --interactive</code></td>
<td> <td>
Launch an interactive CoffeeScript session to try short snippets. Launch an interactive CoffeeScript session to try short snippets.
More pleasant if wrapped with More pleasant if wrapped with
<a href="http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap.html">rlwrap</a>. <a href="http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap.html">rlwrap</a>.
</td> </td>
</tr> </tr>
@ -654,7 +672,7 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
In JavaScript, the <tt>this</tt> keyword is dynamically scoped to mean the In JavaScript, the <tt>this</tt> keyword is dynamically scoped to mean the
object that the current function is attached to. If you pass a function as object that the current function is attached to. If you pass a function as
as callback, or attach it to a different object, the original value of <tt>this</tt> as callback, or attach it to a different object, the original value of <tt>this</tt>
will be lost. If you're not familiar with this behavior, will be lost. If you're not familiar with this behavior,
<a href="http://www.digital-web.com/articles/scope_in_javascript/">this Digital Web article</a> <a href="http://www.digital-web.com/articles/scope_in_javascript/">this Digital Web article</a>
gives a good overview of the quirks. gives a good overview of the quirks.
</p> </p>
@ -669,8 +687,8 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
<%= code_for('fat_arrow') %> <%= code_for('fat_arrow') %>
<p> <p>
If we had used <tt>-></tt> in the callback above, <tt>@customer</tt> would If we had used <tt>-></tt> in the callback above, <tt>@customer</tt> would
have referred to the undefined "customer" property of the DOM element, have referred to the undefined "customer" property of the DOM element,
and trying to call <tt>purchase()</tt> on it would have raised an exception. and trying to call <tt>purchase()</tt> on it would have raised an exception.
</p> </p>
<p> <p>
@ -732,6 +750,19 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
</p> </p>
<%= code_for('heredocs') %> <%= code_for('heredocs') %>
<p>
<span id="interpolation" class="bookmark"></span>
<b class="header">String Interpolation</b>
A version of <a href="http://wiki.ecmascript.org/doku.php?id=strawman:string_interpolation">ECMAScript Harmony's proposed string interpolation</a>
is included in CoffeeScript. Simple variables can be included by marking
them with a dollar sign.
</p>
<%= code_for('interpolation', 'quote') %>
<p>
And arbitrary expressions can be interpolated by using brackets <tt>${ ... }</tt>
</p>
<%= code_for('interpolation_expression', 'sentence') %>
<h2> <h2>
<span id="cake" class="bookmark"></span> <span id="cake" class="bookmark"></span>
Cake, and Cakefiles Cake, and Cakefiles
@ -794,9 +825,9 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
<tt>bin/cake build</tt> to rebuild the CoffeeScript compiler, and <br /> <tt>bin/cake build</tt> to rebuild the CoffeeScript compiler, and <br />
<tt>bin/cake build:parser</tt> to regenerate the Jison parser if you're <tt>bin/cake build:parser</tt> to regenerate the Jison parser if you're
working on the grammar. <br /><br /> working on the grammar. <br /><br />
<tt>git checkout lib &amp;&amp; bin/cake build &amp;&amp; bin/cake build &amp;&amp; bin/cake test</tt> <tt>bin/cake build:full</tt> is a good command to run when you're working
is a good command to run when you're working on the core language. It'll refresh the lib directory on the core language. It'll refresh the lib directory
(in case you broke something), build your altered compiler, use that to (in case you broke something), build your altered compiler, use that to
rebuild itself (a good sanity test) and then run all of the tests. If rebuild itself (a good sanity test) and then run all of the tests. If
they pass, there's a good chance you've made a successful change. they pass, there's a good chance you've made a successful change.
</li> </li>
@ -812,12 +843,12 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
<li> <li>
<b>defunkt</b>'s <a href="http://github.com/defunkt/coffee-mode">CoffeeScript Major Mode</a> <b>defunkt</b>'s <a href="http://github.com/defunkt/coffee-mode">CoffeeScript Major Mode</a>
&mdash; a Emacs major mode that provides syntax highlighting, indentation &mdash; a Emacs major mode that provides syntax highlighting, indentation
support, and some bonus commands. (For Vim and TextMate highlighters, support, and some bonus commands. (For Vim and TextMate highlighters,
see the <tt>extras</tt> directory of the main repository.) see the <tt>extras</tt> directory of the main repository.)
</li> </li>
<li> <li>
<b>mattly</b>'s <a href="http://github.com/mattly/rack-coffee">rack-coffee</a> <b>mattly</b>'s <a href="http://github.com/mattly/rack-coffee">rack-coffee</a>
&mdash; a small Rack middleware for serving CoffeeScript files as &mdash; a small Rack middleware for serving CoffeeScript files as
compiled JavaScript on the fly. compiled JavaScript on the fly.
</li> </li>
</ul> </ul>
@ -826,17 +857,26 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
<span id="change_log" class="bookmark"></span> <span id="change_log" class="bookmark"></span>
Change Log Change Log
</h2> </h2>
<p>
<b class="header" style="margin-top: 20px;">0.5.5</b>
String interpolation, contributed by
<a href="http://github.com/StanAngeloff">Stan Angeloff</a>.
Since <tt>--run</tt> has been the default since <b>0.5.3</b>, updating
<tt>--stdio</tt> and <tt>--eval</tt> to run by default, pass <tt>--compile</tt>
as well if you'd like to print the result.
</p>
<p> <p>
<b class="header" style="margin-top: 20px;">0.5.4</b> <b class="header" style="margin-top: 20px;">0.5.4</b>
Bugfix that corrects the Node.js global constants <tt>__filename</tt> and Bugfix that corrects the Node.js global constants <tt>__filename</tt> and
<tt>__dirname</tt>. Tweaks for more flexible parsing of nested function <tt>__dirname</tt>. Tweaks for more flexible parsing of nested function
literals and improperly-indented comments. Updates for the latest Node.js API. literals and improperly-indented comments. Updates for the latest Node.js API.
</p> </p>
<p> <p>
<b class="header" style="margin-top: 20px;">0.5.3</b> <b class="header" style="margin-top: 20px;">0.5.3</b>
CoffeeScript now has a syntax for defining classes. Many of the core CoffeeScript now has a syntax for defining classes. Many of the core
components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them. components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them.
Cakefiles can use <tt>optparse.coffee</tt> to define options for tasks. Cakefiles can use <tt>optparse.coffee</tt> to define options for tasks.
<tt>--run</tt> is now the default flag for the <tt>coffee</tt> command, <tt>--run</tt> is now the default flag for the <tt>coffee</tt> command,

View File

@ -0,0 +1,5 @@
(function(){
var author, quote;
author = "Wittgenstein";
quote = "A picture is a fact. -- " + author;
})();

View File

@ -0,0 +1,4 @@
(function(){
var sentence;
sentence = (22 / 7) + " is a decent approximation of π";
})();

File diff suppressed because one or more lines are too long

View File

@ -16,7 +16,7 @@
<div id="flybar"> <div id="flybar">
<a id="logo" href="#top"> </a> <a id="logo" href="#top"> </a>
<div class="navigation"> <div class="navigation toc">
<div class="button"> <div class="button">
Table of Contents Table of Contents
</div> </div>
@ -46,6 +46,7 @@
<a href="#try">Try/Catch/Finally</a> <a href="#try">Try/Catch/Finally</a>
<a href="#comparisons">Chained Comparisons</a> <a href="#comparisons">Chained Comparisons</a>
<a href="#strings">Multiline Strings and Heredocs</a> <a href="#strings">Multiline Strings and Heredocs</a>
<a href="#interpolation">String Interpolation</a>
<a href="#cake">Cake, and Cakefiles</a> <a href="#cake">Cake, and Cakefiles</a>
<a href="#scripts">"text/coffeescript" Script Tags</a> <a href="#scripts">"text/coffeescript" Script Tags</a>
<a href="#resources">Resources</a> <a href="#resources">Resources</a>
@ -70,6 +71,23 @@ alert reverse '!tpircseeffoC'</textarea></div>
</div> </div>
</div> </div>
</div> </div>
<div class="navigation annotated">
<div class="button">
Annotated Source
</div>
<div class="contents">
<a href="documentation/docs/grammar.html">The Grammar &mdash; src/grammar</a>
<a href="documentation/docs/lexer.html">The Lexer &mdash; src/lexer</a>
<a href="documentation/docs/rewriter.html">The Rewriter &mdash; src/rewriter</a>
<a href="documentation/docs/nodes.html">The Syntax Tree &mdash; src/nodes</a>
<a href="documentation/docs/scope.html">Lexical Scope &mdash; src/scope</a>
<a href="documentation/docs/coffee-script.html">The CoffeeScript Module &mdash; src/coffee-script</a>
<a href="documentation/docs/cake.html">Cake &amp; Cakefiles &mdash; src/cake</a>
<a href="documentation/docs/command.html">"coffee" Command-Line Utility &mdash; src/command</a>
<a href="documentation/docs/optparse.html">Option Parsing &mdash; src/optparse</a>
<a href="documentation/docs/repl.html">Interactive REPL &mdash; src/repl</a>
</div>
</div>
<div id="error" style="display:none;"></div> <div id="error" style="display:none;"></div>
</div> </div>
@ -97,7 +115,7 @@ alert reverse '!tpircseeffoC'</textarea></div>
<p> <p>
<b>Latest Version:</b> <b>Latest Version:</b>
<a href="http://github.com/jashkenas/coffee-script/tarball/0.5.4">0.5.4</a> <a href="http://github.com/jashkenas/coffee-script/tarball/0.5.5">0.5.5</a>
</p> </p>
<h2> <h2>
@ -108,22 +126,22 @@ alert reverse '!tpircseeffoC'</textarea></div>
<p><i>CoffeeScript on the left, compiled JavaScript output on the right.</i></p> <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> <div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> Assignment:</span>
<span class="FunctionName">number</span><span class="Keyword">:</span> <span class="Number">42</span> number<span class="Keyword">:</span> <span class="Number">42</span>
<span class="FunctionName">opposite_day</span><span class="Keyword">:</span> <span class="BuiltInConstant">true</span> opposite_day<span class="Keyword">:</span> <span class="BuiltInConstant">true</span>
<span class="Comment"><span class="Comment">#</span> Conditions:</span> <span class="Comment"><span class="Comment">#</span> Conditions:</span>
<span class="FunctionName">number</span><span class="Keyword">:</span> <span class="Keyword">-</span><span class="Number">42</span> <span class="Keyword">if</span> opposite_day number<span class="Keyword">:</span> <span class="Keyword">-</span><span class="Number">42</span> <span class="Keyword">if</span> opposite_day
<span class="Comment"><span class="Comment">#</span> Functions:</span> <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">-&gt;</span> x <span class="Keyword">*</span> x <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">-&gt;</span> x <span class="Keyword">*</span> x
<span class="Comment"><span class="Comment">#</span> Arrays:</span> <span class="Comment"><span class="Comment">#</span> Arrays:</span>
<span class="FunctionName">list</span><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> <span class="Comment"><span class="Comment">#</span> Objects:</span>
<span class="FunctionName">math</span><span class="Keyword">:</span> { math<span class="Keyword">:</span> {
<span class="FunctionName">root</span><span class="Keyword">:</span> Math.sqrt root<span class="Keyword">:</span> Math.sqrt
<span class="FunctionName">square</span><span class="Keyword">:</span> square 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">-&gt;</span> x <span class="Keyword">*</span> square 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">-&gt;</span> x <span class="Keyword">*</span> square x
} }
@ -135,7 +153,7 @@ alert reverse '!tpircseeffoC'</textarea></div>
alert <span class="String"><span class="String">&quot;</span>I knew it!<span class="String">&quot;</span></span> <span class="Keyword">if</span> elvis<span class="Keyword">?</span> alert <span class="String"><span class="String">&quot;</span>I knew it!<span class="String">&quot;</span></span> <span class="Keyword">if</span> elvis<span class="Keyword">?</span>
<span class="Comment"><span class="Comment">#</span> Array comprehensions:</span> <span class="Comment"><span class="Comment">#</span> Array comprehensions:</span>
<span class="FunctionName">cubed_list</span><span class="Keyword">:</span> math.cube num <span class="Keyword">for</span> num <span class="Keyword">in</span> list cubed_list<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, cubed_list, list, math, num, number, opposite_day, race, square; </pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, _d, cubed_list, list, math, num, number, opposite_day, race, square;
<span class="Comment"><span class="Comment">//</span> Assignment:</span> <span class="Comment"><span class="Comment">//</span> Assignment:</span>
number <span class="Keyword">=</span> <span class="Number">42</span>; number <span class="Keyword">=</span> <span class="Number">42</span>;
@ -250,11 +268,11 @@ cubed_list = (function() {
<p> <p>
To install, first make sure you have a working version of To install, first make sure you have a working version of
<a href="http://nodejs.org/">Node.js</a> version 0.1.31 or higher. <a href="http://nodejs.org/">Node.js</a> version 0.1.31 or higher.
Then clone the CoffeeScript Then clone the CoffeeScript
<a href="http://github.com/jashkenas/coffee-script">source repository</a> <a href="http://github.com/jashkenas/coffee-script">source repository</a>
from GitHub, or download the latest from GitHub, or download the latest
release: <a href="http://github.com/jashkenas/coffee-script/tarball/0.5.4">0.5.4</a>. release: <a href="http://github.com/jashkenas/coffee-script/tarball/0.5.5">0.5.5</a>.
To install the CoffeeScript compiler system-wide To install the CoffeeScript compiler system-wide
under <tt>/usr/local</tt>, open the directory and run: under <tt>/usr/local</tt>, open the directory and run:
</p> </p>
@ -282,8 +300,8 @@ sudo bin/cake install</pre>
<tr> <tr>
<td width="25%"><code>-i, --interactive</code></td> <td width="25%"><code>-i, --interactive</code></td>
<td> <td>
Launch an interactive CoffeeScript session to try short snippets. Launch an interactive CoffeeScript session to try short snippets.
More pleasant if wrapped with More pleasant if wrapped with
<a href="http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap.html">rlwrap</a>. <a href="http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap.html">rlwrap</a>.
</td> </td>
</tr> </tr>
@ -457,8 +475,8 @@ cube = function cube(x) {
mathy things. While colons are preferred, the two may be used interchangeably, mathy things. While colons are preferred, the two may be used interchangeably,
even within object literals. even within object literals.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">greeting</span><span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Hello CoffeeScript<span class="String">&quot;</span></span> <div class='code'><pre class="idle">greeting<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Hello CoffeeScript<span class="String">&quot;</span></span>
<span class="FunctionName">difficulty</span><span class="Keyword">:</span> <span class="Number">0.5</span> difficulty<span class="Keyword">:</span> <span class="Number">0.5</span>
</pre><pre class="idle"><span class="Storage">var</span> difficulty, greeting; </pre><pre class="idle"><span class="Storage">var</span> difficulty, greeting;
greeting <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>Hello CoffeeScript<span class="String">&quot;</span></span>; greeting <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>Hello CoffeeScript<span class="String">&quot;</span></span>;
difficulty <span class="Keyword">=</span> <span class="Number">0.5</span>; difficulty <span class="Keyword">=</span> <span class="Number">0.5</span>;
@ -480,15 +498,15 @@ difficulty = 0.5;
assigning local variables, and can be moved around freely. Feel free to mix assigning local variables, and can be moved around freely. Feel free to mix
and match the two styles. and match the two styles.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">song</span><span class="Keyword">:</span> [<span class="String"><span class="String">&quot;</span>do<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>re<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>mi<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>fa<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>so<span class="String">&quot;</span></span>] <div class='code'><pre class="idle">song<span class="Keyword">:</span> [<span class="String"><span class="String">&quot;</span>do<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>re<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>mi<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>fa<span class="String">&quot;</span></span>, <span class="String"><span class="String">&quot;</span>so<span class="String">&quot;</span></span>]
<span class="FunctionName">ages</span><span class="Keyword">:</span> { ages<span class="Keyword">:</span> {
<span class="FunctionName">max</span><span class="Keyword">:</span> <span class="Number">10</span> max<span class="Keyword">:</span> <span class="Number">10</span>
<span class="FunctionName">ida</span><span class="Keyword">:</span> <span class="Number">9</span> ida<span class="Keyword">:</span> <span class="Number">9</span>
<span class="FunctionName">tim</span><span class="Keyword">:</span> <span class="Number">11</span> tim<span class="Keyword">:</span> <span class="Number">11</span>
} }
<span class="FunctionName">matrix</span><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">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">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> <span class="Number">1</span>, <span class="Number">1</span>, <span class="Number">0</span>
@ -518,11 +536,11 @@ matrix = [1, 0, 1, 0, 0, 1, 1, 1, 0];
are properly declared within lexical scope &mdash; you never need to write are properly declared within lexical scope &mdash; you never need to write
<tt>var</tt> yourself. <tt>var</tt> yourself.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">num</span><span class="Keyword">:</span> <span class="Number">1</span> <div class='code'><pre class="idle">num<span class="Keyword">:</span> <span class="Number">1</span>
<span class="FunctionName">change_numbers</span><span class="Keyword">:</span> <span class="Storage">-&gt;</span> <span class="FunctionName">change_numbers</span><span class="Keyword">:</span> <span class="Storage">-&gt;</span>
<span class="FunctionName">new_num</span><span class="Keyword">:</span> <span class="Keyword">-</span><span class="Number">1</span> new_num<span class="Keyword">:</span> <span class="Keyword">-</span><span class="Number">1</span>
<span class="FunctionName">num</span><span class="Keyword">:</span> <span class="Number">10</span> num<span class="Keyword">:</span> <span class="Number">10</span>
<span class="FunctionName">new_num</span><span class="Keyword">:</span> change_numbers() new_num<span class="Keyword">:</span> change_numbers()
</pre><pre class="idle"><span class="Storage">var</span> change_numbers, new_num, num; </pre><pre class="idle"><span class="Storage">var</span> change_numbers, new_num, num;
num <span class="Keyword">=</span> <span class="Number">1</span>; num <span class="Keyword">=</span> <span class="Number">1</span>;
change_numbers <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">change_numbers</span>() { change_numbers <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">change_numbers</span>() {
@ -575,13 +593,13 @@ new_num = change_numbers();
CoffeeScript will compile <b>if</b> statements using the ternary operator CoffeeScript will compile <b>if</b> statements using the ternary operator
when possible, to make it easier to use the result as an expression. when possible, to make it easier to use the result as an expression.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">mood</span><span class="Keyword">:</span> greatly_improved <span class="Keyword">if</span> singing <div class='code'><pre class="idle">mood<span class="Keyword">:</span> greatly_improved <span class="Keyword">if</span> singing
<span class="Keyword">if</span> happy <span class="Keyword">and</span> knows_it <span class="Keyword">if</span> happy <span class="Keyword">and</span> knows_it
claps_hands() claps_hands()
cha_cha_cha() cha_cha_cha()
<span class="FunctionName">date</span><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
expensive <span class="Keyword">||</span><span class="Keyword">=</span> do_the_math() expensive <span class="Keyword">||</span><span class="Keyword">=</span> do_the_math()
</pre><pre class="idle"><span class="Storage">var</span> date, expensive, mood; </pre><pre class="idle"><span class="Storage">var</span> date, expensive, mood;
@ -636,7 +654,7 @@ expensive <span class="Keyword">=</span> expensive <span class="Keyword">||</spa
</p> </p>
<div class='code'><pre class="idle">launch() <span class="Keyword">if</span> ignition <span class="Keyword">is</span> <span class="BuiltInConstant">on</span> <div class='code'><pre class="idle">launch() <span class="Keyword">if</span> ignition <span class="Keyword">is</span> <span class="BuiltInConstant">on</span>
<span class="FunctionName">volume</span><span class="Keyword">:</span> <span class="Number">10</span> <span class="Keyword">if</span> band <span class="Keyword">isnt</span> spinal_tap volume<span class="Keyword">:</span> <span class="Number">10</span> <span class="Keyword">if</span> band <span class="Keyword">isnt</span> spinal_tap
let_the_wild_rumpus_begin() <span class="Keyword">unless</span> answer <span class="Keyword">is</span> <span class="BuiltInConstant">no</span> let_the_wild_rumpus_begin() <span class="Keyword">unless</span> answer <span class="Keyword">is</span> <span class="BuiltInConstant">no</span>
@ -665,14 +683,14 @@ car.speed <span class="Keyword">&lt;</span> speed_limit ? accelerate() : <span c
splats <tt>...</tt>, both for function definition as well as invocation, splats <tt>...</tt>, both for function definition as well as invocation,
making variable numbers of arguments a little bit more palatable. making variable numbers of arguments a little bit more palatable.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">gold</span><span class="Keyword">:</span> <span class="FunctionName">silver</span><span class="Keyword">:</span> <span class="FunctionName">the_field</span><span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>unknown<span class="String">&quot;</span></span> <div class='code'><pre class="idle">gold<span class="Keyword">:</span> silver<span class="Keyword">:</span> the_field<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>unknown<span class="String">&quot;</span></span>
<span class="FunctionName">award_medals</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">first, second, rest...</span><span class="FunctionArgument">)</span> <span class="Storage">-&gt;</span> <span class="FunctionName">award_medals</span><span class="Keyword">:</span> <span class="FunctionArgument">(</span><span class="FunctionArgument">first, second, rest...</span><span class="FunctionArgument">)</span> <span class="Storage">-&gt;</span>
<span class="FunctionName">gold</span><span class="Keyword">:</span> first gold<span class="Keyword">:</span> first
<span class="FunctionName">silver</span><span class="Keyword">:</span> second silver<span class="Keyword">:</span> second
<span class="FunctionName">the_field</span><span class="Keyword">:</span> rest the_field<span class="Keyword">:</span> rest
<span class="FunctionName">contenders</span><span class="Keyword">:</span> [ contenders<span class="Keyword">:</span> [
<span class="String"><span class="String">&quot;</span>Michael Phelps<span class="String">&quot;</span></span> <span class="String"><span class="String">&quot;</span>Michael Phelps<span class="String">&quot;</span></span>
<span class="String"><span class="String">&quot;</span>Liu Xiang<span class="String">&quot;</span></span> <span class="String"><span class="String">&quot;</span>Liu Xiang<span class="String">&quot;</span></span>
<span class="String"><span class="String">&quot;</span>Yao Ming<span class="String">&quot;</span></span> <span class="String"><span class="String">&quot;</span>Yao Ming<span class="String">&quot;</span></span>
@ -760,8 +778,8 @@ backwards("stairway", "to", "heaven");
<span class="Keyword">while</span> supply <span class="Keyword">&lt;</span> demand <span class="Keyword">then</span> sell() <span class="Keyword">while</span> supply <span class="Keyword">&lt;</span> demand <span class="Keyword">then</span> sell()
<span class="Comment"><span class="Comment">#</span> Nursery Rhyme</span> <span class="Comment"><span class="Comment">#</span> Nursery Rhyme</span>
<span class="FunctionName">num</span><span class="Keyword">:</span> <span class="Number">6</span> num<span class="Keyword">:</span> <span class="Number">6</span>
<span class="FunctionName">lyrics</span><span class="Keyword">:</span> <span class="Keyword">while</span> num <span class="Keyword">-</span><span class="Keyword">=</span> <span class="Number">1</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">&quot;</span> little monkeys, jumping on the bed.</span> num <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> little monkeys, jumping on the bed.</span>
<span class="String"> One fell out and bumped his head.<span class="String">&quot;</span></span> <span class="String"> One fell out and bumped his head.<span class="String">&quot;</span></span>
</pre><pre class="idle"><span class="Storage">var</span> _a, lyrics, num; </pre><pre class="idle"><span class="Storage">var</span> _a, lyrics, num;
@ -823,7 +841,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>. would use a loop, <b>each</b>/<b>forEach</b>, <b>map</b>, or <b>select</b>/<b>filter</b>.
</p> </p>
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> Eat lunch.</span> <div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> Eat lunch.</span>
<span class="FunctionName">lunch</span><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="Comment"><span class="Comment">#</span> Naive collision detection.</span>
<span class="Keyword">for</span> roid <span class="Keyword">in</span> asteroids <span class="Keyword">for</span> roid <span class="Keyword">in</span> asteroids
@ -860,11 +878,11 @@ _e <span class="Keyword">=</span> asteroids;
end of your comprehension. (The long line-breaking "for" definitions in end of your comprehension. (The long line-breaking "for" definitions in
the compiled JS below allow ranges to count downwards, as well as upwards). the compiled JS below allow ranges to count downwards, as well as upwards).
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">countdown</span><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">egg_delivery</span><span class="Keyword">:</span> <span class="Storage">-&gt;</span> <span class="FunctionName">egg_delivery</span><span class="Keyword">:</span> <span class="Storage">-&gt;</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> <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>
<span class="FunctionName">dozen_eggs</span><span class="Keyword">:</span> eggs[i...i<span class="Keyword">+</span><span class="Number">12</span>] dozen_eggs<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">egg_carton</span>(dozen) deliver <span class="Keyword">new</span> <span class="TypeName">egg_carton</span>(dozen)
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, _d, _e, countdown, egg_delivery, num; </pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, _d, _e, countdown, egg_delivery, num;
countdown <span class="Keyword">=</span> (<span class="Storage">function</span>() { countdown <span class="Keyword">=</span> (<span class="Storage">function</span>() {
@ -910,9 +928,9 @@ egg_delivery = function egg_delivery() {
an object. Use <tt>of</tt> to signal comprehension over the properties of an object. Use <tt>of</tt> to signal comprehension over the properties of
an object instead of the values in an array. an object instead of the values in an array.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">years_old</span><span class="Keyword">:</span> {<span class="FunctionName">max</span><span class="Keyword">:</span> <span class="Number">10</span>, <span class="FunctionName">ida</span><span class="Keyword">:</span> <span class="Number">9</span>, <span class="FunctionName">tim</span><span class="Keyword">:</span> <span class="Number">11</span>} <div class='code'><pre class="idle">years_old<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>}
<span class="FunctionName">ages</span><span class="Keyword">:</span> <span class="Keyword">for</span> child, age <span class="Keyword">of</span> years_old ages<span class="Keyword">:</span> <span class="Keyword">for</span> child, age <span class="Keyword">of</span> years_old
child <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> is <span class="String">&quot;</span></span> <span class="Keyword">+</span> age child <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> is <span class="String">&quot;</span></span> <span class="Keyword">+</span> age
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, age, ages, child, years_old; </pre><pre class="idle"><span class="Storage">var</span> _a, _b, age, ages, child, years_old;
<span class="Storage">var</span> __hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty; <span class="Storage">var</span> __hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty;
@ -956,11 +974,11 @@ ages = (function() {
the slice, and the second is the index of the last one. Three dots signify the slice, and the second is the index of the last one. Three dots signify
a range that excludes the end. a range that excludes the end.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">numbers</span><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>]
<span class="FunctionName">three_to_six</span><span class="Keyword">:</span> numbers[<span class="Number">3</span>..<span class="Number">6</span>] three_to_six<span class="Keyword">:</span> numbers[<span class="Number">3</span>..<span class="Number">6</span>]
<span class="FunctionName">numbers_copy</span><span class="Keyword">:</span> numbers[<span class="Number">0</span>...numbers.length] numbers_copy<span class="Keyword">:</span> numbers[<span class="Number">0</span>...numbers.length]
</pre><pre class="idle"><span class="Storage">var</span> numbers, numbers_copy, three_to_six; </pre><pre class="idle"><span class="Storage">var</span> numbers, numbers_copy, three_to_six;
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="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>];
@ -975,9 +993,9 @@ numbers_copy = numbers.slice(0, numbers.length);
The same syntax can be used with assignment to replace a segment of an The same syntax can be used with assignment to replace a segment of an
array with new values (to splice it). array with new values (to splice it).
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">numbers</span><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="Keyword">[</span><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; </pre><pre class="idle"><span class="Storage">var</span> numbers;
@ -1006,7 +1024,7 @@ numbers.splice.apply(numbers, [3, 6 - 3 + 1].concat([-3, -4, -5, -6]));
<span class="Keyword">else</span> <span class="Keyword">else</span>
<span class="String"><span class="String">&quot;</span>C<span class="String">&quot;</span></span> <span class="String"><span class="String">&quot;</span>C<span class="String">&quot;</span></span>
<span class="FunctionName">eldest</span><span class="Keyword">:</span> <span class="Keyword">if</span> <span class="Number">24</span> <span class="Keyword">&gt;</span> <span class="Number">21</span> <span class="Keyword">then</span> <span class="String"><span class="String">&quot;</span>Liz<span class="String">&quot;</span></span> <span class="Keyword">else</span> <span class="String"><span class="String">&quot;</span>Ike<span class="String">&quot;</span></span> eldest<span class="Keyword">:</span> <span class="Keyword">if</span> <span class="Number">24</span> <span class="Keyword">&gt;</span> <span class="Number">21</span> <span class="Keyword">then</span> <span class="String"><span class="String">&quot;</span>Liz<span class="String">&quot;</span></span> <span class="Keyword">else</span> <span class="String"><span class="String">&quot;</span>Ike<span class="String">&quot;</span></span>
</pre><pre class="idle"><span class="Storage">var</span> eldest, grade; </pre><pre class="idle"><span class="Storage">var</span> eldest, grade;
grade <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">grade</span>(<span class="FunctionArgument">student</span>) { grade <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">grade</span>(<span class="FunctionArgument">student</span>) {
<span class="Keyword">if</span> (student.excellent_work) { <span class="Keyword">if</span> (student.excellent_work) {
@ -1039,7 +1057,7 @@ eldest = 24 > 21 ? "Liz" : "Ike";
Because variable declarations occur at the top of scope, assignment can Because variable declarations occur at the top of scope, assignment can
be used within expressions, even for variables that haven't been seen before: be used within expressions, even for variables that haven't been seen before:
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">six</span><span class="Keyword">:</span> (<span class="FunctionName">one</span><span class="Keyword">:</span> <span class="Number">1</span>) <span class="Keyword">+</span> (<span class="FunctionName">two</span><span class="Keyword">:</span> <span class="Number">2</span>) <span class="Keyword">+</span> (<span class="FunctionName">three</span><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; </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>)); 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; </pre><button onclick='javascript: var one, six, three, two;
@ -1053,7 +1071,7 @@ six = ((one = 1)) + ((two = 2)) + ((three = 3));
</p> </p>
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> The first ten global properties.</span> <div class='code'><pre class="idle"><span class="Comment"><span class="Comment">#</span> The first ten global properties.</span>
<span class="FunctionName">globals</span><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>] 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; </pre><pre class="idle"><span class="Storage">var</span> _a, _b, globals, name;
<span class="Storage">var</span> __hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty; <span class="Storage">var</span> __hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty;
<span class="Comment"><span class="Comment">//</span> The first ten global properties.</span> <span class="Comment"><span class="Comment">//</span> The first ten global properties.</span>
@ -1120,7 +1138,7 @@ globals = (function() {
It can also be used for safer conditional assignment than <tt>||=</tt> It can also be used for safer conditional assignment than <tt>||=</tt>
provides, for cases where you may be handling numbers or strings. provides, for cases where you may be handling numbers or strings.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">solipsism</span><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> speed <span class="Keyword">?</span><span class="Keyword">=</span> <span class="Number">140</span>
@ -1179,11 +1197,11 @@ speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;
set the superclass, assign prototypal properties, and define the constructor, set the superclass, assign prototypal properties, and define the constructor,
in a single assignable expression. in a single assignable expression.
</p> </p>
<div class='code'><pre class="idle"><span class="Variable">class</span> Animal <div class='code'><pre class="idle"><span class="Storage">class</span> <span class="TypeName">Animal</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">-&gt;</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">-&gt;</span>
alert <span class="Variable">@name</span> <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> moved <span class="String">&quot;</span></span> <span class="Keyword">+</span> meters <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span>m.<span class="String">&quot;</span></span> alert <span class="Variable">@name</span> <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> moved <span class="String">&quot;</span></span> <span class="Keyword">+</span> meters <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span>m.<span class="String">&quot;</span></span>
<span class="Variable">class</span> Snake <span class="Variable">extends</span> Animal <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">-&gt;</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">-&gt;</span>
<span class="Variable">@name</span><span class="Keyword">:</span> name <span class="Variable">@name</span><span class="Keyword">:</span> name
@ -1191,7 +1209,7 @@ speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;
alert <span class="String"><span class="String">&quot;</span>Slithering...<span class="String">&quot;</span></span> alert <span class="String"><span class="String">&quot;</span>Slithering...<span class="String">&quot;</span></span>
<span class="Variable">super</span> <span class="Number">5</span> <span class="Variable">super</span> <span class="Number">5</span>
<span class="Variable">class</span> Horse <span class="Variable">extends</span> Animal <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">-&gt;</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">-&gt;</span>
<span class="Variable">@name</span><span class="Keyword">:</span> name <span class="Variable">@name</span><span class="Keyword">:</span> name
@ -1199,8 +1217,8 @@ speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;
alert <span class="String"><span class="String">&quot;</span>Galloping...<span class="String">&quot;</span></span> alert <span class="String"><span class="String">&quot;</span>Galloping...<span class="String">&quot;</span></span>
<span class="Variable">super</span> <span class="Number">45</span> <span class="Variable">super</span> <span class="Number">45</span>
<span class="FunctionName">sam</span><span class="Keyword">:</span> <span class="Keyword">new</span> <span class="TypeName">Snake</span> <span class="String"><span class="String">&quot;</span>Sammy the Python<span class="String">&quot;</span></span> sam<span class="Keyword">:</span> <span class="Keyword">new</span> <span class="TypeName">Snake</span> <span class="String"><span class="String">&quot;</span>Sammy the Python<span class="String">&quot;</span></span>
<span class="FunctionName">tom</span><span class="Keyword">:</span> <span class="Keyword">new</span> <span class="TypeName">Horse</span> <span class="String"><span class="String">&quot;</span>Tommy the Palomino<span class="String">&quot;</span></span> tom<span class="Keyword">:</span> <span class="Keyword">new</span> <span class="TypeName">Horse</span> <span class="String"><span class="String">&quot;</span>Tommy the Palomino<span class="String">&quot;</span></span>
sam.move() sam.move()
tom.move() tom.move()
@ -1305,10 +1323,10 @@ tom.move();
on the right to the variables on the left. In the simplest case, it can be on the right to the variables on the left. In the simplest case, it can be
used for parallel assignment: used for parallel assignment:
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">bait</span><span class="Keyword">:</span> <span class="Number">1000</span> <div class='code'><pre class="idle">bait<span class="Keyword">:</span> <span class="Number">1000</span>
<span class="FunctionName">and_switch</span><span class="Keyword">:</span> <span class="Number">0</span> and_switch<span class="Keyword">:</span> <span class="Number">0</span>
[bait, and_switch]<span class="Keyword">:</span> [and_switch, bait] <span class="Keyword">[</span>bait, and_switch<span class="Keyword">]:</span> [and_switch, bait]
</pre><pre class="idle"><span class="Storage">var</span> _a, and_switch, bait; </pre><pre class="idle"><span class="Storage">var</span> _a, and_switch, bait;
bait <span class="Keyword">=</span> <span class="Number">1000</span>; bait <span class="Keyword">=</span> <span class="Number">1000</span>;
and_switch <span class="Keyword">=</span> <span class="Number">0</span>; and_switch <span class="Keyword">=</span> <span class="Number">0</span>;
@ -1330,7 +1348,7 @@ and_switch = _a[1];
<span class="Comment"><span class="Comment">#</span> Make an Ajax request to fetch the weather...</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">&quot;</span>Mostly Sunny<span class="String">&quot;</span></span>] [location, <span class="Number">72</span>, <span class="String"><span class="String">&quot;</span>Mostly Sunny<span class="String">&quot;</span></span>]
[city, temp, forecast]<span class="Keyword">:</span> weather_report <span class="String"><span class="String">&quot;</span>Berkeley, CA<span class="String">&quot;</span></span> <span class="Keyword">[</span>city, temp, forecast<span class="Keyword">]:</span> weather_report <span class="String"><span class="String">&quot;</span>Berkeley, CA<span class="String">&quot;</span></span>
</pre><pre class="idle"><span class="Storage">var</span> _a, city, forecast, temp, weather_report; </pre><pre class="idle"><span class="Storage">var</span> _a, city, forecast, temp, weather_report;
weather_report <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">weather_report</span>(<span class="FunctionArgument">location</span>) { weather_report <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">weather_report</span>(<span class="FunctionArgument">location</span>) {
<span class="Comment"><span class="Comment">//</span> Make an Ajax request to fetch the weather...</span> <span class="Comment"><span class="Comment">//</span> Make an Ajax request to fetch the weather...</span>
@ -1354,19 +1372,19 @@ forecast = _a[2];
Pattern matching can be used with any depth of array and object nesting, Pattern matching can be used with any depth of array and object nesting,
to help pull out deeply nested properties. to help pull out deeply nested properties.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">futurists</span><span class="Keyword">:</span> { <div class='code'><pre class="idle">futurists<span class="Keyword">:</span> {
<span class="FunctionName">sculptor</span><span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Umberto Boccioni<span class="String">&quot;</span></span> sculptor<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Umberto Boccioni<span class="String">&quot;</span></span>
<span class="FunctionName">painter</span><span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Vladimir Burliuk<span class="String">&quot;</span></span> painter<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Vladimir Burliuk<span class="String">&quot;</span></span>
<span class="FunctionName">poet</span><span class="Keyword">:</span> { poet<span class="Keyword">:</span> {
<span class="FunctionName">name</span><span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>F.T. Marinetti<span class="String">&quot;</span></span> name<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>F.T. Marinetti<span class="String">&quot;</span></span>
<span class="FunctionName">address</span><span class="Keyword">:</span> [ address<span class="Keyword">:</span> [
<span class="String"><span class="String">&quot;</span>Via Roma 42R<span class="String">&quot;</span></span> <span class="String"><span class="String">&quot;</span>Via Roma 42R<span class="String">&quot;</span></span>
<span class="String"><span class="String">&quot;</span>Bellagio, Italy 22021<span class="String">&quot;</span></span> <span class="String"><span class="String">&quot;</span>Bellagio, Italy 22021<span class="String">&quot;</span></span>
] ]
} }
} }
{<span class="FunctionName">poet</span><span class="Keyword">:</span> {<span class="FunctionName">name</span><span class="Keyword">:</span> poet, <span class="FunctionName">address</span><span class="Keyword">:</span> [street, city]}}<span class="Keyword">:</span> futurists {poet<span class="Keyword">:</span> {name<span class="Keyword">:</span> poet, 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, poet, street; </pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, city, futurists, poet, street;
futurists <span class="Keyword">=</span> { futurists <span class="Keyword">=</span> {
sculptor: <span class="String"><span class="String">&quot;</span>Umberto Boccioni<span class="String">&quot;</span></span>, sculptor: <span class="String"><span class="String">&quot;</span>Umberto Boccioni<span class="String">&quot;</span></span>,
@ -1405,7 +1423,7 @@ city = _c[1];
In JavaScript, the <tt>this</tt> keyword is dynamically scoped to mean the In JavaScript, the <tt>this</tt> keyword is dynamically scoped to mean the
object that the current function is attached to. If you pass a function as object that the current function is attached to. If you pass a function as
as callback, or attach it to a different object, the original value of <tt>this</tt> as callback, or attach it to a different object, the original value of <tt>this</tt>
will be lost. If you're not familiar with this behavior, will be lost. If you're not familiar with this behavior,
<a href="http://www.digital-web.com/articles/scope_in_javascript/">this Digital Web article</a> <a href="http://www.digital-web.com/articles/scope_in_javascript/">this Digital Web article</a>
gives a good overview of the quirks. gives a good overview of the quirks.
</p> </p>
@ -1439,8 +1457,8 @@ Account <span class="Keyword">=</span> <span class="Storage">function</span> <sp
</pre><br class='clear' /></div> </pre><br class='clear' /></div>
<p> <p>
If we had used <tt>-></tt> in the callback above, <tt>@customer</tt> would If we had used <tt>-></tt> in the callback above, <tt>@customer</tt> would
have referred to the undefined "customer" property of the DOM element, have referred to the undefined "customer" property of the DOM element,
and trying to call <tt>purchase()</tt> on it would have raised an exception. and trying to call <tt>purchase()</tt> on it would have raised an exception.
</p> </p>
<p> <p>
@ -1450,7 +1468,7 @@ Account <span class="Keyword">=</span> <span class="Storage">function</span> <sp
snippets of JavaScript within your CoffeeScript, you can snippets of JavaScript within your CoffeeScript, you can
use backticks to pass it straight through. use backticks to pass it straight through.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">hi</span><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, &quot;Hello JavaScript&quot;].join(&quot;: &quot;);</span> <span class="String"> return [document.title, &quot;Hello JavaScript&quot;].join(&quot;: &quot;);</span>
<span class="String">}<span class="String">`</span></span> <span class="String">}<span class="String">`</span></span>
@ -1540,9 +1558,9 @@ return [document.title, "Hello JavaScript"].join(": ");
from Python &mdash; making it easy to test if a value falls within a from Python &mdash; making it easy to test if a value falls within a
certain range. certain range.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">cholesterol</span><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>
<span class="FunctionName">healthy</span><span class="Keyword">:</span> <span class="Number">200</span> <span class="Keyword">&gt;</span> cholesterol <span class="Keyword">&gt;</span> <span class="Number">60</span> healthy<span class="Keyword">:</span> <span class="Number">200</span> <span class="Keyword">&gt;</span> cholesterol <span class="Keyword">&gt;</span> <span class="Number">60</span>
</pre><pre class="idle"><span class="Storage">var</span> cholesterol, healthy; </pre><pre class="idle"><span class="Storage">var</span> cholesterol, healthy;
@ -1558,7 +1576,7 @@ healthy = (200 > cholesterol) && (cholesterol > 60);
<b class="header">Multiline Strings and Heredocs</b> <b class="header">Multiline Strings and Heredocs</b>
Multiline strings are allowed in CoffeeScript. Multiline strings are allowed in CoffeeScript.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">moby_dick</span><span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Call me Ishmael. Some years ago --</span> <div class='code'><pre class="idle">moby_dick<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Call me Ishmael. Some years ago --</span>
<span class="String">never mind how long precisely -- having little</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">or no money in my purse, and nothing particular</span>
<span class="String">to interest me on shore, I thought I would sail</span> <span class="String">to interest me on shore, I thought I would sail</span>
@ -1587,7 +1605,7 @@ world...";
indentation level that begins the heredoc is maintained throughout, so indentation level that begins the heredoc is maintained throughout, so
you can keep it all aligned with the body of your code. you can keep it all aligned with the body of your code.
</p> </p>
<div class='code'><pre class="idle"><span class="FunctionName">html</span><span class="Keyword">:</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"> &lt;strong&gt;</span> <span class="String"> &lt;strong&gt;</span>
<span class="String"> cup of coffeescript</span> <span class="String"> cup of coffeescript</span>
<span class="String"> &lt;/strong&gt;</span> <span class="String"> &lt;/strong&gt;</span>
@ -1596,6 +1614,35 @@ world...";
html <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>&lt;strong&gt;<span class="UserDefinedConstant">\n</span> cup of coffeescript<span class="UserDefinedConstant">\n</span>&lt;/strong&gt;<span class="String">&quot;</span></span>; html <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>&lt;strong&gt;<span class="UserDefinedConstant">\n</span> cup of coffeescript<span class="UserDefinedConstant">\n</span>&lt;/strong&gt;<span class="String">&quot;</span></span>;
</pre><br class='clear' /></div> </pre><br class='clear' /></div>
<p>
<span id="interpolation" class="bookmark"></span>
<b class="header">String Interpolation</b>
A version of <a href="http://wiki.ecmascript.org/doku.php?id=strawman:string_interpolation">ECMAScript Harmony's proposed string interpolation</a>
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">&quot;</span>Wittgenstein<span class="String">&quot;</span></span>
quote<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>A picture is a fact. -- <span class="String"><span class="String">$</span>author</span><span class="String">&quot;</span></span>
</pre><pre class="idle"><span class="Storage">var</span> author, quote;
author <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>Wittgenstein<span class="String">&quot;</span></span>;
quote <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>A picture is a fact. -- <span class="String">&quot;</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>
<p>
And arbitrary expressions can be interpolated by using brackets <tt>${ ... }</tt>
</p>
<div class='code'><pre class="idle">sentence<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</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">&quot;</span></span>
</pre><pre class="idle"><span class="Storage">var</span> sentence;
sentence <span class="Keyword">=</span> (<span class="Number">22</span> / <span class="Number">7</span>) <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> is a decent approximation of π<span class="String">&quot;</span></span>;
</pre><button onclick='javascript: var sentence;
sentence = (22 / 7) + " is a decent approximation of π";
;alert(sentence);'>run: sentence</button><br class='clear' /></div>
<h2> <h2>
<span id="cake" class="bookmark"></span> <span id="cake" class="bookmark"></span>
Cake, and Cakefiles Cake, and Cakefiles
@ -1675,9 +1722,9 @@ task(<span class="String"><span class="String">'</span>test<span class="String">
<tt>bin/cake build</tt> to rebuild the CoffeeScript compiler, and <br /> <tt>bin/cake build</tt> to rebuild the CoffeeScript compiler, and <br />
<tt>bin/cake build:parser</tt> to regenerate the Jison parser if you're <tt>bin/cake build:parser</tt> to regenerate the Jison parser if you're
working on the grammar. <br /><br /> working on the grammar. <br /><br />
<tt>git checkout lib &amp;&amp; bin/cake build &amp;&amp; bin/cake build &amp;&amp; bin/cake test</tt> <tt>bin/cake build:full</tt> is a good command to run when you're working
is a good command to run when you're working on the core language. It'll refresh the lib directory on the core language. It'll refresh the lib directory
(in case you broke something), build your altered compiler, use that to (in case you broke something), build your altered compiler, use that to
rebuild itself (a good sanity test) and then run all of the tests. If rebuild itself (a good sanity test) and then run all of the tests. If
they pass, there's a good chance you've made a successful change. they pass, there's a good chance you've made a successful change.
</li> </li>
@ -1693,12 +1740,12 @@ task(<span class="String"><span class="String">'</span>test<span class="String">
<li> <li>
<b>defunkt</b>'s <a href="http://github.com/defunkt/coffee-mode">CoffeeScript Major Mode</a> <b>defunkt</b>'s <a href="http://github.com/defunkt/coffee-mode">CoffeeScript Major Mode</a>
&mdash; a Emacs major mode that provides syntax highlighting, indentation &mdash; a Emacs major mode that provides syntax highlighting, indentation
support, and some bonus commands. (For Vim and TextMate highlighters, support, and some bonus commands. (For Vim and TextMate highlighters,
see the <tt>extras</tt> directory of the main repository.) see the <tt>extras</tt> directory of the main repository.)
</li> </li>
<li> <li>
<b>mattly</b>'s <a href="http://github.com/mattly/rack-coffee">rack-coffee</a> <b>mattly</b>'s <a href="http://github.com/mattly/rack-coffee">rack-coffee</a>
&mdash; a small Rack middleware for serving CoffeeScript files as &mdash; a small Rack middleware for serving CoffeeScript files as
compiled JavaScript on the fly. compiled JavaScript on the fly.
</li> </li>
</ul> </ul>
@ -1707,17 +1754,26 @@ task(<span class="String"><span class="String">'</span>test<span class="String">
<span id="change_log" class="bookmark"></span> <span id="change_log" class="bookmark"></span>
Change Log Change Log
</h2> </h2>
<p>
<b class="header" style="margin-top: 20px;">0.5.5</b>
String interpolation, contributed by
<a href="http://github.com/StanAngeloff">Stan Angeloff</a>.
Since <tt>--run</tt> has been the default since <b>0.5.3</b>, updating
<tt>--stdio</tt> and <tt>--eval</tt> to run by default, pass <tt>--compile</tt>
as well if you'd like to print the result.
</p>
<p> <p>
<b class="header" style="margin-top: 20px;">0.5.4</b> <b class="header" style="margin-top: 20px;">0.5.4</b>
Bugfix that corrects the Node.js global constants <tt>__filename</tt> and Bugfix that corrects the Node.js global constants <tt>__filename</tt> and
<tt>__dirname</tt>. Tweaks for more flexible parsing of nested function <tt>__dirname</tt>. Tweaks for more flexible parsing of nested function
literals and improperly-indented comments. Updates for the latest Node.js API. literals and improperly-indented comments. Updates for the latest Node.js API.
</p> </p>
<p> <p>
<b class="header" style="margin-top: 20px;">0.5.3</b> <b class="header" style="margin-top: 20px;">0.5.3</b>
CoffeeScript now has a syntax for defining classes. Many of the core CoffeeScript now has a syntax for defining classes. Many of the core
components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them. components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them.
Cakefiles can use <tt>optparse.coffee</tt> to define options for tasks. Cakefiles can use <tt>optparse.coffee</tt> to define options for tasks.
<tt>--run</tt> is now the default flag for the <tt>coffee</tt> command, <tt>--run</tt> is now the default flag for the <tt>coffee</tt> command,

View File

@ -18,7 +18,7 @@
this.exports = (this.CoffeeScript = {}); this.exports = (this.CoffeeScript = {});
} }
// The current CoffeeScript version number. // The current CoffeeScript version number.
exports.VERSION = '0.5.4'; exports.VERSION = '0.5.5';
// Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison // Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison
// compiler. // compiler.
exports.compile = function compile(code, options) { exports.compile = function compile(code, options) {

View File

@ -3,5 +3,5 @@
"description": "Unfancy JavaScript", "description": "Unfancy JavaScript",
"keywords": ["javascript", "language"], "keywords": ["javascript", "language"],
"author": "Jeremy Ashkenas", "author": "Jeremy Ashkenas",
"version": "0.5.4" "version": "0.5.5"
} }

View File

@ -18,7 +18,7 @@ else
this.exports: this.CoffeeScript: {} this.exports: this.CoffeeScript: {}
# The current CoffeeScript version number. # The current CoffeeScript version number.
exports.VERSION: '0.5.4' exports.VERSION: '0.5.5'
# Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison # Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison
# compiler. # compiler.