1
0
Fork 0
mirror of https://github.com/jashkenas/coffeescript.git synced 2022-11-09 12:23:24 -05:00

CoffeeScript 0.9.4

This commit is contained in:
Jeremy Ashkenas 2010-09-21 23:58:05 -04:00
parent 25c8b4b34f
commit c50cf23b7b
36 changed files with 771 additions and 736 deletions

View file

@ -6,7 +6,7 @@ require 'closure-compiler'
HEADER = <<-EOS HEADER = <<-EOS
/** /**
* CoffeeScript Compiler v0.9.3 * CoffeeScript Compiler v0.9.4
* http://coffeescript.org * http://coffeescript.org
* *
* Copyright 2010, Jeremy Ashkenas * Copyright 2010, Jeremy Ashkenas

View file

@ -1,4 +1,4 @@
### ###
CoffeeScript Compiler v0.9.3 CoffeeScript Compiler v0.9.4
Released under the MIT License Released under the MIT License
### ###

View file

@ -1,26 +1,24 @@
<!DOCTYPE html> <html> <head> <title>browser.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To &hellip; <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> browser.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-1">#</a> </div> <p>Activate CoffeeScript in the browser by having it compile and evaluate <!DOCTYPE html> <html> <head> <title>browser.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To &hellip; <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> browser.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-1">#</a> </div> <p>Override exported methods for non-Node.js engines.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript = </span><span class="nx">require</span> <span class="s1">&#39;./coffee-script&#39;</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Use standard JavaScript <code>eval</code> to eval code.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.eval = </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="nb">eval</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-3">#</a> </div> <p>Running code does not provide access to this scope.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.run = </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="p">(</span><span class="nb">Function</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">)()</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>If we're not in a browser environment, we're finished with the public API.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">return</span> <span class="nx">unless</span> <span class="nb">window</span><span class="o">?</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Load a remote script from the current domain via XHR.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.load = </span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">xhr = </span><span class="k">new</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">ActiveXObject</span> <span class="o">or</span> <span class="nx">XMLHttpRequest</span><span class="p">)(</span><span class="s1">&#39;Microsoft.XMLHTTP&#39;</span><span class="p">)</span>
<span class="nx">xhr</span><span class="p">.</span><span class="nx">open</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="nx">url</span><span class="p">,</span> <span class="kc">true</span>
<span class="nx">xhr</span><span class="p">.</span><span class="nx">overrideMimeType</span> <span class="s1">&#39;text/plain&#39;</span> <span class="k">if</span> <span class="s1">&#39;overrideMimeType&#39;</span> <span class="k">of</span> <span class="nx">xhr</span>
<span class="nv">xhr.onreadystatechange = </span><span class="o">-&gt;</span>
<span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">run</span> <span class="nx">xhr</span><span class="p">.</span><span class="nx">responseText</span><span class="p">,</span> <span class="nx">options</span> <span class="k">if</span> <span class="nx">xhr</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">is</span> <span class="mi">4</span>
<span class="nx">xhr</span><span class="p">.</span><span class="nx">send</span> <span class="kc">null</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Activate CoffeeScript in the browser by having it compile and evaluate
all script tags with a content-type of <code>text/coffeescript</code>. all script tags with a content-type of <code>text/coffeescript</code>.
This happens on page load.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="nb">document</span><span class="o">?</span><span class="p">.</span><span class="nx">getElementsByTagName</span> This happens on page load.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">processScripts = </span><span class="o">-&gt;</span>
<span class="nv">grind = </span><span class="p">(</span><span class="nx">coffee</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">for</span> <span class="nx">script</span> <span class="k">in</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span> <span class="s1">&#39;script&#39;</span>
<span class="nx">setTimeout</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">coffee</span> <span class="k">if</span> <span class="nx">script</span><span class="p">.</span><span class="nx">type</span> <span class="o">is</span> <span class="s1">&#39;text/coffeescript&#39;</span>
<span class="nv">grindRemote = </span><span class="p">(</span><span class="nx">url</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="nx">script</span><span class="p">.</span><span class="nx">src</span>
<span class="nv">xhr = </span><span class="k">new</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">ActiveXObject</span> <span class="o">or</span> <span class="nx">XMLHttpRequest</span><span class="p">)(</span><span class="s1">&#39;Microsoft.XMLHTTP&#39;</span><span class="p">)</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">load</span> <span class="nx">script</span><span class="p">.</span><span class="nx">src</span>
<span class="nx">xhr</span><span class="p">.</span><span class="nx">open</span> <span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="nx">url</span><span class="p">,</span> <span class="kc">true</span> <span class="k">else</span>
<span class="nx">xhr</span><span class="p">.</span><span class="nx">overrideMimeType</span> <span class="s1">&#39;text/plain&#39;</span> <span class="k">if</span> <span class="s1">&#39;overrideMimeType&#39;</span> <span class="k">of</span> <span class="nx">xhr</span> <span class="nx">setTimeout</span> <span class="o">-&gt;</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">run</span> <span class="nx">script</span><span class="p">.</span><span class="nx">innerHTML</span>
<span class="nv">xhr.onreadystatechange = </span><span class="o">-&gt;</span> <span class="kc">null</span>
<span class="nx">grind</span> <span class="nx">xhr</span><span class="p">.</span><span class="nx">responseText</span> <span class="k">if</span> <span class="nx">xhr</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">is</span> <span class="mi">4</span> <span class="k">if</span> <span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span>
<span class="nx">xhr</span><span class="p">.</span><span class="nx">send</span> <span class="kc">null</span> <span class="nx">addEventListener</span> <span class="s1">&#39;DOMContentLoaded&#39;</span><span class="p">,</span> <span class="nx">processScripts</span><span class="p">,</span> <span class="kc">false</span>
<span class="nv">processScripts = </span><span class="o">-&gt;</span> <span class="k">else</span>
<span class="k">for</span> <span class="nx">script</span> <span class="k">in</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span> <span class="s1">&#39;script&#39;</span> <span class="nx">attachEvent</span> <span class="s1">&#39;onload&#39;</span><span class="p">,</span> <span class="nx">processScripts</span>
<span class="k">if</span> <span class="nx">script</span><span class="p">.</span><span class="nx">type</span> <span class="o">is</span> <span class="s1">&#39;text/coffeescript&#39;</span>
<span class="k">if</span> <span class="nx">script</span><span class="p">.</span><span class="nx">src</span>
<span class="nx">grindRemote</span> <span class="nx">script</span><span class="p">.</span><span class="nx">src</span>
<span class="k">else</span>
<span class="nx">grind</span> <span class="nx">script</span><span class="p">.</span><span class="nx">innerHTML</span>
<span class="kc">null</span>
<span class="k">if</span> <span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span>
<span class="nx">addEventListener</span> <span class="s1">&#39;DOMContentLoaded&#39;</span><span class="p">,</span> <span class="nx">processScripts</span><span class="p">,</span> <span class="kc">false</span>
<span class="k">else</span>
<span class="nx">attachEvent</span> <span class="s1">&#39;onload&#39;</span><span class="p">,</span> <span class="nx">processScripts</span>
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html> </pre></div> </td> </tr> </tbody> </table> </div> </body> </html>

View file

@ -33,7 +33,7 @@ If no tasks are passed, print the help screen.</p> </td>
<span class="nx">puts</span> <span class="s1">&#39;&#39;</span> <span class="nx">puts</span> <span class="s1">&#39;&#39;</span>
<span class="k">for</span> <span class="nx">all</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">task</span> <span class="k">of</span> <span class="nx">tasks</span> <span class="k">for</span> <span class="nx">all</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">task</span> <span class="k">of</span> <span class="nx">tasks</span>
<span class="nv">spaces = </span><span class="mi">20</span> <span class="o">-</span> <span class="nx">name</span><span class="p">.</span><span class="nx">length</span> <span class="nv">spaces = </span><span class="mi">20</span> <span class="o">-</span> <span class="nx">name</span><span class="p">.</span><span class="nx">length</span>
<span class="nv">spaces = </span><span class="k">if</span> <span class="nx">spaces</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">then</span> <span class="p">(</span><span class="s1">&#39; &#39;</span> <span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="nx">spaces</span><span class="p">]).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">spaces = </span><span class="k">if</span> <span class="nx">spaces</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">then</span> <span class="nb">Array</span><span class="p">(</span><span class="nx">spaces</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nv">desc = </span><span class="k">if</span> <span class="nx">task</span><span class="p">.</span><span class="nx">description</span> <span class="k">then</span> <span class="s2">&quot;# #{task.description}&quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">desc = </span><span class="k">if</span> <span class="nx">task</span><span class="p">.</span><span class="nx">description</span> <span class="k">then</span> <span class="s2">&quot;# #{task.description}&quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nx">puts</span> <span class="s2">&quot;cake #{name}#{spaces} #{desc}&quot;</span> <span class="nx">puts</span> <span class="s2">&quot;cake #{name}#{spaces} #{desc}&quot;</span>
<span class="nx">puts</span> <span class="nx">oparse</span><span class="p">.</span><span class="nx">help</span><span class="p">()</span> <span class="k">if</span> <span class="nx">switches</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Print an error and exit when attempting to all an undefined task.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">missingTask = </span><span class="p">(</span><span class="nx">task</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">puts</span> <span class="nx">oparse</span><span class="p">.</span><span class="nx">help</span><span class="p">()</span> <span class="k">if</span> <span class="nx">switches</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Print an error and exit when attempting to all an undefined task.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">missingTask = </span><span class="p">(</span><span class="nx">task</span><span class="p">)</span> <span class="o">-&gt;</span>

View file

@ -4,19 +4,16 @@ contains the main entry functions for tokenzing, parsing, and compiling source
CoffeeScript into JavaScript.</p> CoffeeScript into JavaScript.</p>
<p>If included on a webpage, it will automatically sniff out, compile, and <p>If included on a webpage, it will automatically sniff out, compile, and
execute all scripts present in <code>text/coffeescript</code> tags.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Set up dependencies correctly for both the server and the browser.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="nx">process</span><span class="o">?</span> execute all scripts present in <code>text/coffeescript</code> tags.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">path = </span><span class="nx">require</span> <span class="s1">&#39;path&#39;</span>
<span class="nv">path = </span><span class="nx">require</span> <span class="s1">&#39;path&#39;</span> <span class="p">{</span><span class="nx">Lexer</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">&#39;./lexer&#39;</span>
<span class="nv">Lexer = </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./lexer&#39;</span><span class="p">).</span><span class="nx">Lexer</span> <span class="p">{</span><span class="nx">parser</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">&#39;./parser&#39;</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>TODO: Remove registerExtension when fully deprecated</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="nx">require</span><span class="p">.</span><span class="nx">extensions</span>
<span class="nv">parser = </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./parser&#39;</span><span class="p">).</span><span class="nx">parser</span> <span class="nv">fs = </span><span class="nx">require</span> <span class="s1">&#39;fs&#39;</span>
<span class="nv">helpers = </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./helpers&#39;</span><span class="p">).</span><span class="nx">helpers</span> <span class="nx">require</span><span class="p">.</span><span class="nx">extensions</span><span class="p">[</span><span class="s1">&#39;.coffee&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="nx">module</span><span class="p">,</span> <span class="nx">filename</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">helpers</span><span class="p">.</span><span class="nx">extend</span> <span class="nx">global</span><span class="p">,</span> <span class="nx">require</span> <span class="s1">&#39;./nodes&#39;</span> <span class="nv">content = </span><span class="nx">compile</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span> <span class="nx">filename</span><span class="p">,</span> <span class="s1">&#39;utf8&#39;</span>
<span class="k">if</span> <span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</span> <span class="nv">module.filename = </span><span class="s2">&quot;#{filename} (compiled)&quot;</span>
<span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</span> <span class="s1">&#39;.coffee&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">content</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compile</span> <span class="nx">content</span> <span class="nx">module</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">content</span><span class="p">,</span> <span class="nx">module</span><span class="p">.</span><span class="nx">filename</span>
<span class="k">else</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</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> <span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</span> <span class="s1">&#39;.coffee&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">content</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compile</span> <span class="nx">content</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.9.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="nv">Lexer = </span><span class="k">this</span><span class="p">.</span><span class="nx">Lexer</span>
<span class="nv">parser = </span><span class="k">this</span><span class="p">.</span><span class="nx">parser</span>
<span class="nv">helpers = </span><span class="k">this</span><span class="p">.</span><span class="nx">helpers</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.9.3&#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 = 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 = 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="nx">options</span> <span class="o">or=</span> <span class="p">{}</span> <span class="nx">options</span> <span class="o">or=</span> <span class="p">{}</span>
<span class="k">try</span> <span class="k">try</span>
@ -28,10 +25,13 @@ compiler.</p> </td> <td class="code"> <div
then compile it by calling <code>.compile()</code> on the root, or traverse it by using then compile it by calling <code>.compile()</code> on the root, or traverse it by using
<code>.traverse()</code> with a callback.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.nodes = </span><span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="o">-&gt;</span> <code>.traverse()</code> with a callback.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.nodes = </span><span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="o">-&gt;</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></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Compile and execute a string of CoffeeScript (on the server), correctly <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></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Compile and execute a string of CoffeeScript (on the server), correctly
setting <code>__filename</code>, <code>__dirname</code>, and relative <code>require()</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.run = </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> setting <code>__filename</code>, <code>__dirname</code>, and relative <code>require()</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.run = </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></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>We want the root module.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">root = </span><span class="nx">module</span>
<span class="nv">module.filename = __filename = </span><span class="nx">options</span><span class="p">.</span><span class="nx">fileName</span> <span class="k">while</span> <span class="nx">root</span><span class="p">.</span><span class="nx">parent</span>
<span class="nv">__dirname = </span><span class="nx">path</span><span class="p">.</span><span class="nx">dirname</span> <span class="nx">__filename</span> <span class="nv">root = </span><span class="nx">root</span><span class="p">.</span><span class="nx">parent</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Set the filename</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">root.filename = __filename = </span><span class="s2">&quot;#{options.fileName} (compiled)&quot;</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Clear the module cache</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">root.moduleCache = </span><span class="p">{}</span> <span class="k">if</span> <span class="nx">root</span><span class="p">.</span><span class="nx">moduleCache</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>Compile</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">root</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">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="nx">root</span><span class="p">.</span><span class="nx">filename</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).
<span class="nb">eval</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Instantiate a Lexer for our use here.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">lexer = </span><span class="k">new</span> <span class="nx">Lexer</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>The real Lexer produces a generic stream of tokens. This object provides a The CoffeeScript REPL uses this to run the input.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.eval = </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="nv">__filename = </span><span class="nx">options</span><span class="p">.</span><span class="nx">fileName</span>
<span class="nv">__dirname = </span><span class="nx">path</span><span class="p">.</span><span class="nx">dirname</span> <span class="nx">__filename</span>
<span class="nb">eval</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-13">#</a> </div> <p>Instantiate a Lexer for our use here.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">lexer = </span><span class="k">new</span> <span class="nx">Lexer</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-14">#</a> </div> <p>The real Lexer produces a generic stream of tokens. This object provides a
thin wrapper around it, compatible with the Jison API. We can then pass it thin wrapper around it, compatible with the Jison API. We can then pass it
directly as a "Jison lexer".</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">parser.lexer =</span> directly as a "Jison lexer".</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">parser.lexer =</span>
<span class="nx">lex</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">lex</span><span class="o">:</span> <span class="o">-&gt;</span>
@ -45,4 +45,6 @@ directly as a "Jison lexer".</p> </td> <td class="code">
<span class="vi">@pos = </span><span class="mi">0</span> <span class="vi">@pos = </span><span class="mi">0</span>
<span class="nx">upcomingInput</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="s2">&quot;&quot;</span> <span class="nx">upcomingInput</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="s2">&quot;&quot;</span>
<span class="nv">parser.yy = </span><span class="nx">require</span> <span class="s1">&#39;./nodes&#39;</span>
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html> </pre></div> </td> </tr> </tbody> </table> </div> </body> </html>

View file

@ -21,6 +21,7 @@ optionally. If no action is specified, we simply pass the value of the
previous nonterminal.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">o = </span><span class="p">(</span><span class="nx">patternString</span><span class="p">,</span> <span class="nx">action</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span> previous nonterminal.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">o = </span><span class="p">(</span><span class="nx">patternString</span><span class="p">,</span> <span class="nx">action</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="p">[</span><span class="nx">patternString</span><span class="p">,</span> <span class="s1">&#39;$$ = $1;&#39;</span><span class="p">,</span> <span class="nx">options</span><span class="p">]</span> <span class="nx">unless</span> <span class="nx">action</span> <span class="k">return</span> <span class="p">[</span><span class="nx">patternString</span><span class="p">,</span> <span class="s1">&#39;$$ = $1;&#39;</span><span class="p">,</span> <span class="nx">options</span><span class="p">]</span> <span class="nx">unless</span> <span class="nx">action</span>
<span class="nv">action = </span><span class="k">if</span> <span class="nv">match = </span><span class="p">(</span><span class="nx">action</span> <span class="o">+</span> <span class="s1">&#39;&#39;</span><span class="p">).</span><span class="nx">match</span><span class="p">(</span><span class="nx">unwrap</span><span class="p">)</span> <span class="k">then</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;(#{action}())&quot;</span> <span class="nv">action = </span><span class="k">if</span> <span class="nv">match = </span><span class="p">(</span><span class="nx">action</span> <span class="o">+</span> <span class="s1">&#39;&#39;</span><span class="p">).</span><span class="nx">match</span><span class="p">(</span><span class="nx">unwrap</span><span class="p">)</span> <span class="k">then</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;(#{action}())&quot;</span>
<span class="nv">action = </span><span class="nx">action</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\b(?:[A-Z][a-z]+Node|Expressions)\b/g</span><span class="p">,</span> <span class="s1">&#39;yy.$&amp;&#39;</span>
<span class="p">[</span><span class="nx">patternString</span><span class="p">,</span> <span class="s2">&quot;$$ = #{action};&quot;</span><span class="p">,</span> <span class="nx">options</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <h2>Grammatical Rules</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>In all of the rules that follow, you'll see the name of the nonterminal as <span class="p">[</span><span class="nx">patternString</span><span class="p">,</span> <span class="s2">&quot;$$ = #{action};&quot;</span><span class="p">,</span> <span class="nx">options</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <h2>Grammatical Rules</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>In all of the rules that follow, you'll see the name of the nonterminal as
the key to a list of alternative matches. With each match's action, the the key to a list of alternative matches. With each match's action, the
dollar-sign variables are provided by Jison as references to the value of dollar-sign variables are provided by Jison as references to the value of
@ -182,6 +183,7 @@ and optional references to the superclass.</p> </td> <td
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-36">#</a> </div> <p>Assignments that can happen directly inside a class declaration.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ClassAssign</span><span class="o">:</span> <span class="p">[</span> <span class="p">]</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-36">#</a> </div> <p>Assignments that can happen directly inside a class declaration.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ClassAssign</span><span class="o">:</span> <span class="p">[</span>
<span class="nx">o</span> <span class="s2">&quot;AssignObj&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="nx">$1</span> <span class="nx">o</span> <span class="s2">&quot;AssignObj&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="nx">$1</span>
<span class="nx">o</span> <span class="s2">&quot;ThisProperty : Expression&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="nx">AssignNode</span> <span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">$1</span><span class="p">),</span> <span class="nx">$3</span><span class="p">,</span> <span class="s1">&#39;this&#39;</span> <span class="nx">o</span> <span class="s2">&quot;ThisProperty : Expression&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="nx">AssignNode</span> <span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">$1</span><span class="p">),</span> <span class="nx">$3</span><span class="p">,</span> <span class="s1">&#39;this&#39;</span>
<span class="nx">o</span> <span class="s2">&quot;ThisProperty : INDENT Expression OUTDENT&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="nx">AssignNode</span> <span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">$1</span><span class="p">),</span> <span class="nx">$4</span><span class="p">,</span> <span class="s1">&#39;this&#39;</span>
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-37">#</a> </div> <p>A list of assignments to a class.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ClassBody</span><span class="o">:</span> <span class="p">[</span> <span class="p">]</span></pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-37">#</a> </div> <p>A list of assignments to a class.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ClassBody</span><span class="o">:</span> <span class="p">[</span>
<span class="nx">o</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">[]</span> <span class="nx">o</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">[]</span>
<span class="nx">o</span> <span class="s2">&quot;ClassAssign&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="nx">$1</span><span class="p">]</span> <span class="nx">o</span> <span class="s2">&quot;ClassAssign&quot;</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="nx">$1</span><span class="p">]</span>

View file

@ -1,35 +1,34 @@
<!DOCTYPE html> <html> <head> <title>helpers.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To &hellip; <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> helpers.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-1">#</a> </div> <p>This file contains the common helper functions that we'd like to share among <!DOCTYPE html> <html> <head> <title>helpers.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To &hellip; <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> helpers.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-1">#</a> </div> <p>This file contains the common helper functions that we'd like to share among
the <strong>Lexer</strong>, <strong>Rewriter</strong>, and the <strong>Nodes</strong>. Merge objects, flatten the <strong>Lexer</strong>, <strong>Rewriter</strong>, and the <strong>Nodes</strong>. Merge objects, flatten
arrays, count characters, that sort of thing.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Set up exported variables for both <strong>Node.js</strong> and the browser.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nv">exports = </span><span class="k">this</span> <span class="nx">unless</span> <span class="nx">process</span><span class="o">?</span> arrays, count characters, that sort of thing.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers = exports.helpers = </span><span class="p">{}</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Cross-browser indexOf, so that IE can join the party.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.indexOf = indexOf = </span><span class="p">(</span><span class="nx">array</span><span class="p">,</span> <span class="nx">item</span><span class="p">,</span> <span class="nx">from</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">helpers = exports.helpers = </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>Cross-browser indexOf, so that IE can join the party.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.indexOf = indexOf = </span><span class="p">(</span><span class="nx">array</span><span class="p">,</span> <span class="nx">item</span><span class="p">,</span> <span class="nx">from</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="nx">array</span><span class="p">.</span><span class="nx">indexOf</span> <span class="nx">item</span><span class="p">,</span> <span class="nx">from</span> <span class="k">if</span> <span class="nx">array</span><span class="p">.</span><span class="nx">indexOf</span> <span class="k">return</span> <span class="nx">array</span><span class="p">.</span><span class="nx">indexOf</span> <span class="nx">item</span><span class="p">,</span> <span class="nx">from</span> <span class="k">if</span> <span class="nx">array</span><span class="p">.</span><span class="nx">indexOf</span>
<span class="k">for</span> <span class="nx">other</span><span class="p">,</span> <span class="nx">index</span> <span class="k">in</span> <span class="nx">array</span> <span class="k">for</span> <span class="nx">other</span><span class="p">,</span> <span class="nx">index</span> <span class="k">in</span> <span class="nx">array</span>
<span class="k">if</span> <span class="nx">other</span> <span class="o">is</span> <span class="nx">item</span> <span class="o">and</span> <span class="p">(</span><span class="o">not</span> <span class="nx">from</span> <span class="o">or</span> <span class="p">(</span><span class="nx">from</span> <span class="o">&lt;=</span> <span class="nx">index</span><span class="p">))</span> <span class="k">if</span> <span class="nx">other</span> <span class="o">is</span> <span class="nx">item</span> <span class="o">and</span> <span class="p">(</span><span class="o">not</span> <span class="nx">from</span> <span class="o">or</span> <span class="p">(</span><span class="nx">from</span> <span class="o">&lt;=</span> <span class="nx">index</span><span class="p">))</span>
<span class="k">return</span> <span class="nx">index</span> <span class="k">return</span> <span class="nx">index</span>
<span class="o">-</span><span class="mi">1</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>Does a list include a value?</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.include = include = </span><span class="p">(</span><span class="nx">list</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="o">-</span><span class="mi">1</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-3">#</a> </div> <p>Does a list include a value?</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.include = include = </span><span class="p">(</span><span class="nx">list</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">indexOf</span><span class="p">(</span><span class="nx">list</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Peek at the beginning of a given string to see if it matches a sequence.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.starts = starts = </span><span class="p">(</span><span class="nx">string</span><span class="p">,</span> <span class="nx">literal</span><span class="p">,</span> <span class="nx">start</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">indexOf</span><span class="p">(</span><span class="nx">list</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>Peek at the beginning of a given string to see if it matches a sequence.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.starts = starts = </span><span class="p">(</span><span class="nx">string</span><span class="p">,</span> <span class="nx">literal</span><span class="p">,</span> <span class="nx">start</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">string</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="nx">start</span><span class="p">,</span> <span class="p">(</span><span class="nx">start</span> <span class="o">or</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="nx">literal</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">is</span> <span class="nx">literal</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Peek at the end of a given string to see if it matches a sequence.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.ends = ends = </span><span class="p">(</span><span class="nx">string</span><span class="p">,</span> <span class="nx">literal</span><span class="p">,</span> <span class="nx">back</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">string</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="nx">start</span><span class="p">,</span> <span class="p">(</span><span class="nx">start</span> <span class="o">or</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="nx">literal</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">is</span> <span class="nx">literal</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Peek at the end of a given string to see if it matches a sequence.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.ends = ends = </span><span class="p">(</span><span class="nx">string</span><span class="p">,</span> <span class="nx">literal</span><span class="p">,</span> <span class="nx">back</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">start = </span><span class="nx">string</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="nx">literal</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="p">(</span><span class="nx">back</span> <span class="o">?</span> <span class="mi">0</span><span class="p">)</span> <span class="nv">start = </span><span class="nx">string</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="nx">literal</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="p">(</span><span class="nx">back</span> <span class="o">?</span> <span class="mi">0</span><span class="p">)</span>
<span class="nx">string</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="nx">start</span><span class="p">,</span> <span class="nx">start</span> <span class="o">+</span> <span class="nx">literal</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">is</span> <span class="nx">literal</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Trim out all falsy values from an array.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.compact = compact = </span><span class="p">(</span><span class="nx">array</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">item</span> <span class="k">for</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">array</span> <span class="k">when</span> <span class="nx">item</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Count the number of occurences of a character in a string.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.count = count = </span><span class="p">(</span><span class="nx">string</span><span class="p">,</span> <span class="nx">letter</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">string</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="nx">start</span><span class="p">,</span> <span class="nx">start</span> <span class="o">+</span> <span class="nx">literal</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">is</span> <span class="nx">literal</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Trim out all falsy values from an array.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.compact = compact = </span><span class="p">(</span><span class="nx">array</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">item</span> <span class="k">for</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">array</span> <span class="k">when</span> <span class="nx">item</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Count the number of occurences of a character in a string.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.count = count = </span><span class="p">(</span><span class="nx">string</span><span class="p">,</span> <span class="nx">letter</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">num = </span><span class="mi">0</span> <span class="nv">num = </span><span class="mi">0</span>
<span class="nv">pos = </span><span class="nx">indexOf</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">letter</span> <span class="nv">pos = </span><span class="nx">indexOf</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">letter</span>
<span class="k">while</span> <span class="nx">pos</span> <span class="o">isnt</span> <span class="o">-</span><span class="mi">1</span> <span class="k">while</span> <span class="nx">pos</span> <span class="o">isnt</span> <span class="o">-</span><span class="mi">1</span>
<span class="nx">num</span> <span class="o">+=</span> <span class="mi">1</span> <span class="nx">num</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="nv">pos = </span><span class="nx">indexOf</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">letter</span><span class="p">,</span> <span class="nx">pos</span> <span class="o">+</span> <span class="mi">1</span> <span class="nv">pos = </span><span class="nx">indexOf</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">letter</span><span class="p">,</span> <span class="nx">pos</span> <span class="o">+</span> <span class="mi">1</span>
<span class="nx">num</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Merge objects, returning a fresh copy with attributes from both sides. <span class="nx">num</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Merge objects, returning a fresh copy with attributes from both sides.
Used every time <code>BaseNode#compile</code> is called, to allow properties in the Used every time <code>BaseNode#compile</code> is called, to allow properties in the
options hash to propagate down the tree without polluting other branches.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.merge = merge = </span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="nx">overrides</span><span class="p">)</span> <span class="o">-&gt;</span> options hash to propagate down the tree without polluting other branches.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.merge = merge = </span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="nx">overrides</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">fresh = </span><span class="p">{}</span> <span class="nv">fresh = </span><span class="p">{}</span>
<span class="p">(</span><span class="nx">fresh</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span><span class="p">)</span> <span class="k">for</span> <span class="nx">all</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">options</span> <span class="p">(</span><span class="nx">fresh</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span><span class="p">)</span> <span class="k">for</span> <span class="nx">all</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">options</span>
<span class="p">(</span><span class="nx">fresh</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span><span class="p">)</span> <span class="k">for</span> <span class="nx">all</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">overrides</span> <span class="k">if</span> <span class="nx">overrides</span> <span class="p">(</span><span class="nx">fresh</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span><span class="p">)</span> <span class="k">for</span> <span class="nx">all</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">overrides</span> <span class="k">if</span> <span class="nx">overrides</span>
<span class="nx">fresh</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Extend a source object with the properties of another object (shallow copy). <span class="nx">fresh</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Extend a source object with the properties of another object (shallow copy).
We use this to simulate Node's deprecated <code>process.mixin</code></p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.extend = extend = </span><span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">properties</span><span class="p">)</span> <span class="o">-&gt;</span> We use this to simulate Node's deprecated <code>process.mixin</code></p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.extend = extend = </span><span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">properties</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="p">(</span><span class="nx">object</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span><span class="p">)</span> <span class="k">for</span> <span class="nx">all</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">properties</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>Return a completely flattened version of an array. Handy for getting a <span class="p">(</span><span class="nx">object</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span><span class="p">)</span> <span class="k">for</span> <span class="nx">all</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">properties</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Return a completely flattened version of an array. Handy for getting a
list of <code>children</code> from the nodes.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.flatten = flatten = </span><span class="p">(</span><span class="nx">array</span><span class="p">)</span> <span class="o">-&gt;</span> list of <code>children</code> from the nodes.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.flatten = flatten = </span><span class="p">(</span><span class="nx">array</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">memo = </span><span class="p">[]</span> <span class="nv">memo = </span><span class="p">[]</span>
<span class="k">for</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">array</span> <span class="k">for</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">array</span>
<span class="k">if</span> <span class="nx">item</span> <span class="k">instanceof</span> <span class="nb">Array</span> <span class="k">then</span> <span class="nv">memo = </span><span class="nx">memo</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="k">else</span> <span class="nx">memo</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="k">if</span> <span class="nx">item</span> <span class="k">instanceof</span> <span class="nb">Array</span> <span class="k">then</span> <span class="nv">memo = </span><span class="nx">memo</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="k">else</span> <span class="nx">memo</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span>
<span class="nx">memo</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>Delete a key from an object, returning the value. Useful when a node is <span class="nx">memo</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>Delete a key from an object, returning the value. Useful when a node is
looking for a particular method in an options hash.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.del = del = </span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">key</span><span class="p">)</span> <span class="o">-&gt;</span> looking for a particular method in an options hash.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">helpers.del = del = </span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">key</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">val = </span><span class="nx">obj</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="nv">val = </span><span class="nx">obj</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span>
<span class="k">delete</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="k">delete</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span>

File diff suppressed because one or more lines are too long

View file

@ -1,14 +1,7 @@
<!DOCTYPE html> <html> <head> <title>nodes.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To &hellip; <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> nodes.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-1">#</a> </div> <p><code>nodes.coffee</code> contains all of the node classes for the syntax tree. Most <!DOCTYPE html> <html> <head> <title>nodes.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To &hellip; <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> nodes.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-1">#</a> </div> <p><code>nodes.coffee</code> contains all of the node classes for the syntax tree. Most
nodes are created as the result of actions in the <a href="grammar.html">grammar</a>, nodes are created as the result of actions in the <a href="grammar.html">grammar</a>,
but some are created by other nodes as a method of code generation. To convert but some are created by other nodes as a method of code generation. To convert
the syntax tree into a string of JavaScript code, call <code>compile()</code> on the root.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Set up for both <strong>Node.js</strong> and the browser, by the syntax tree into a string of JavaScript code, call <code>compile()</code> on the root.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">Scope</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">&#39;./scope&#39;</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Import the helpers we plan to use.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">compact</span><span class="p">,</span> <span class="nx">flatten</span><span class="p">,</span> <span class="nx">merge</span><span class="p">,</span> <span class="nx">del</span><span class="p">,</span> <span class="nx">include</span><span class="p">,</span> <span class="nx">indexOf</span><span class="p">,</span> <span class="nx">starts</span><span class="p">,</span> <span class="nx">ends</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./helpers&#39;</span><span class="p">).</span><span class="nx">helpers</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-3">#</a> </div> <h3>BaseNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>The <strong>BaseNode</strong> is the abstract base class for all nodes in the syntax tree.
including the <a href="scope.html">Scope</a> class and the <a href="helpers.html">helper</a> functions.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="nx">process</span><span class="o">?</span>
<span class="nv">Scope = </span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./scope&#39;</span><span class="p">).</span><span class="nx">Scope</span>
<span class="nv">helpers = </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./helpers&#39;</span><span class="p">).</span><span class="nx">helpers</span>
<span class="k">else</span>
<span class="k">this</span><span class="p">.</span><span class="nv">exports = </span><span class="k">this</span>
<span class="nv">helpers = </span> <span class="k">this</span><span class="p">.</span><span class="nx">helpers</span>
<span class="nv">Scope = </span> <span class="k">this</span><span class="p">.</span><span class="nx">Scope</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-3">#</a> </div> <p>Import the helpers we plan to use.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">compact</span><span class="p">,</span> <span class="nx">flatten</span><span class="p">,</span> <span class="nx">merge</span><span class="p">,</span> <span class="nx">del</span><span class="p">,</span> <span class="nx">include</span><span class="p">,</span> <span class="nx">indexOf</span><span class="p">,</span> <span class="nx">starts</span><span class="p">,</span> <span class="nx">ends</span><span class="p">}</span> <span class="o">=</span> <span class="nx">helpers</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <h3>BaseNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>The <strong>BaseNode</strong> is the abstract base class for all nodes in the syntax tree.
Each subclass implements the <code>compileNode</code> method, which performs the Each subclass implements the <code>compileNode</code> method, which performs the
code generation for that node. To compile a node to JavaScript, code generation for that node. To compile a node to JavaScript,
call <code>compile</code> on it, which wraps <code>compileNode</code> in some generic extra smarts, call <code>compile</code> on it, which wraps <code>compileNode</code> in some generic extra smarts,
@ -19,7 +12,7 @@ being requested by the surrounding function), information about the current
scope, and indentation level.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.BaseNode = </span><span class="nx">class</span> <span class="nx">BaseNode</span> scope, and indentation level.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.BaseNode = </span><span class="nx">class</span> <span class="nx">BaseNode</span>
<span class="nx">constructor</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">constructor</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="vi">@tags = </span><span class="p">{}</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Common logic for determining whether to wrap this node in a closure before <span class="vi">@tags = </span><span class="p">{}</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Common logic for determining whether to wrap this node in a closure before
compiling it, or to compile directly. We need to wrap if this node is a compiling it, or to compile directly. We need to wrap if this node is a
<em>statement</em>, and it's not a <em>pureStatement</em>, and we're not at <em>statement</em>, and it's not a <em>pureStatement</em>, and we're not at
the top level of a block (which would be unnecessary), and we haven't the top level of a block (which would be unnecessary), and we haven't
@ -36,11 +29,14 @@ top-level statement within the function body.</p> </td>
<span class="nv">closure = </span><span class="nx">@isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@isPureStatement</span><span class="p">()</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">top</span> <span class="o">and</span> <span class="nv">closure = </span><span class="nx">@isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@isPureStatement</span><span class="p">()</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">top</span> <span class="o">and</span>
<span class="o">not</span> <span class="nx">@options</span><span class="p">.</span><span class="nx">asStatement</span> <span class="o">and</span> <span class="k">this</span> <span class="o">not</span> <span class="k">instanceof</span> <span class="nx">CommentNode</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@options</span><span class="p">.</span><span class="nx">asStatement</span> <span class="o">and</span> <span class="k">this</span> <span class="o">not</span> <span class="k">instanceof</span> <span class="nx">CommentNode</span> <span class="o">and</span>
<span class="o">not</span> <span class="nx">@containsPureStatement</span><span class="p">()</span> <span class="o">not</span> <span class="nx">@containsPureStatement</span><span class="p">()</span>
<span class="k">if</span> <span class="nx">closure</span> <span class="k">then</span> <span class="nx">@compileClosure</span><span class="p">(</span><span class="nx">@options</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@compileNode</span><span class="p">(</span><span class="nx">@options</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Statements converted into expressions via closure-wrapping share a scope <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">startLevel</span><span class="p">()</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">keepLevel</span>
<span class="nv">code = </span><span class="k">if</span> <span class="nx">closure</span> <span class="k">then</span> <span class="nx">@compileClosure</span><span class="p">(</span><span class="nx">@options</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@compileNode</span><span class="p">(</span><span class="nx">@options</span><span class="p">)</span>
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">endLevel</span><span class="p">()</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">keepLevel</span>
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Statements converted into expressions via closure-wrapping share a scope
object with their parent closure, to preserve the expected lexical scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileClosure</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> object with their parent closure, to preserve the expected lexical scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileClosure</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="vi">@tab = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="vi">@tab = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span>
<span class="nv">o.sharedScope = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span> <span class="nv">o.sharedScope = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span>
<span class="nx">ClosureNode</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>If the code generation wishes to use the result of a complex expression <span class="nx">ClosureNode</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>If the code generation wishes to use the result of a complex expression
in multiple places, ensure that the expression is only ever evaluated once, in multiple places, ensure that the expression is only ever evaluated once,
by assigning it to a temporary variable.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileReference</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span> by assigning it to a temporary variable.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileReference</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">options</span> <span class="o">or=</span> <span class="p">{}</span> <span class="nx">options</span> <span class="o">or=</span> <span class="p">{}</span>
@ -50,18 +46,18 @@ by assigning it to a temporary variable.</p> </td> <td c
<span class="k">else</span> <span class="k">if</span> <span class="k">this</span> <span class="k">instanceof</span> <span class="nx">ValueNode</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">assignment</span> <span class="k">else</span> <span class="k">if</span> <span class="k">this</span> <span class="k">instanceof</span> <span class="nx">ValueNode</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">assignment</span>
<span class="k">this</span><span class="p">.</span><span class="nx">cacheIndexes</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">cacheIndexes</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="k">else</span> <span class="k">else</span>
<span class="nv">reference = </span><span class="nx">literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">reference = </span><span class="nx">literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ref&#39;</span>
<span class="nv">compiled = </span><span class="k">new</span> <span class="nx">AssignNode</span> <span class="nx">reference</span><span class="p">,</span> <span class="k">this</span> <span class="nv">compiled = </span><span class="k">new</span> <span class="nx">AssignNode</span> <span class="nx">reference</span><span class="p">,</span> <span class="k">this</span>
<span class="p">[</span><span class="nx">compiled</span><span class="p">,</span> <span class="nx">reference</span><span class="p">]</span> <span class="p">[</span><span class="nx">compiled</span><span class="p">,</span> <span class="nx">reference</span><span class="p">]</span>
<span class="k">return</span> <span class="p">[</span><span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)]</span> <span class="k">if</span> <span class="nx">options</span><span class="p">.</span><span class="nx">precompile</span> <span class="k">return</span> <span class="p">[</span><span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)]</span> <span class="k">if</span> <span class="nx">options</span><span class="p">.</span><span class="nx">precompile</span>
<span class="nx">pair</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Convenience method to grab the current indentation level, plus tabbing in.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">idt</span><span class="o">:</span> <span class="p">(</span><span class="nx">tabs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">pair</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Convenience method to grab the current indentation level, plus tabbing in.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">idt</span><span class="o">:</span> <span class="p">(</span><span class="nx">tabs</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">idt = </span><span class="nx">@tab</span> <span class="o">or</span> <span class="s1">&#39;&#39;</span> <span class="nv">idt = </span><span class="nx">@tab</span> <span class="o">or</span> <span class="s1">&#39;&#39;</span>
<span class="nv">num = </span><span class="p">(</span><span class="nx">tabs</span> <span class="o">or</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="nv">num = </span><span class="p">(</span><span class="nx">tabs</span> <span class="o">or</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="nx">idt</span> <span class="o">+=</span> <span class="nx">TAB</span> <span class="k">while</span> <span class="nx">num</span> <span class="o">-=</span> <span class="mi">1</span> <span class="nx">idt</span> <span class="o">+=</span> <span class="nx">TAB</span> <span class="k">while</span> <span class="nx">num</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="nx">idt</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Construct a node that returns the current node's result. <span class="nx">idt</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Construct a node that returns the current node's result.
Note that this is overridden for smarter behavior for Note that this is overridden for smarter behavior for
many statement nodes (eg IfNode, ForNode)...</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span> many statement nodes (eg IfNode, ForNode)...</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="k">new</span> <span class="nx">ReturnNode</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>Does this node, or any of its children, contain a node of a certain kind? <span class="k">new</span> <span class="nx">ReturnNode</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Does this node, or any of its children, contain a node of a certain kind?
Recursively traverses down the <em>children</em> of the nodes, yielding to a block Recursively traverses down the <em>children</em> of the nodes, yielding to a block
and returning true when the block finds a match. <code>contains</code> does not cross and returning true when the block finds a match. <code>contains</code> does not cross
scope boundaries.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">contains</span><span class="o">:</span> <span class="p">(</span><span class="nx">block</span><span class="p">)</span> <span class="o">-&gt;</span> scope boundaries.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">contains</span><span class="o">:</span> <span class="p">(</span><span class="nx">block</span><span class="p">)</span> <span class="o">-&gt;</span>
@ -70,10 +66,10 @@ scope boundaries.</p> </td> <td class="code">
<span class="k">if</span> <span class="nx">block</span><span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="k">if</span> <span class="nx">block</span><span class="p">(</span><span class="nx">node</span><span class="p">)</span>
<span class="nv">contains = </span><span class="kc">true</span> <span class="nv">contains = </span><span class="kc">true</span>
<span class="k">return</span> <span class="kc">false</span> <span class="k">return</span> <span class="kc">false</span>
<span class="nx">contains</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>Is this node of a certain type, or does it contain the type?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">containsType</span><span class="o">:</span> <span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">contains</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>Is this node of a certain type, or does it contain the type?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">containsType</span><span class="o">:</span> <span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">this</span> <span class="k">instanceof</span> <span class="nx">type</span> <span class="o">or</span> <span class="nx">@contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span> <span class="k">instanceof</span> <span class="nx">type</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-13">#</a> </div> <p>Convenience for the most common use of contains. Does the node contain <span class="k">this</span> <span class="k">instanceof</span> <span class="nx">type</span> <span class="o">or</span> <span class="nx">@contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span> <span class="k">instanceof</span> <span class="nx">type</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>Convenience for the most common use of contains. Does the node contain
a pure statement?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">containsPureStatement</span><span class="o">:</span> <span class="o">-&gt;</span> a pure statement?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">containsPureStatement</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@isPureStatement</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span><span class="p">.</span><span class="nx">isPureStatement</span> <span class="o">and</span> <span class="nx">n</span><span class="p">.</span><span class="nx">isPureStatement</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-14">#</a> </div> <p>Perform an in-order traversal of the AST. Crosses scope boundaries.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">traverse</span><span class="o">:</span> <span class="p">(</span><span class="nx">block</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@traverseChildren</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">block</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-15">#</a> </div> <p><code>toString</code> representation of the node, for inspecting the parse tree. <span class="nx">@isPureStatement</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span><span class="p">.</span><span class="nx">isPureStatement</span> <span class="o">and</span> <span class="nx">n</span><span class="p">.</span><span class="nx">isPureStatement</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-13">#</a> </div> <p>Perform an in-order traversal of the AST. Crosses scope boundaries.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">traverse</span><span class="o">:</span> <span class="p">(</span><span class="nx">block</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@traverseChildren</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">block</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-14">#</a> </div> <p><code>toString</code> representation of the node, for inspecting the parse tree.
This is what <code>coffee --nodes</code> prints out.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">,</span> <span class="nx">override</span><span class="p">)</span> <span class="o">-&gt;</span> This is what <code>coffee --nodes</code> prints out.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">,</span> <span class="nx">override</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">idt</span> <span class="o">or=</span> <span class="s1">&#39;&#39;</span> <span class="nx">idt</span> <span class="o">or=</span> <span class="s1">&#39;&#39;</span>
<span class="nv">children = </span><span class="p">(</span><span class="nx">child</span><span class="p">.</span><span class="nx">toString</span> <span class="nx">idt</span> <span class="o">+</span> <span class="nx">TAB</span> <span class="k">for</span> <span class="nx">child</span> <span class="k">in</span> <span class="nx">@collectChildren</span><span class="p">()).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="nv">children = </span><span class="p">(</span><span class="nx">child</span><span class="p">.</span><span class="nx">toString</span> <span class="nx">idt</span> <span class="o">+</span> <span class="nx">TAB</span> <span class="k">for</span> <span class="nx">child</span> <span class="k">in</span> <span class="nx">@collectChildren</span><span class="p">()).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
@ -93,14 +89,14 @@ This is what <code>coffee --nodes</code> prints out.</p> </td>
<span class="nx">traverseChildren</span><span class="o">:</span> <span class="p">(</span><span class="nx">crossScope</span><span class="p">,</span> <span class="nx">func</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">traverseChildren</span><span class="o">:</span> <span class="p">(</span><span class="nx">crossScope</span><span class="p">,</span> <span class="nx">func</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@eachChild</span> <span class="p">(</span><span class="nx">child</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@eachChild</span> <span class="p">(</span><span class="nx">child</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">func</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">)</span> <span class="nx">func</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">)</span>
<span class="nx">child</span><span class="p">.</span><span class="nx">traverseChildren</span><span class="p">(</span><span class="nx">crossScope</span><span class="p">,</span> <span class="nx">func</span><span class="p">)</span> <span class="k">if</span> <span class="nx">child</span> <span class="k">instanceof</span> <span class="nx">BaseNode</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-16">#</a> </div> <p>Default implementations of the common node properties and methods. Nodes <span class="nx">child</span><span class="p">.</span><span class="nx">traverseChildren</span><span class="p">(</span><span class="nx">crossScope</span><span class="p">,</span> <span class="nx">func</span><span class="p">)</span> <span class="k">if</span> <span class="nx">child</span> <span class="k">instanceof</span> <span class="nx">BaseNode</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-15">#</a> </div> <p>Default implementations of the common node properties and methods. Nodes
will override these with custom logic, if needed.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;BaseNode&#39;</span> will override these with custom logic, if needed.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;BaseNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[]</span>
<span class="nx">unwrap</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="k">this</span> <span class="nx">unwrap</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="k">this</span>
<span class="nx">isStatement</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">no</span> <span class="nx">isStatement</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">no</span>
<span class="nx">isPureStatement</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">no</span> <span class="nx">isPureStatement</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">no</span>
<span class="nx">topSensitive</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">no</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-17">#</a> </div> <h3>Expressions</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-18">#</a> </div> <p>The expressions body is the list of expressions that forms the body of an <span class="nx">topSensitive</span> <span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">no</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-16">#</a> </div> <h3>Expressions</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-17">#</a> </div> <p>The expressions body is the list of expressions that forms the body of an
indented block of code -- the implementation of a function, a clause in an indented block of code -- the implementation of a function, a clause in an
<code>if</code>, <code>switch</code>, or <code>try</code>, and so on...</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Expressions = </span><span class="nx">class</span> <span class="nx">Expressions</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <code>if</code>, <code>switch</code>, or <code>try</code>, and so on...</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Expressions = </span><span class="nx">class</span> <span class="nx">Expressions</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
@ -110,26 +106,26 @@ indented block of code -- the implementation of a function, a clause in an
<span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">nodes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">nodes</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">super</span><span class="p">()</span> <span class="k">super</span><span class="p">()</span>
<span class="vi">@expressions = </span><span class="nx">compact</span> <span class="nx">flatten</span> <span class="nx">nodes</span> <span class="o">or</span> <span class="p">[]</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-19">#</a> </div> <p>Tack an expression on to the end of this expression list.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">push</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="vi">@expressions = </span><span class="nx">compact</span> <span class="nx">flatten</span> <span class="nx">nodes</span> <span class="o">or</span> <span class="p">[]</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-18">#</a> </div> <p>Tack an expression on to the end of this expression list.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">push</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@expressions</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="nx">@expressions</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">node</span><span class="p">)</span>
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-20">#</a> </div> <p>Add an expression at the beginning of this expression list.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">unshift</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-19">#</a> </div> <p>Add an expression at the beginning of this expression list.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">unshift</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@expressions</span><span class="p">.</span><span class="nx">unshift</span><span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="nx">@expressions</span><span class="p">.</span><span class="nx">unshift</span><span class="p">(</span><span class="nx">node</span><span class="p">)</span>
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-21">#</a> </div> <p>If this Expressions consists of just a single node, unwrap it by pulling <span class="k">this</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-20">#</a> </div> <p>If this Expressions consists of just a single node, unwrap it by pulling
it back out.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">unwrap</span><span class="o">:</span> <span class="o">-&gt;</span> it back out.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">unwrap</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">@expressions</span><span class="p">.</span><span class="nx">length</span> <span class="o">is</span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">@expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-22">#</a> </div> <p>Is this an empty block of code?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">empty</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="nx">@expressions</span><span class="p">.</span><span class="nx">length</span> <span class="o">is</span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">@expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-21">#</a> </div> <p>Is this an empty block of code?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">empty</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@expressions</span><span class="p">.</span><span class="nx">length</span> <span class="o">is</span> <span class="mi">0</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-23">#</a> </div> <p>An Expressions node does not return its entire body, rather it <span class="nx">@expressions</span><span class="p">.</span><span class="nx">length</span> <span class="o">is</span> <span class="mi">0</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-22">#</a> </div> <p>An Expressions node does not return its entire body, rather it
ensures that the final expression is returned.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span> ensures that the final expression is returned.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nv">idx = </span><span class="nx">@expressions</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span> <span class="nv">idx = </span><span class="nx">@expressions</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span>
<span class="nv">last = </span><span class="nx">@expressions</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="nv">last = </span><span class="nx">@expressions</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span>
<span class="nv">last = </span><span class="nx">@expressions</span><span class="p">[</span><span class="nx">idx</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nx">last</span> <span class="k">instanceof</span> <span class="nx">CommentNode</span> <span class="nv">last = </span><span class="nx">@expressions</span><span class="p">[</span><span class="nx">idx</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nx">last</span> <span class="k">instanceof</span> <span class="nx">CommentNode</span>
<span class="k">return</span> <span class="k">this</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">last</span> <span class="o">or</span> <span class="nx">last</span> <span class="k">instanceof</span> <span class="nx">ReturnNode</span> <span class="k">return</span> <span class="k">this</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">last</span> <span class="o">or</span> <span class="nx">last</span> <span class="k">instanceof</span> <span class="nx">ReturnNode</span>
<span class="nx">@expressions</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="nx">last</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span> <span class="nx">@expressions</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="nx">last</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span>
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-24">#</a> </div> <p>An <strong>Expressions</strong> is the only node that can serve as the root.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compile</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-23">#</a> </div> <p>An <strong>Expressions</strong> is the only node that can serve as the root.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compile</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">o</span> <span class="o">or=</span> <span class="p">{}</span> <span class="nx">o</span> <span class="o">or=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span> <span class="k">then</span> <span class="k">super</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@compileRoot</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span> <span class="k">then</span> <span class="k">super</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@compileRoot</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="p">(</span><span class="nx">@compileExpression</span><span class="p">(</span><span class="nx">node</span><span class="p">,</span> <span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span> <span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">@expressions</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s2">&quot;\n&quot;</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-25">#</a> </div> <p>If we happen to be the top-level <strong>Expressions</strong>, wrap everything in <span class="p">(</span><span class="nx">@compileExpression</span><span class="p">(</span><span class="nx">node</span><span class="p">,</span> <span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span> <span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">@expressions</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s2">&quot;\n&quot;</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-24">#</a> </div> <p>If we happen to be the top-level <strong>Expressions</strong>, wrap everything in
a safety closure, unless requested not to. a safety closure, unless requested not to.
It would be better not to generate them in the first place, but for now, It would be better not to generate them in the first place, but for now,
clean up obvious double-parentheses.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileRoot</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> clean up obvious double-parentheses.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileRoot</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
@ -137,20 +133,20 @@ clean up obvious double-parentheses.</p> </td> <td class
<span class="nv">o.scope = </span><span class="k">new</span> <span class="nx">Scope</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="kc">null</span><span class="p">)</span> <span class="nv">o.scope = </span><span class="k">new</span> <span class="nx">Scope</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="kc">null</span><span class="p">)</span>
<span class="nv">code = </span><span class="nx">@compileWithDeclarations</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">code = </span><span class="nx">@compileWithDeclarations</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nv">code = </span><span class="nx">code</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">TRAILING_WHITESPACE</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="nv">code = </span><span class="nx">code</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">TRAILING_WHITESPACE</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">noWrap</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">&quot;(function() {\n#{code}\n})();\n&quot;</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-26">#</a> </div> <p>Compile the expressions body for the contents of a function, with <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">noWrap</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">&quot;(function() {\n#{code}\n}).call(this);\n&quot;</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-25">#</a> </div> <p>Compile the expressions body for the contents of a function, with
declarations of all inner variables pushed up to the top.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileWithDeclarations</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> declarations of all inner variables pushed up to the top.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileWithDeclarations</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">code = </span><span class="nx">@compileNode</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">code = </span><span class="nx">@compileNode</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nv">code = </span><span class="s2">&quot;#{@tab}var #{o.scope.compiledAssignments()};\n#{code}&quot;</span> <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">hasAssignments</span><span class="p">(</span><span class="k">this</span><span class="p">)</span> <span class="nv">code = </span><span class="s2">&quot;#{@tab}var #{o.scope.compiledAssignments()};\n#{code}&quot;</span> <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">hasAssignments</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
<span class="nv">code = </span><span class="s2">&quot;#{@tab}var #{o.scope.compiledDeclarations()};\n#{code}&quot;</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">globals</span> <span class="o">and</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">hasDeclarations</span><span class="p">(</span><span class="k">this</span><span class="p">)</span> <span class="nv">code = </span><span class="s2">&quot;#{@tab}var #{o.scope.compiledDeclarations()};\n#{code}&quot;</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">globals</span> <span class="o">and</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">hasDeclarations</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-27">#</a> </div> <p>Compiles a single expression within the expressions body. If we need to <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-26">#</a> </div> <p>Compiles a single expression within the expressions body. If we need to
return the result, and it's an expression, simply return it. If it's a return the result, and it's an expression, simply return it. If it's a
statement, ask the statement to do so.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileExpression</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> statement, ask the statement to do so.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileExpression</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="vi">@tab = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="vi">@tab = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span>
<span class="nv">compiledNode = </span><span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span> <span class="nv">compiledNode = </span><span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span>
<span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">then</span> <span class="nx">compiledNode</span> <span class="k">else</span> <span class="s2">&quot;#{@idt()}#{compiledNode};&quot;</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-28">#</a> </div> <p>Wrap up the given nodes as an <strong>Expressions</strong>, unless it already happens <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">then</span> <span class="nx">compiledNode</span> <span class="k">else</span> <span class="s2">&quot;#{@idt()}#{compiledNode};&quot;</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-27">#</a> </div> <p>Wrap up the given nodes as an <strong>Expressions</strong>, unless it already happens
to be one.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">Expressions.wrap = </span><span class="p">(</span><span class="nx">nodes</span><span class="p">)</span> <span class="o">-&gt;</span> to be one.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">Expressions.wrap = </span><span class="p">(</span><span class="nx">nodes</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="nx">nodes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nx">nodes</span><span class="p">.</span><span class="nx">length</span> <span class="o">is</span> <span class="mi">1</span> <span class="o">and</span> <span class="nx">nodes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">instanceof</span> <span class="nx">Expressions</span> <span class="k">return</span> <span class="nx">nodes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nx">nodes</span><span class="p">.</span><span class="nx">length</span> <span class="o">is</span> <span class="mi">1</span> <span class="o">and</span> <span class="nx">nodes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">instanceof</span> <span class="nx">Expressions</span>
<span class="k">new</span> <span class="nx">Expressions</span><span class="p">(</span><span class="nx">nodes</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-29">#</a> </div> <h3>LiteralNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-30">#</a> </div> <p>Literals are static values that can be passed through directly into <span class="k">new</span> <span class="nx">Expressions</span><span class="p">(</span><span class="nx">nodes</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-28">#</a> </div> <h3>LiteralNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-29">#</a> </div> <p>Literals are static values that can be passed through directly into
JavaScript without translation, such as: strings, numbers, JavaScript without translation, such as: strings, numbers,
<code>true</code>, <code>false</code>, <code>null</code>...</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.LiteralNode = </span><span class="nx">class</span> <span class="nx">LiteralNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <code>true</code>, <code>false</code>, <code>null</code>...</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.LiteralNode = </span><span class="nx">class</span> <span class="nx">LiteralNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
@ -160,7 +156,7 @@ JavaScript without translation, such as: strings, numbers,
<span class="k">super</span><span class="p">()</span> <span class="k">super</span><span class="p">()</span>
<span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">@isStatement</span><span class="p">()</span> <span class="k">then</span> <span class="k">this</span> <span class="k">else</span> <span class="k">super</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-31">#</a> </div> <p>Break and continue must be treated as pure statements -- they lose their <span class="k">if</span> <span class="nx">@isStatement</span><span class="p">()</span> <span class="k">then</span> <span class="k">this</span> <span class="k">else</span> <span class="k">super</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-30">#</a> </div> <p>Break and continue must be treated as pure statements -- they lose their
meaning when wrapped in a closure.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span> meaning when wrapped in a closure.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@value</span> <span class="o">is</span> <span class="s1">&#39;break&#39;</span> <span class="o">or</span> <span class="nx">@value</span> <span class="o">is</span> <span class="s1">&#39;continue&#39;</span> <span class="o">or</span> <span class="nx">@value</span> <span class="o">is</span> <span class="s1">&#39;debugger&#39;</span> <span class="nx">@value</span> <span class="o">is</span> <span class="s1">&#39;break&#39;</span> <span class="o">or</span> <span class="nx">@value</span> <span class="o">is</span> <span class="s1">&#39;continue&#39;</span> <span class="o">or</span> <span class="nx">@value</span> <span class="o">is</span> <span class="s1">&#39;debugger&#39;</span>
<span class="nx">isPureStatement</span><span class="o">:</span> <span class="nx">LiteralNode</span><span class="o">::</span><span class="nx">isStatement</span> <span class="nx">isPureStatement</span><span class="o">:</span> <span class="nx">LiteralNode</span><span class="o">::</span><span class="nx">isStatement</span>
@ -171,7 +167,7 @@ meaning when wrapped in a closure.</p> </td> <td class="
<span class="nx">idt</span> <span class="o">+</span> <span class="nx">@value</span> <span class="o">+</span> <span class="nx">end</span> <span class="nx">idt</span> <span class="o">+</span> <span class="nx">@value</span> <span class="o">+</span> <span class="nx">end</span>
<span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="s1">&#39;&quot;&#39;</span> <span class="o">+</span> <span class="nx">@value</span> <span class="o">+</span> <span class="s1">&#39;&quot;&#39;</span></pre></div> </td> </tr> <tr id="section-32"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-32">#</a> </div> <h3>ReturnNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-33"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-33">#</a> </div> <p>A <code>return</code> is a <em>pureStatement</em> -- wrapping it in a closure wouldn't <span class="s1">&#39;&quot;&#39;</span> <span class="o">+</span> <span class="nx">@value</span> <span class="o">+</span> <span class="s1">&#39;&quot;&#39;</span></pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-31">#</a> </div> <h3>ReturnNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-32"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-32">#</a> </div> <p>A <code>return</code> is a <em>pureStatement</em> -- wrapping it in a closure wouldn't
make sense.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ReturnNode = </span><span class="nx">class</span> <span class="nx">ReturnNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> make sense.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ReturnNode = </span><span class="nx">class</span> <span class="nx">ReturnNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ReturnNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ReturnNode&#39;</span>
@ -192,18 +188,18 @@ make sense.</p> </td> <td class="code"> <d
<span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">o.asStatement = </span><span class="kc">true</span> <span class="k">if</span> <span class="nx">@expression</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">o.asStatement = </span><span class="kc">true</span> <span class="k">if</span> <span class="nx">@expression</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="s2">&quot;#{@tab}return #{@expression.compile(o)};&quot;</span></pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-34">#</a> </div> <h3>ValueNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-35"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-35">#</a> </div> <p>A value, variable or literal or parenthesized, indexed or dotted into, <span class="s2">&quot;#{@tab}return #{@expression.compile(o)};&quot;</span></pre></div> </td> </tr> <tr id="section-33"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-33">#</a> </div> <h3>ValueNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-34">#</a> </div> <p>A value, variable or literal or parenthesized, indexed or dotted into,
or vanilla.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ValueNode = </span><span class="nx">class</span> <span class="nx">ValueNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> or vanilla.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ValueNode = </span><span class="nx">class</span> <span class="nx">ValueNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ValueNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ValueNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;base&#39;</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-36">#</a> </div> <p>A <strong>ValueNode</strong> has a base and a list of property accesses.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@base</span><span class="p">,</span> <span class="nx">@properties</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;base&#39;</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-35"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-35">#</a> </div> <p>A <strong>ValueNode</strong> has a base and a list of property accesses.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@base</span><span class="p">,</span> <span class="nx">@properties</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">super</span><span class="p">()</span> <span class="k">super</span><span class="p">()</span>
<span class="nx">@properties</span> <span class="o">or=</span> <span class="p">[]</span></pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-37">#</a> </div> <p>Add a property access to the list.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">push</span><span class="o">:</span> <span class="p">(</span><span class="nx">prop</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@properties</span> <span class="o">or=</span> <span class="p">[]</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-36">#</a> </div> <p>Add a property access to the list.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">push</span><span class="o">:</span> <span class="p">(</span><span class="nx">prop</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@properties</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">prop</span><span class="p">)</span> <span class="nx">@properties</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">prop</span><span class="p">)</span>
<span class="k">this</span> <span class="k">this</span>
<span class="nx">hasProperties</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">hasProperties</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="o">!!</span><span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-38"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-38">#</a> </div> <p>Some boolean checks for the benefit of other nodes.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isArray</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="o">!!</span><span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-37">#</a> </div> <p>Some boolean checks for the benefit of other nodes.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isArray</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@base</span> <span class="k">instanceof</span> <span class="nx">ArrayNode</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="nx">@base</span> <span class="k">instanceof</span> <span class="nx">ArrayNode</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@hasProperties</span><span class="p">()</span>
<span class="nx">isObject</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">isObject</span><span class="o">:</span> <span class="o">-&gt;</span>
@ -213,13 +209,13 @@ or vanilla.</p> </td> <td class="code"> <d
<span class="nx">@hasProperties</span><span class="p">()</span> <span class="o">and</span> <span class="nx">@properties</span><span class="p">[</span><span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="k">instanceof</span> <span class="nx">SliceNode</span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="o">and</span> <span class="nx">@properties</span><span class="p">[</span><span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="k">instanceof</span> <span class="nx">SliceNode</span>
<span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="k">then</span> <span class="k">super</span><span class="p">()</span> <span class="k">else</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-39"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-39">#</a> </div> <p>The value can be unwrapped as its inner node, if there are no attached <span class="k">if</span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="k">then</span> <span class="k">super</span><span class="p">()</span> <span class="k">else</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-38"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-38">#</a> </div> <p>The value can be unwrapped as its inner node, if there are no attached
properties.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">unwrap</span><span class="o">:</span> <span class="o">-&gt;</span> properties.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">unwrap</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="k">this</span> <span class="k">else</span> <span class="nx">@base</span></pre></div> </td> </tr> <tr id="section-40"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-40">#</a> </div> <p>Values are considered to be statements if their base is a statement.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isStatement</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="k">this</span> <span class="k">else</span> <span class="nx">@base</span></pre></div> </td> </tr> <tr id="section-39"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-39">#</a> </div> <p>Values are considered to be statements if their base is a statement.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isStatement</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@base</span><span class="p">.</span><span class="nx">isStatement</span> <span class="o">and</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">isStatement</span> <span class="o">and</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@hasProperties</span><span class="p">()</span>
<span class="nx">isNumber</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">isNumber</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@base</span> <span class="k">instanceof</span> <span class="nx">LiteralNode</span> <span class="o">and</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span> <span class="nx">NUMBER</span></pre></div> </td> </tr> <tr id="section-41"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-41">#</a> </div> <p>If the value node has indexes containing function calls, and the value node <span class="nx">@base</span> <span class="k">instanceof</span> <span class="nx">LiteralNode</span> <span class="o">and</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span> <span class="nx">NUMBER</span></pre></div> </td> </tr> <tr id="section-40"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-40">#</a> </div> <p>If the value node has indexes containing function calls, and the value node
needs to be used twice, in compound assignment ... then we need to cache needs to be used twice, in compound assignment ... then we need to cache
the value of the indexes.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">cacheIndexes</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> the value of the indexes.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">cacheIndexes</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">copy = </span><span class="k">new</span> <span class="nx">ValueNode</span> <span class="nx">@base</span><span class="p">,</span> <span class="nx">@properties</span><span class="p">[</span><span class="mi">0</span><span class="p">..]</span> <span class="nv">copy = </span><span class="k">new</span> <span class="nx">ValueNode</span> <span class="nx">@base</span><span class="p">,</span> <span class="nx">@properties</span><span class="p">[</span><span class="mi">0</span><span class="p">..]</span>
@ -230,8 +226,8 @@ the value of the indexes.</p> </td> <td class="code">
<span class="p">[</span><span class="nx">index</span><span class="p">,</span> <span class="nx">indexVar</span><span class="p">]</span> <span class="o">=</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">index</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span> <span class="p">[</span><span class="nx">index</span><span class="p">,</span> <span class="nx">indexVar</span><span class="p">]</span> <span class="o">=</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">index</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span>
<span class="k">this</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">IndexNode</span> <span class="nx">index</span> <span class="k">this</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">IndexNode</span> <span class="nx">index</span>
<span class="nx">copy</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">IndexNode</span> <span class="nx">indexVar</span> <span class="nx">copy</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">IndexNode</span> <span class="nx">indexVar</span>
<span class="p">[</span><span class="k">this</span><span class="p">,</span> <span class="nx">copy</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-42"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-42">#</a> </div> <p>Override compile to unwrap the value when possible.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compile</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="k">this</span><span class="p">,</span> <span class="nx">copy</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-41"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-41">#</a> </div> <p>Override compile to unwrap the value when possible.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compile</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">top</span> <span class="o">or</span> <span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="k">super</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-43"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-43">#</a> </div> <p>We compile a value to JavaScript by compiling and joining each property. <span class="k">if</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">top</span> <span class="o">or</span> <span class="nx">@properties</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="k">super</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-42"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-42">#</a> </div> <p>We compile a value to JavaScript by compiling and joining each property.
Things get much more insteresting if the chain of properties has <em>soak</em> Things get much more insteresting if the chain of properties has <em>soak</em>
operators <code>?.</code> interspersed. Then we have to take care not to accidentally operators <code>?.</code> interspersed. Then we have to take care not to accidentally
evaluate a anything twice when building the soak chain.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> evaluate a anything twice when building the soak chain.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
@ -252,7 +248,7 @@ evaluate a anything twice when building the soak chain.</p> </td>
<span class="vi">@source = </span><span class="nx">baseline</span> <span class="vi">@source = </span><span class="nx">baseline</span>
<span class="k">if</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">soakNode</span> <span class="k">if</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">soakNode</span>
<span class="k">if</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">containsType</span><span class="p">(</span><span class="nx">CallNode</span><span class="p">)</span> <span class="o">and</span> <span class="nx">i</span> <span class="o">is</span> <span class="mi">0</span> <span class="k">if</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">containsType</span><span class="p">(</span><span class="nx">CallNode</span><span class="p">)</span> <span class="o">and</span> <span class="nx">i</span> <span class="o">is</span> <span class="mi">0</span>
<span class="nv">temp = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">temp = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ref&#39;</span>
<span class="nv">complete = </span><span class="s2">&quot;(#{ baseline = temp } = (#{complete}))&quot;</span> <span class="nv">complete = </span><span class="s2">&quot;(#{ baseline = temp } = (#{complete}))&quot;</span>
<span class="nv">complete = </span><span class="k">if</span> <span class="nx">i</span> <span class="o">is</span> <span class="mi">0</span> <span class="nv">complete = </span><span class="k">if</span> <span class="nx">i</span> <span class="o">is</span> <span class="mi">0</span>
<span class="s2">&quot;(typeof #{complete} === \&quot;undefined\&quot; || #{baseline} === null) ? undefined : &quot;</span> <span class="s2">&quot;(typeof #{complete} === \&quot;undefined\&quot; || #{baseline} === null) ? undefined : &quot;</span>
@ -268,7 +264,7 @@ evaluate a anything twice when building the soak chain.</p> </td>
<span class="nx">complete</span> <span class="o">+=</span> <span class="nx">part</span> <span class="nx">complete</span> <span class="o">+=</span> <span class="nx">part</span>
<span class="vi">@last = </span><span class="nx">part</span> <span class="vi">@last = </span><span class="nx">part</span>
<span class="k">if</span> <span class="nx">op</span> <span class="o">and</span> <span class="nx">@wrapped</span> <span class="k">then</span> <span class="s2">&quot;(#{complete})&quot;</span> <span class="k">else</span> <span class="nx">complete</span></pre></div> </td> </tr> <tr id="section-44"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-44">#</a> </div> <h3>CommentNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-45"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-45">#</a> </div> <p>CoffeeScript passes through block comments as JavaScript block comments <span class="k">if</span> <span class="nx">op</span> <span class="o">and</span> <span class="nx">@wrapped</span> <span class="k">then</span> <span class="s2">&quot;(#{complete})&quot;</span> <span class="k">else</span> <span class="nx">complete</span></pre></div> </td> </tr> <tr id="section-43"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-43">#</a> </div> <h3>CommentNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-44"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-44">#</a> </div> <p>CoffeeScript passes through block comments as JavaScript block comments
at the same position.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.CommentNode = </span><span class="nx">class</span> <span class="nx">CommentNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> at the same position.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.CommentNode = </span><span class="nx">class</span> <span class="nx">CommentNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;CommentNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;CommentNode&#39;</span>
@ -281,7 +277,7 @@ at the same position.</p> </td> <td class="code">
<span class="k">this</span> <span class="k">this</span>
<span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@tab</span> <span class="o">+</span> <span class="s1">&#39;/*&#39;</span> <span class="o">+</span> <span class="nx">@comment</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\r?\n/g</span><span class="p">,</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">@tab</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;*/&#39;</span></pre></div> </td> </tr> <tr id="section-46"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-46">#</a> </div> <h3>CallNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-47"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-47">#</a> </div> <p>Node for a function invocation. Takes care of converting <code>super()</code> calls into <span class="nx">@tab</span> <span class="o">+</span> <span class="s1">&#39;/*&#39;</span> <span class="o">+</span> <span class="nx">@comment</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\r?\n/g</span><span class="p">,</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">@tab</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;*/&#39;</span></pre></div> </td> </tr> <tr id="section-45"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-45">#</a> </div> <h3>CallNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-46"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-46">#</a> </div> <p>Node for a function invocation. Takes care of converting <code>super()</code> calls into
calls against the prototype's function of the same name.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.CallNode = </span><span class="nx">class</span> <span class="nx">CallNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> calls against the prototype's function of the same name.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.CallNode = </span><span class="nx">class</span> <span class="nx">CallNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;CallNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;CallNode&#39;</span>
@ -295,26 +291,33 @@ calls against the prototype's function of the same name.</p> </td>
<span class="nx">@args</span> <span class="o">or=</span> <span class="p">[]</span> <span class="nx">@args</span> <span class="o">or=</span> <span class="p">[]</span>
<span class="vi">@first = @last = </span><span class="s1">&#39;&#39;</span> <span class="vi">@first = @last = </span><span class="s1">&#39;&#39;</span>
<span class="vi">@compileSplatArguments = </span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="vi">@compileSplatArguments = </span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">SplatNode</span><span class="p">.</span><span class="nx">compileSplattedArray</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">@args</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-48"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-48">#</a> </div> <p>Tag this invocation as creating a new instance.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">newInstance</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">SplatNode</span><span class="p">.</span><span class="nx">compileSplattedArray</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">@args</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-47"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-47">#</a> </div> <p>Tag this invocation as creating a new instance.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">newInstance</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="vi">@isNew = </span><span class="kc">true</span> <span class="vi">@isNew = </span><span class="kc">true</span>
<span class="k">this</span> <span class="k">this</span>
<span class="nx">prefix</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">prefix</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">@isNew</span> <span class="k">then</span> <span class="s1">&#39;new &#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span></pre></div> </td> </tr> <tr id="section-49"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-49">#</a> </div> <p>Grab the reference to the superclass' implementation of the current method.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">superReference</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="nx">@isNew</span> <span class="k">then</span> <span class="s1">&#39;new &#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span></pre></div> </td> </tr> <tr id="section-48"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-48">#</a> </div> <p>Grab the reference to the superclass' implementation of the current method.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">superReference</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">&quot;cannot call super outside of a function&quot;</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">&quot;cannot call super outside of a function&quot;</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span>
<span class="nv">methname = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="p">.</span><span class="nx">name</span> <span class="nv">methname = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="p">.</span><span class="nx">name</span>
<span class="nv">meth = </span><span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="p">.</span><span class="nx">proto</span> <span class="nv">meth = </span><span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="p">.</span><span class="nx">proto</span>
<span class="s2">&quot;#{o.scope.method.proto}.__super__.#{methname}&quot;</span> <span class="s2">&quot;#{o.scope.method.proto}.__super__.#{methname}&quot;</span>
<span class="k">else</span> <span class="k">if</span> <span class="nx">methname</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">methname</span>
<span class="s2">&quot;#{methname}.__super__.constructor&quot;</span> <span class="s2">&quot;#{methname}.__super__.constructor&quot;</span>
<span class="k">else</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">&quot;cannot call super on an anonymous function.&quot;</span></pre></div> </td> </tr> <tr id="section-50"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-50">#</a> </div> <p>Compile a vanilla function call.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">else</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">&quot;cannot call super on an anonymous function.&quot;</span></pre></div> </td> </tr> <tr id="section-49"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-49">#</a> </div> <p>Compile a vanilla function call.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">o.chainRoot = </span><span class="k">this</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">chainRoot</span> <span class="nv">o.chainRoot = </span><span class="k">this</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">chainRoot</span>
<span class="nv">op = </span><span class="nx">@tags</span><span class="p">.</span><span class="nx">operation</span> <span class="nv">op = </span><span class="nx">@tags</span><span class="p">.</span><span class="nx">operation</span>
<span class="k">if</span> <span class="nx">@exist</span> <span class="k">if</span> <span class="nx">@exist</span>
<span class="p">[</span><span class="nx">@first</span><span class="p">,</span> <span class="nx">@meth</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">precompile</span><span class="o">:</span> <span class="kc">yes</span> <span class="k">if</span> <span class="nx">@variable</span> <span class="k">instanceof</span> <span class="nx">ValueNode</span> <span class="o">and</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="k">instanceof</span> <span class="nx">AccessorNode</span>
<span class="nv">methodAccessor = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
<span class="p">[</span><span class="nx">first</span><span class="p">,</span> <span class="nx">meth</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span>
<span class="vi">@first = </span><span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">first</span><span class="p">,</span> <span class="p">[</span><span class="nx">methodAccessor</span><span class="p">]).</span><span class="nx">compile</span> <span class="nx">o</span>
<span class="vi">@meth = </span><span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">meth</span><span class="p">,</span> <span class="p">[</span><span class="nx">methodAccessor</span><span class="p">]).</span><span class="nx">compile</span> <span class="nx">o</span>
<span class="k">else</span>
<span class="p">[</span><span class="nx">@first</span><span class="p">,</span> <span class="nx">@meth</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">precompile</span><span class="o">:</span> <span class="kc">yes</span>
<span class="vi">@first = </span><span class="s2">&quot;(typeof #{@first} === \&quot;function\&quot; ? &quot;</span> <span class="vi">@first = </span><span class="s2">&quot;(typeof #{@first} === \&quot;function\&quot; ? &quot;</span>
<span class="vi">@last = </span><span class="s2">&quot; : undefined)&quot;</span> <span class="vi">@last = </span><span class="s2">&quot; : undefined)&quot;</span>
<span class="k">else</span> <span class="k">if</span> <span class="nx">@variable</span> <span class="k">then</span> <span class="vi">@meth = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">@variable</span>
<span class="vi">@meth = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
<span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">@args</span> <span class="k">when</span> <span class="nx">arg</span> <span class="k">instanceof</span> <span class="nx">SplatNode</span> <span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">@args</span> <span class="k">when</span> <span class="nx">arg</span> <span class="k">instanceof</span> <span class="nx">SplatNode</span>
<span class="nv">code = </span><span class="nx">@compileSplat</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">code = </span><span class="nx">@compileSplat</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="k">if</span> <span class="o">not</span> <span class="nx">code</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">code</span>
@ -325,16 +328,16 @@ calls against the prototype's function of the same name.</p> </td>
<span class="nx">@compileSuper</span><span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">),</span> <span class="nx">o</span><span class="p">)</span> <span class="nx">@compileSuper</span><span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">),</span> <span class="nx">o</span><span class="p">)</span>
<span class="k">else</span> <span class="k">else</span>
<span class="s2">&quot;#{@first}#{@prefix()}#{@meth}(#{ args.join(&#39;, &#39;) })#{@last}&quot;</span> <span class="s2">&quot;#{@first}#{@prefix()}#{@meth}(#{ args.join(&#39;, &#39;) })#{@last}&quot;</span>
<span class="k">if</span> <span class="nx">op</span> <span class="o">and</span> <span class="nx">@variable</span> <span class="o">and</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">wrapped</span> <span class="k">then</span> <span class="s2">&quot;(#{code})&quot;</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-51"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-51">#</a> </div> <p><code>super()</code> is converted into a call against the superclass's implementation <span class="k">if</span> <span class="nx">op</span> <span class="o">and</span> <span class="nx">@variable</span> <span class="o">and</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">wrapped</span> <span class="k">then</span> <span class="s2">&quot;(#{code})&quot;</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-50"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-50">#</a> </div> <p><code>super()</code> is converted into a call against the superclass's implementation
of the current function.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSuper</span><span class="o">:</span> <span class="p">(</span><span class="nx">args</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> of the current function.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSuper</span><span class="o">:</span> <span class="p">(</span><span class="nx">args</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="s2">&quot;#{@superReference(o)}.call(this#{ if args.length then &#39;, &#39; else &#39;&#39; }#{args})&quot;</span></pre></div> </td> </tr> <tr id="section-52"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-52">#</a> </div> <p>If you call a function with a splat, it's converted into a JavaScript <span class="s2">&quot;#{@superReference(o)}.call(this#{ if args.length then &#39;, &#39; else &#39;&#39; }#{args})&quot;</span></pre></div> </td> </tr> <tr id="section-51"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-51">#</a> </div> <p>If you call a function with a splat, it's converted into a JavaScript
<code>.apply()</code> call to allow an array of arguments to be passed. <code>.apply()</code> call to allow an array of arguments to be passed.
If it's a constructor, then things get real tricky. We have to inject an If it's a constructor, then things get real tricky. We have to inject an
inner constructor in order to be able to pass the varargs.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSplat</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> inner constructor in order to be able to pass the varargs.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSplat</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">meth = </span><span class="nx">@meth</span> <span class="o">or</span> <span class="nx">@superReference</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">meth = </span><span class="nx">@meth</span> <span class="o">or</span> <span class="nx">@superReference</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nv">obj = </span><span class="nx">@variable</span> <span class="o">and</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">source</span> <span class="o">or</span> <span class="s1">&#39;this&#39;</span> <span class="nv">obj = </span><span class="nx">@variable</span> <span class="o">and</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">source</span> <span class="o">or</span> <span class="s1">&#39;this&#39;</span>
<span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/\(/</span><span class="p">)</span> <span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/\(/</span><span class="p">)</span>
<span class="nv">temp = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">temp = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ref&#39;</span>
<span class="nv">obj = </span><span class="nx">temp</span> <span class="nv">obj = </span><span class="nx">temp</span>
<span class="nv">meth = </span><span class="s2">&quot;(#{temp} = #{ @variable.source })#{ @variable.last }&quot;</span> <span class="nv">meth = </span><span class="s2">&quot;(#{temp} = #{ @variable.source })#{ @variable.last }&quot;</span>
<span class="k">if</span> <span class="nx">@isNew</span> <span class="k">if</span> <span class="nx">@isNew</span>
@ -342,29 +345,29 @@ inner constructor in order to be able to pass the varargs.</p> </td>
<span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">@args</span> <span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">@args</span>
<span class="nx">arg</span><span class="p">.</span><span class="nx">contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">mentionsArgs</span> <span class="o">or=</span> <span class="nx">n</span> <span class="k">instanceof</span> <span class="nx">LiteralNode</span> <span class="o">and</span> <span class="p">(</span><span class="nx">n</span><span class="p">.</span><span class="nx">value</span> <span class="o">is</span> <span class="s1">&#39;arguments&#39;</span><span class="p">)</span> <span class="nx">arg</span><span class="p">.</span><span class="nx">contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">mentionsArgs</span> <span class="o">or=</span> <span class="nx">n</span> <span class="k">instanceof</span> <span class="nx">LiteralNode</span> <span class="o">and</span> <span class="p">(</span><span class="nx">n</span><span class="p">.</span><span class="nx">value</span> <span class="o">is</span> <span class="s1">&#39;arguments&#39;</span><span class="p">)</span>
<span class="nx">utility</span> <span class="s1">&#39;extends&#39;</span> <span class="nx">utility</span> <span class="s1">&#39;extends&#39;</span>
<span class="nv">a = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">a = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ctor&#39;</span>
<span class="nv">b = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">b = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ref&#39;</span>
<span class="nv">c = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">c = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;result&#39;</span>
<span class="s2">&quot;&quot;&quot;</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">#DIVIDER</span> <span class="s2">#DIVIDER</span>
<span class="s2"> &quot;&quot;&quot;</span> <span class="s2"> &quot;&quot;&quot;</span>
<span class="k">else</span> <span class="k">else</span>
<span class="s2">&quot;#{@first}#{@prefix()}#{meth}.apply(#{obj}, #{ @compileSplatArguments(o) })#{@last}&quot;</span></pre></div> </td> </tr> <tr id="section-53"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-53">#</a> </div> <p>{@first}(function() { <span class="s2">&quot;#{@first}#{@prefix()}#{meth}.apply(#{obj}, #{ @compileSplatArguments(o) })#{@last}&quot;</span></pre></div> </td> </tr> <tr id="section-52"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-52">#</a> </div> <p>{@first}(function() {
{@idt(1)}var ctor = function(){}; {@idt(1)}var ctor = function(){};
{@idt(1)}__extends(ctor, #{a} = #{meth}); {@idt(1)}__extends(ctor, #{a} = #{meth});
{@idt(1)}return typeof (#{b} = #{a}.apply(#{c} = new ctor, #{ @compileSplatArguments(o) })) === "object" ? #{b} : #{c}; {@idt(1)}return typeof (#{c} = #{a}.apply(#{b} = new ctor, #{ @compileSplatArguments(o) })) === "object" ? #{c} : #{b};
{@tab}}).#{ if mentionsArgs then 'apply(this, arguments)' else 'call(this)'}#{@last}</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-54"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-54">#</a> </div> <h3>ExtendsNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ExtendsNode = </span><span class="nx">class</span> <span class="nx">ExtendsNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> {@tab}}).#{ if mentionsArgs then 'apply(this, arguments)' else 'call(this)'}#{@last}</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-53"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-53">#</a> </div> <h3>ExtendsNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ExtendsNode = </span><span class="nx">class</span> <span class="nx">ExtendsNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ExtendsNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ExtendsNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;child&#39;</span><span class="p">,</span> <span class="s1">&#39;parent&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;child&#39;</span><span class="p">,</span> <span class="s1">&#39;parent&#39;</span><span class="p">]</span>
<span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@child</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@child</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">super</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-55"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-55">#</a> </div> <p>Node to extend an object's prototype with an ancestor object. <span class="k">super</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-54"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-54">#</a> </div> <p>Node to extend an object's prototype with an ancestor object.
After <code>goog.inherits</code> from the After <code>goog.inherits</code> from the
<a href="http://closure-library.googlecode.com/svn/docs/closureGoogBase.js.html">Closure Library</a>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <a href="http://closure-library.googlecode.com/svn/docs/closureGoogBase.js.html">Closure Library</a>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">ref = </span> <span class="k">new</span> <span class="nx">ValueNode</span> <span class="nx">literal</span> <span class="nx">utility</span> <span class="s1">&#39;extends&#39;</span> <span class="nv">ref = </span> <span class="k">new</span> <span class="nx">ValueNode</span> <span class="nx">literal</span> <span class="nx">utility</span> <span class="s1">&#39;extends&#39;</span>
<span class="p">(</span><span class="k">new</span> <span class="nx">CallNode</span> <span class="nx">ref</span><span class="p">,</span> <span class="p">[</span><span class="nx">@child</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">]).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-56"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-56">#</a> </div> <p>Hooks one constructor into another's prototype chain.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-57"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-57">#</a> </div> <h3>AccessorNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.AccessorNode = </span><span class="nx">class</span> <span class="nx">AccessorNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="p">(</span><span class="k">new</span> <span class="nx">CallNode</span> <span class="nx">ref</span><span class="p">,</span> <span class="p">[</span><span class="nx">@child</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">]).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-55"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-55">#</a> </div> <p>Hooks one constructor into another's prototype chain.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-56"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-56">#</a> </div> <h3>AccessorNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.AccessorNode = </span><span class="nx">class</span> <span class="nx">AccessorNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;AccessorNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;AccessorNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span>
@ -378,8 +381,8 @@ After <code>goog.inherits</code> from the
<span class="nv">name = </span><span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span> <span class="nv">name = </span><span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
<span class="nx">o</span><span class="p">.</span><span class="nx">chainRoot</span><span class="p">.</span><span class="nx">wrapped</span> <span class="o">or=</span> <span class="nx">@soakNode</span> <span class="nx">o</span><span class="p">.</span><span class="nx">chainRoot</span><span class="p">.</span><span class="nx">wrapped</span> <span class="o">or=</span> <span class="nx">@soakNode</span>
<span class="nv">namePart = </span><span class="k">if</span> <span class="nx">name</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">IS_STRING</span><span class="p">)</span> <span class="k">then</span> <span class="s2">&quot;[#{name}]&quot;</span> <span class="k">else</span> <span class="s2">&quot;.#{name}&quot;</span> <span class="nv">namePart = </span><span class="k">if</span> <span class="nx">name</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">IS_STRING</span><span class="p">)</span> <span class="k">then</span> <span class="s2">&quot;[#{name}]&quot;</span> <span class="k">else</span> <span class="s2">&quot;.#{name}&quot;</span>
<span class="nx">@prototype</span> <span class="o">+</span> <span class="nx">namePart</span></pre></div> </td> </tr> <tr id="section-58"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-58">#</a> </div> <p>A <code>.</code> accessor into a property of a value, or the <code>::</code> shorthand for <span class="nx">@prototype</span> <span class="o">+</span> <span class="nx">namePart</span></pre></div> </td> </tr> <tr id="section-57"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-57">#</a> </div> <p>A <code>.</code> accessor into a property of a value, or the <code>::</code> shorthand for
an accessor into the object's prototype.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-59"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-59">#</a> </div> <h3>IndexNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.IndexNode = </span><span class="nx">class</span> <span class="nx">IndexNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> an accessor into the object's prototype.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-58"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-58">#</a> </div> <h3>IndexNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.IndexNode = </span><span class="nx">class</span> <span class="nx">IndexNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;IndexNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;IndexNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;index&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;index&#39;</span><span class="p">]</span>
@ -391,7 +394,7 @@ an accessor into the object's prototype.</p> </td> <td c
<span class="nx">o</span><span class="p">.</span><span class="nx">chainRoot</span><span class="p">.</span><span class="nx">wrapped</span> <span class="o">or=</span> <span class="nx">@soakNode</span> <span class="nx">o</span><span class="p">.</span><span class="nx">chainRoot</span><span class="p">.</span><span class="nx">wrapped</span> <span class="o">or=</span> <span class="nx">@soakNode</span>
<span class="nv">idx = </span><span class="nx">@index</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span> <span class="nv">idx = </span><span class="nx">@index</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
<span class="nv">prefix = </span><span class="k">if</span> <span class="nx">@proto</span> <span class="k">then</span> <span class="s1">&#39;.prototype&#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">prefix = </span><span class="k">if</span> <span class="nx">@proto</span> <span class="k">then</span> <span class="s1">&#39;.prototype&#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="s2">&quot;#{prefix}[#{idx}]&quot;</span></pre></div> </td> </tr> <tr id="section-60"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-60">#</a> </div> <p>A <code>[ ... ]</code> indexed accessor into an array or object.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-61"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-61">#</a> </div> <h3>RangeNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.RangeNode = </span><span class="nx">class</span> <span class="nx">RangeNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="s2">&quot;#{prefix}[#{idx}]&quot;</span></pre></div> </td> </tr> <tr id="section-59"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-59">#</a> </div> <p>A <code>[ ... ]</code> indexed accessor into an array or object.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-60"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-60">#</a> </div> <h3>RangeNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.RangeNode = </span><span class="nx">class</span> <span class="nx">RangeNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;RangeNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;RangeNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;from&#39;</span><span class="p">,</span> <span class="s1">&#39;to&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;from&#39;</span><span class="p">,</span> <span class="s1">&#39;to&#39;</span><span class="p">]</span>
@ -399,7 +402,7 @@ an accessor into the object's prototype.</p> </td> <td c
<span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@from</span><span class="p">,</span> <span class="nx">@to</span><span class="p">,</span> <span class="nx">tag</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@from</span><span class="p">,</span> <span class="nx">@to</span><span class="p">,</span> <span class="nx">tag</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">super</span><span class="p">()</span> <span class="k">super</span><span class="p">()</span>
<span class="vi">@exclusive = </span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">&#39;exclusive&#39;</span> <span class="vi">@exclusive = </span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">&#39;exclusive&#39;</span>
<span class="vi">@equals = </span><span class="k">if</span> <span class="nx">@exclusive</span> <span class="k">then</span> <span class="s1">&#39;&#39;</span> <span class="k">else</span> <span class="s1">&#39;=&#39;</span></pre></div> </td> </tr> <tr id="section-62"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-62">#</a> </div> <p>A range literal. Ranges can be used to extract portions (slices) of arrays, <span class="vi">@equals = </span><span class="k">if</span> <span class="nx">@exclusive</span> <span class="k">then</span> <span class="s1">&#39;&#39;</span> <span class="k">else</span> <span class="s1">&#39;=&#39;</span></pre></div> </td> </tr> <tr id="section-61"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-61">#</a> </div> <p>A range literal. Ranges can be used to extract portions (slices) of arrays,
to specify a range for comprehensions, or as a value, to be expanded into the to specify a range for comprehensions, or as a value, to be expanded into the
corresponding array of integers at runtime.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileVariables</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> corresponding array of integers at runtime.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileVariables</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">o = </span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span><span class="p">)</span> <span class="nv">o = </span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span><span class="p">)</span>
@ -409,7 +412,7 @@ corresponding array of integers at runtime.</p> </td> <t
<span class="nv">parts = </span><span class="p">[]</span> <span class="nv">parts = </span><span class="p">[]</span>
<span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@from</span> <span class="k">if</span> <span class="nx">@from</span> <span class="o">isnt</span> <span class="nx">@fromVar</span> <span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@from</span> <span class="k">if</span> <span class="nx">@from</span> <span class="o">isnt</span> <span class="nx">@fromVar</span>
<span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@to</span> <span class="k">if</span> <span class="nx">@to</span> <span class="o">isnt</span> <span class="nx">@toVar</span> <span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@to</span> <span class="k">if</span> <span class="nx">@to</span> <span class="o">isnt</span> <span class="nx">@toVar</span>
<span class="k">if</span> <span class="nx">parts</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="s2">&quot;#{parts.join(&#39;; &#39;)}; &quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span></pre></div> </td> </tr> <tr id="section-63"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-63">#</a> </div> <p>Compiles the range's source variables -- where it starts and where it ends. <span class="k">if</span> <span class="nx">parts</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="s2">&quot;#{parts.join(&#39;; &#39;)}; &quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span></pre></div> </td> </tr> <tr id="section-62"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-62">#</a> </div> <p>Compiles the range's source variables -- where it starts and where it ends.
But only if they need to be cached to avoid double evaluation.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> But only if they need to be cached to avoid double evaluation.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="nx">@compileArray</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">index</span> <span class="k">return</span> <span class="nx">@compileArray</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">index</span>
<span class="k">return</span> <span class="nx">@compileSimple</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span> <span class="k">return</span> <span class="nx">@compileSimple</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span>
@ -420,7 +423,7 @@ But only if they need to be cached to avoid double evaluation.</p> <
<span class="nv">compare = </span><span class="s2">&quot;#{intro} &lt;#{@equals} #{@toVar} : #{idx} &gt;#{@equals} #{@toVar})&quot;</span> <span class="nv">compare = </span><span class="s2">&quot;#{intro} &lt;#{@equals} #{@toVar} : #{idx} &gt;#{@equals} #{@toVar})&quot;</span>
<span class="nv">stepPart = </span><span class="k">if</span> <span class="nx">step</span> <span class="k">then</span> <span class="nx">step</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;1&#39;</span> <span class="nv">stepPart = </span><span class="k">if</span> <span class="nx">step</span> <span class="k">then</span> <span class="nx">step</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;1&#39;</span>
<span class="nv">incr = </span><span class="k">if</span> <span class="nx">step</span> <span class="k">then</span> <span class="s2">&quot;#{idx} += #{stepPart}&quot;</span> <span class="k">else</span> <span class="s2">&quot;#{intro} += #{stepPart} : #{idx} -= #{stepPart})&quot;</span> <span class="nv">incr = </span><span class="k">if</span> <span class="nx">step</span> <span class="k">then</span> <span class="s2">&quot;#{idx} += #{stepPart}&quot;</span> <span class="k">else</span> <span class="s2">&quot;#{intro} += #{stepPart} : #{idx} -= #{stepPart})&quot;</span>
<span class="s2">&quot;#{vars}; #{compare}; #{incr}&quot;</span></pre></div> </td> </tr> <tr id="section-64"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-64">#</a> </div> <p>When compiled normally, the range returns the contents of the <em>for loop</em> <span class="s2">&quot;#{vars}; #{compare}; #{incr}&quot;</span></pre></div> </td> </tr> <tr id="section-63"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-63">#</a> </div> <p>When compiled normally, the range returns the contents of the <em>for loop</em>
needed to iterate over the values in the range. Used by comprehensions.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSimple</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> needed to iterate over the values in the range. Used by comprehensions.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSimple</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="p">[</span><span class="nx">from</span><span class="p">,</span> <span class="nx">to</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nb">parseInt</span><span class="p">(</span><span class="nx">@fromNum</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">@toNum</span><span class="p">,</span> <span class="mi">10</span><span class="p">)]</span> <span class="p">[</span><span class="nx">from</span><span class="p">,</span> <span class="nx">to</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nb">parseInt</span><span class="p">(</span><span class="nx">@fromNum</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">@toNum</span><span class="p">,</span> <span class="mi">10</span><span class="p">)]</span>
<span class="nv">idx = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;index&#39;</span> <span class="nv">idx = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;index&#39;</span>
@ -429,15 +432,15 @@ needed to iterate over the values in the range. Used by comprehensions.</p>
<span class="k">if</span> <span class="nx">from</span> <span class="o">&lt;=</span> <span class="nx">to</span> <span class="k">if</span> <span class="nx">from</span> <span class="o">&lt;=</span> <span class="nx">to</span>
<span class="s2">&quot;#{idx} = #{from}; #{idx} &lt;#{@equals} #{to}; #{step or &quot;</span><span class="c1">#{idx}++&quot;}&quot;</span> <span class="s2">&quot;#{idx} = #{from}; #{idx} &lt;#{@equals} #{to}; #{step or &quot;</span><span class="c1">#{idx}++&quot;}&quot;</span>
<span class="k">else</span> <span class="k">else</span>
<span class="s2">&quot;#{idx} = #{from}; #{idx} &gt;#{@equals} #{to}; #{step or &quot;</span><span class="c1">#{idx}--&quot;}&quot;</span></pre></div> </td> </tr> <tr id="section-65"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-65">#</a> </div> <p>Compile a simple range comprehension, with integers.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileArray</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;#{idx} = #{from}; #{idx} &gt;#{@equals} #{to}; #{step or &quot;</span><span class="c1">#{idx}--&quot;}&quot;</span></pre></div> </td> </tr> <tr id="section-64"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-64">#</a> </div> <p>Compile a simple range comprehension, with integers.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileArray</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">idt = </span><span class="nx">@idt</span> <span class="mi">1</span> <span class="nv">idt = </span><span class="nx">@idt</span> <span class="mi">1</span>
<span class="nv">vars = </span><span class="nx">@compileVariables</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">indent</span><span class="o">:</span> <span class="nx">idt</span> <span class="nv">vars = </span><span class="nx">@compileVariables</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">indent</span><span class="o">:</span> <span class="nx">idt</span>
<span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span> <span class="o">and</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="o">+</span><span class="nx">@fromNum</span> <span class="o">-</span> <span class="o">+</span><span class="nx">@toNum</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">20</span> <span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span> <span class="o">and</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="o">+</span><span class="nx">@fromNum</span> <span class="o">-</span> <span class="o">+</span><span class="nx">@toNum</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">20</span>
<span class="nv">range = </span><span class="p">[</span><span class="o">+</span><span class="nx">@fromNum</span><span class="p">..</span><span class="o">+</span><span class="nx">@toNum</span><span class="p">]</span> <span class="nv">range = </span><span class="p">[</span><span class="o">+</span><span class="nx">@fromNum</span><span class="p">..</span><span class="o">+</span><span class="nx">@toNum</span><span class="p">]</span>
<span class="nx">range</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@exclusive</span> <span class="nx">range</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@exclusive</span>
<span class="k">return</span> <span class="s2">&quot;[#{ range.join(&#39;, &#39;) }]&quot;</span> <span class="k">return</span> <span class="s2">&quot;[#{ range.join(&#39;, &#39;) }]&quot;</span>
<span class="nv">i = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">i = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;i&#39;</span>
<span class="nv">result = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">result = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;result&#39;</span>
<span class="nv">pre = </span><span class="s2">&quot;\n#{idt}#{result} = []; #{vars}&quot;</span> <span class="nv">pre = </span><span class="s2">&quot;\n#{idt}#{result} = []; #{vars}&quot;</span>
<span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span> <span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span>
<span class="nv">o.index = </span><span class="nx">i</span> <span class="nv">o.index = </span><span class="nx">i</span>
@ -446,7 +449,7 @@ needed to iterate over the values in the range. Used by comprehensions.</p>
<span class="nv">clause = </span><span class="s2">&quot;#{@fromVar} &lt;= #{@toVar} ?&quot;</span> <span class="nv">clause = </span><span class="s2">&quot;#{@fromVar} &lt;= #{@toVar} ?&quot;</span>
<span class="nv">body = </span><span class="s2">&quot;var #{i} = #{@fromVar}; #{clause} #{i} &lt;#{@equals} #{@toVar} : #{i} &gt;#{@equals} #{@toVar}; #{clause} #{i} += 1 : #{i} -= 1&quot;</span> <span class="nv">body = </span><span class="s2">&quot;var #{i} = #{@fromVar}; #{clause} #{i} &lt;#{@equals} #{@toVar} : #{i} &gt;#{@equals} #{@toVar}; #{clause} #{i} += 1 : #{i} -= 1&quot;</span>
<span class="nv">post = </span><span class="s2">&quot;{ #{result}.push(#{i}); }\n#{idt}return #{result};\n#{o.indent}&quot;</span> <span class="nv">post = </span><span class="s2">&quot;{ #{result}.push(#{i}); }\n#{idt}return #{result};\n#{o.indent}&quot;</span>
<span class="s2">&quot;(function() {#{pre}\n#{idt}for (#{body})#{post}}).call(this)&quot;</span></pre></div> </td> </tr> <tr id="section-66"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-66">#</a> </div> <p>When used as a value, expand the range into the equivalent array.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-67"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-67">#</a> </div> <h3>SliceNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.SliceNode = </span><span class="nx">class</span> <span class="nx">SliceNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="s2">&quot;(function() {#{pre}\n#{idt}for (#{body})#{post}}).call(this)&quot;</span></pre></div> </td> </tr> <tr id="section-65"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-65">#</a> </div> <p>When used as a value, expand the range into the equivalent array.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-66"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-66">#</a> </div> <h3>SliceNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.SliceNode = </span><span class="nx">class</span> <span class="nx">SliceNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;SliceNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;SliceNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;range&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;range&#39;</span><span class="p">]</span>
@ -459,9 +462,9 @@ needed to iterate over the values in the range. Used by comprehensions.</p>
<span class="nv">to = </span> <span class="k">if</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">to</span> <span class="k">then</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">to</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">to = </span> <span class="k">if</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">to</span> <span class="k">then</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">to</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nx">to</span> <span class="o">+=</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">to</span> <span class="o">or</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">exclusive</span> <span class="k">then</span> <span class="s1">&#39;&#39;</span> <span class="k">else</span> <span class="s1">&#39; + 1&#39;</span> <span class="nx">to</span> <span class="o">+=</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">to</span> <span class="o">or</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">exclusive</span> <span class="k">then</span> <span class="s1">&#39;&#39;</span> <span class="k">else</span> <span class="s1">&#39; + 1&#39;</span>
<span class="nv">to = </span> <span class="s1">&#39;, &#39;</span> <span class="o">+</span> <span class="nx">to</span> <span class="k">if</span> <span class="nx">to</span> <span class="nv">to = </span> <span class="s1">&#39;, &#39;</span> <span class="o">+</span> <span class="nx">to</span> <span class="k">if</span> <span class="nx">to</span>
<span class="s2">&quot;.slice(#{from}#{to})&quot;</span></pre></div> </td> </tr> <tr id="section-68"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-68">#</a> </div> <p>An array slice literal. Unlike JavaScript's <code>Array#slice</code>, the second parameter <span class="s2">&quot;.slice(#{from}#{to})&quot;</span></pre></div> </td> </tr> <tr id="section-67"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-67">#</a> </div> <p>An array slice literal. Unlike JavaScript's <code>Array#slice</code>, the second parameter
specifies the index of the end of the slice, just as the first parameter specifies the index of the end of the slice, just as the first parameter
is the index of the beginning.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-69"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-69">#</a> </div> <h3>ObjectNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ObjectNode = </span><span class="nx">class</span> <span class="nx">ObjectNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> is the index of the beginning.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-68"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-68">#</a> </div> <h3>ObjectNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ObjectNode = </span><span class="nx">class</span> <span class="nx">ObjectNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ObjectNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ObjectNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;properties&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;properties&#39;</span><span class="p">]</span>
@ -486,7 +489,7 @@ is the index of the beginning.</p> </td> <td class="code
<span class="nx">indent</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="nx">join</span> <span class="nx">indent</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="nx">join</span>
<span class="nv">props = </span><span class="nx">props</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="nv">props = </span><span class="nx">props</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="nv">obj = </span><span class="s1">&#39;{&#39;</span> <span class="o">+</span> <span class="p">(</span><span class="k">if</span> <span class="nx">props</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">props</span> <span class="o">+</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">@idt</span><span class="p">()</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;}&#39;</span> <span class="nv">obj = </span><span class="s1">&#39;{&#39;</span> <span class="o">+</span> <span class="p">(</span><span class="k">if</span> <span class="nx">props</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">props</span> <span class="o">+</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">@idt</span><span class="p">()</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;}&#39;</span>
<span class="k">if</span> <span class="nx">top</span> <span class="k">then</span> <span class="s2">&quot;(#{obj})&quot;</span> <span class="k">else</span> <span class="nx">obj</span></pre></div> </td> </tr> <tr id="section-70"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-70">#</a> </div> <p>An object literal, nothing fancy.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-71"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-71">#</a> </div> <h3>ArrayNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ArrayNode = </span><span class="nx">class</span> <span class="nx">ArrayNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="k">if</span> <span class="nx">top</span> <span class="k">then</span> <span class="s2">&quot;(#{obj})&quot;</span> <span class="k">else</span> <span class="nx">obj</span></pre></div> </td> </tr> <tr id="section-69"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-69">#</a> </div> <p>An object literal, nothing fancy.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-70"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-70">#</a> </div> <h3>ArrayNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ArrayNode = </span><span class="nx">class</span> <span class="nx">ArrayNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ArrayNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ArrayNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;objects&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;objects&#39;</span><span class="p">]</span>
@ -514,20 +517,20 @@ is the index of the beginning.</p> </td> <td class="code
<span class="k">if</span> <span class="nx">indexOf</span><span class="p">(</span><span class="nx">objects</span><span class="p">,</span> <span class="s1">&#39;\n&#39;</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">if</span> <span class="nx">indexOf</span><span class="p">(</span><span class="nx">objects</span><span class="p">,</span> <span class="s1">&#39;\n&#39;</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span>
<span class="s2">&quot;[\n#{@idt(1)}#{objects}\n#{@tab}]&quot;</span> <span class="s2">&quot;[\n#{@idt(1)}#{objects}\n#{@tab}]&quot;</span>
<span class="k">else</span> <span class="k">else</span>
<span class="s2">&quot;[#{objects}]&quot;</span></pre></div> </td> </tr> <tr id="section-72"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-72">#</a> </div> <p>An array literal.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-73"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-73">#</a> </div> <h3>ClassNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ClassNode = </span><span class="nx">class</span> <span class="nx">ClassNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="s2">&quot;[#{objects}]&quot;</span></pre></div> </td> </tr> <tr id="section-71"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-71">#</a> </div> <p>An array literal.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-72"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-72">#</a> </div> <h3>ClassNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ClassNode = </span><span class="nx">class</span> <span class="nx">ClassNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ClassNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ClassNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;variable&#39;</span><span class="p">,</span> <span class="s1">&#39;parent&#39;</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;variable&#39;</span><span class="p">,</span> <span class="s1">&#39;parent&#39;</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">]</span>
<span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">yes</span></pre></div> </td> </tr> <tr id="section-74"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-74">#</a> </div> <p>The CoffeeScript class definition.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@variable</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">,</span> <span class="nx">@properties</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">yes</span></pre></div> </td> </tr> <tr id="section-73"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-73">#</a> </div> <p>The CoffeeScript class definition.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@variable</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">,</span> <span class="nx">@properties</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">super</span><span class="p">()</span> <span class="k">super</span><span class="p">()</span>
<span class="nx">@properties</span> <span class="o">or=</span> <span class="p">[]</span> <span class="nx">@properties</span> <span class="o">or=</span> <span class="p">[]</span>
<span class="vi">@returns = </span><span class="kc">false</span> <span class="vi">@returns = </span><span class="kc">false</span>
<span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="vi">@returns = </span><span class="kc">true</span> <span class="vi">@returns = </span><span class="kc">true</span>
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-75"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-75">#</a> </div> <p>Initialize a <strong>ClassNode</strong> with its name, an optional superclass, and a <span class="k">this</span></pre></div> </td> </tr> <tr id="section-74"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-74">#</a> </div> <p>Initialize a <strong>ClassNode</strong> with its name, an optional superclass, and a
list of prototype property assignments.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> list of prototype property assignments.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="vi">@variable = </span><span class="nx">literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@variable</span> <span class="o">is</span> <span class="s1">&#39;__temp__&#39;</span> <span class="vi">@variable = </span><span class="nx">literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ctor&#39;</span> <span class="k">if</span> <span class="nx">@variable</span> <span class="o">is</span> <span class="s1">&#39;__temp__&#39;</span>
<span class="nv">extension = </span><span class="nx">@parent</span> <span class="o">and</span> <span class="k">new</span> <span class="nx">ExtendsNode</span><span class="p">(</span><span class="nx">@variable</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">)</span> <span class="nv">extension = </span><span class="nx">@parent</span> <span class="o">and</span> <span class="k">new</span> <span class="nx">ExtendsNode</span><span class="p">(</span><span class="nx">@variable</span><span class="p">,</span> <span class="nx">@parent</span><span class="p">)</span>
<span class="nv">props = </span><span class="k">new</span> <span class="nx">Expressions</span> <span class="nv">props = </span><span class="k">new</span> <span class="nx">Expressions</span>
<span class="nv">o.top = </span><span class="kc">true</span> <span class="nv">o.top = </span><span class="kc">true</span>
@ -559,7 +562,7 @@ list of prototype property assignments.</p> </td> <td cl
<span class="k">else</span> <span class="k">else</span>
<span class="nv">func.bound = </span><span class="kc">false</span> <span class="nv">func.bound = </span><span class="kc">false</span>
<span class="nx">constScope</span> <span class="o">or=</span> <span class="k">new</span> <span class="nx">Scope</span><span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">,</span> <span class="nx">constructor</span><span class="p">)</span> <span class="nx">constScope</span> <span class="o">or=</span> <span class="k">new</span> <span class="nx">Scope</span><span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">,</span> <span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">,</span> <span class="nx">constructor</span><span class="p">)</span>
<span class="nx">me</span> <span class="o">or=</span> <span class="nx">constScope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nx">me</span> <span class="o">or=</span> <span class="nx">constScope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;this&#39;</span>
<span class="nv">pname = </span><span class="nx">pvar</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">pname = </span><span class="nx">pvar</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">ReturnNode</span> <span class="nx">literal</span> <span class="s1">&#39;this&#39;</span> <span class="k">if</span> <span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">empty</span><span class="p">()</span> <span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">ReturnNode</span> <span class="nx">literal</span> <span class="s1">&#39;this&#39;</span> <span class="k">if</span> <span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">empty</span><span class="p">()</span>
<span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">literal</span> <span class="s2">&quot;this.#{pname} = function(){ return #{className}.prototype.#{pname}.apply(#{me}, arguments); }&quot;</span> <span class="nx">constructor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">literal</span> <span class="s2">&quot;this.#{pname} = function(){ return #{className}.prototype.#{pname}.apply(#{me}, arguments); }&quot;</span>
@ -574,9 +577,9 @@ list of prototype property assignments.</p> </td> <td cl
<span class="nv">props = </span><span class="k">if</span> <span class="o">!</span><span class="nx">props</span><span class="p">.</span><span class="nx">empty</span><span class="p">()</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">props</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">props = </span><span class="k">if</span> <span class="o">!</span><span class="nx">props</span><span class="p">.</span><span class="nx">empty</span><span class="p">()</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">props</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nv">extension = </span><span class="k">if</span> <span class="nx">extension</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">@idt</span><span class="p">()</span> <span class="o">+</span> <span class="nx">extension</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;;&#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">extension = </span><span class="k">if</span> <span class="nx">extension</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">@idt</span><span class="p">()</span> <span class="o">+</span> <span class="nx">extension</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;;&#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nv">returns = </span><span class="k">if</span> <span class="nx">@returns</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">ReturnNode</span><span class="p">(</span><span class="nx">@variable</span><span class="p">).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">returns = </span><span class="k">if</span> <span class="nx">@returns</span> <span class="k">then</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">ReturnNode</span><span class="p">(</span><span class="nx">@variable</span><span class="p">).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nx">construct</span> <span class="o">+</span> <span class="nx">extension</span> <span class="o">+</span> <span class="nx">props</span> <span class="o">+</span> <span class="nx">returns</span></pre></div> </td> </tr> <tr id="section-76"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-76">#</a> </div> <p>Instead of generating the JavaScript string directly, we build up the <span class="nx">construct</span> <span class="o">+</span> <span class="nx">extension</span> <span class="o">+</span> <span class="nx">props</span> <span class="o">+</span> <span class="nx">returns</span></pre></div> </td> </tr> <tr id="section-75"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-75">#</a> </div> <p>Instead of generating the JavaScript string directly, we build up the
equivalent syntax tree and compile that, in pieces. You can see the equivalent syntax tree and compile that, in pieces. You can see the
constructor, property assignments, and inheritance getting built out below.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-77"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-77">#</a> </div> <h3>AssignNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.AssignNode = </span><span class="nx">class</span> <span class="nx">AssignNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span></pre></div> </td> </tr> <tr id="section-78"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-78">#</a> </div> <p>The <strong>AssignNode</strong> is used to assign a local variable to value, or to set the constructor, property assignments, and inheritance getting built out below.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-76"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-76">#</a> </div> <h3>AssignNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.AssignNode = </span><span class="nx">class</span> <span class="nx">AssignNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span></pre></div> </td> </tr> <tr id="section-77"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-77">#</a> </div> <p>The <strong>AssignNode</strong> is used to assign a local variable to value, or to set the
property of an object -- including within object literals.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">PROTO_ASSIGN</span><span class="o">:</span> <span class="sr">/^(\S+)\.prototype/</span> property of an object -- including within object literals.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">PROTO_ASSIGN</span><span class="o">:</span> <span class="sr">/^(\S+)\.prototype/</span>
<span class="nx">LEADING_DOT</span><span class="o">:</span> <span class="sr">/^\.(prototype\.)?/</span> <span class="nx">LEADING_DOT</span><span class="o">:</span> <span class="sr">/^\.(prototype\.)?/</span>
@ -599,7 +602,7 @@ property of an object -- including within object literals.</p> </td>
<span class="k">super</span><span class="p">()</span> <span class="k">super</span><span class="p">()</span>
<span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@isValue</span><span class="p">()</span> <span class="o">and</span> <span class="p">(</span><span class="nx">@variable</span><span class="p">.</span><span class="nx">isArray</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">isObject</span><span class="p">())</span></pre></div> </td> </tr> <tr id="section-79"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-79">#</a> </div> <p>Matchers for detecting prototype assignments.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@isValue</span><span class="p">()</span> <span class="o">and</span> <span class="p">(</span><span class="nx">@variable</span><span class="p">.</span><span class="nx">isArray</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">isObject</span><span class="p">())</span></pre></div> </td> </tr> <tr id="section-78"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-78">#</a> </div> <p>Matchers for detecting prototype assignments.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">top = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;top&#39;</span> <span class="nv">top = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;top&#39;</span>
<span class="k">return</span> <span class="nx">@compilePatternMatch</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">return</span> <span class="nx">@compilePatternMatch</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="k">return</span> <span class="nx">@compileSplice</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@isValue</span><span class="p">()</span> <span class="o">and</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">isSplice</span><span class="p">()</span> <span class="k">return</span> <span class="nx">@compileSplice</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@isValue</span><span class="p">()</span> <span class="o">and</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">isSplice</span><span class="p">()</span>
@ -616,23 +619,23 @@ property of an object -- including within object literals.</p> </td>
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">find</span> <span class="nx">name</span> <span class="nx">unless</span> <span class="nx">@isValue</span><span class="p">()</span> <span class="o">and</span> <span class="p">(</span><span class="nx">@variable</span><span class="p">.</span><span class="nx">hasProperties</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">namespaced</span><span class="p">)</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">find</span> <span class="nx">name</span> <span class="nx">unless</span> <span class="nx">@isValue</span><span class="p">()</span> <span class="o">and</span> <span class="p">(</span><span class="nx">@variable</span><span class="p">.</span><span class="nx">hasProperties</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">namespaced</span><span class="p">)</span>
<span class="nv">val = </span><span class="s2">&quot;#{name} = #{val}&quot;</span> <span class="nv">val = </span><span class="s2">&quot;#{name} = #{val}&quot;</span>
<span class="k">return</span> <span class="s2">&quot;#{@tab}#{val};&quot;</span> <span class="k">if</span> <span class="nx">stmt</span> <span class="k">return</span> <span class="s2">&quot;#{@tab}#{val};&quot;</span> <span class="k">if</span> <span class="nx">stmt</span>
<span class="k">if</span> <span class="nx">top</span> <span class="o">or</span> <span class="nx">@parenthetical</span> <span class="k">then</span> <span class="nx">val</span> <span class="k">else</span> <span class="s2">&quot;(#{val})&quot;</span></pre></div> </td> </tr> <tr id="section-80"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-80">#</a> </div> <p>Compile an assignment, delegating to <code>compilePatternMatch</code> or <span class="k">if</span> <span class="nx">top</span> <span class="o">or</span> <span class="nx">@parenthetical</span> <span class="k">then</span> <span class="nx">val</span> <span class="k">else</span> <span class="s2">&quot;(#{val})&quot;</span></pre></div> </td> </tr> <tr id="section-79"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-79">#</a> </div> <p>Compile an assignment, delegating to <code>compilePatternMatch</code> or
<code>compileSplice</code> if appropriate. Keep track of the name of the base object <code>compileSplice</code> if appropriate. Keep track of the name of the base object
we've been assigned to, for correct internal references. If the variable we've been assigned to, for correct internal references. If the variable
has not been seen yet within the current scope, declare it.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compilePatternMatch</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> has not been seen yet within the current scope, declare it.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compilePatternMatch</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">valVar = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">valVar = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ref&#39;</span>
<span class="nv">value = </span><span class="k">if</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">then</span> <span class="nx">ClosureNode</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">@value</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@value</span> <span class="nv">value = </span><span class="k">if</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">then</span> <span class="nx">ClosureNode</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">@value</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@value</span>
<span class="nv">assigns = </span><span class="p">[</span><span class="s2">&quot;#{@tab}#{valVar} = #{ value.compile(o) };&quot;</span><span class="p">]</span> <span class="nv">assigns = </span><span class="p">[</span><span class="s2">&quot;#{@tab}#{valVar} = #{ value.compile(o) };&quot;</span><span class="p">]</span>
<span class="nv">o.top = </span><span class="kc">true</span> <span class="nv">o.top = </span><span class="kc">true</span>
<span class="nv">o.asStatement = </span><span class="kc">true</span> <span class="nv">o.asStatement = </span><span class="kc">true</span>
<span class="nv">splat = </span><span class="kc">false</span> <span class="nv">splat = </span><span class="kc">false</span>
<span class="k">for</span> <span class="nx">obj</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">objects</span></pre></div> </td> </tr> <tr id="section-81"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-81">#</a> </div> <p>Brief implementation of recursive pattern matching, when assigning array or <span class="k">for</span> <span class="nx">obj</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">objects</span></pre></div> </td> </tr> <tr id="section-80"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-80">#</a> </div> <p>Brief implementation of recursive pattern matching, when assigning array or
object literals to a value. Peeks at their properties to assign inner names. object literals to a value. Peeks at their properties to assign inner names.
See the <a href="http://wiki.ecmascript.org/doku.php?id=harmony:destructuring">ECMAScript Harmony Wiki</a> See the <a href="http://wiki.ecmascript.org/doku.php?id=harmony:destructuring">ECMAScript Harmony Wiki</a>
for details.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">idx = </span><span class="nx">i</span> for details.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">idx = </span><span class="nx">i</span>
<span class="k">if</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">isObject</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">isObject</span><span class="p">()</span>
<span class="k">if</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">AssignNode</span></pre></div> </td> </tr> <tr id="section-82"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-82">#</a> </div> <p>A regular array pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">[</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">obj</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">base</span><span class="p">]</span> <span class="k">if</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">AssignNode</span></pre></div> </td> </tr> <tr id="section-81"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-81">#</a> </div> <p>A regular array pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">[</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">obj</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">base</span><span class="p">]</span>
<span class="k">else</span></pre></div> </td> </tr> <tr id="section-83"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-83">#</a> </div> <p>A regular object pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">idx = </span><span class="nx">obj</span> <span class="k">else</span></pre></div> </td> </tr> <tr id="section-82"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-82">#</a> </div> <p>A regular object pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">idx = </span><span class="nx">obj</span>
<span class="k">if</span> <span class="o">not</span> <span class="p">(</span><span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">ValueNode</span> <span class="o">or</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">SplatNode</span><span class="p">)</span> <span class="k">if</span> <span class="o">not</span> <span class="p">(</span><span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">ValueNode</span> <span class="o">or</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">SplatNode</span><span class="p">)</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s1">&#39;pattern matching must use only identifiers on the left-hand side.&#39;</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s1">&#39;pattern matching must use only identifiers on the left-hand side.&#39;</span>
<span class="nv">isString = </span><span class="nx">idx</span><span class="p">.</span><span class="nx">value</span> <span class="o">and</span> <span class="nx">idx</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span> <span class="nx">IS_STRING</span> <span class="nv">isString = </span><span class="nx">idx</span><span class="p">.</span><span class="nx">value</span> <span class="o">and</span> <span class="nx">idx</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span> <span class="nx">IS_STRING</span>
@ -647,7 +650,7 @@ for details.</p> </td> <td class="code"> <
<span class="nv">val = </span><span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">valVar</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">accessClass</span><span class="p">(</span><span class="nx">idx</span><span class="p">)])</span> <span class="nv">val = </span><span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">valVar</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">accessClass</span><span class="p">(</span><span class="nx">idx</span><span class="p">)])</span>
<span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">new</span> <span class="nx">AssignNode</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">val</span><span class="p">).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span> <span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">new</span> <span class="nx">AssignNode</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">val</span><span class="p">).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span>
<span class="nv">code = </span><span class="nx">assigns</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s2">&quot;\n&quot;</span><span class="p">)</span> <span class="nv">code = </span><span class="nx">assigns</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s2">&quot;\n&quot;</span><span class="p">)</span>
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-84"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-84">#</a> </div> <p>A shorthand <code>{a, b, c} = val</code> pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSplice</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-83"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-83">#</a> </div> <p>A shorthand <code>{a, b, c} = val</code> pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileSplice</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">name = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">onlyFirst</span><span class="o">:</span> <span class="kc">true</span> <span class="nv">name = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">onlyFirst</span><span class="o">:</span> <span class="kc">true</span>
<span class="nv">l = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">length</span> <span class="nv">l = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">length</span>
<span class="nv">range = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="nx">l</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="nx">range</span> <span class="nv">range = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="nx">l</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="nx">range</span>
@ -655,8 +658,8 @@ for details.</p> </td> <td class="code"> <
<span class="nv">from = </span><span class="k">if</span> <span class="nx">range</span><span class="p">.</span><span class="nx">from</span> <span class="k">then</span> <span class="nx">range</span><span class="p">.</span><span class="nx">from</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;0&#39;</span> <span class="nv">from = </span><span class="k">if</span> <span class="nx">range</span><span class="p">.</span><span class="nx">from</span> <span class="k">then</span> <span class="nx">range</span><span class="p">.</span><span class="nx">from</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;0&#39;</span>
<span class="nv">to = </span><span class="k">if</span> <span class="nx">range</span><span class="p">.</span><span class="nx">to</span> <span class="k">then</span> <span class="nx">range</span><span class="p">.</span><span class="nx">to</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; - &#39;</span> <span class="o">+</span> <span class="nx">from</span> <span class="o">+</span> <span class="nx">plus</span> <span class="k">else</span> <span class="s2">&quot;#{name}.length&quot;</span> <span class="nv">to = </span><span class="k">if</span> <span class="nx">range</span><span class="p">.</span><span class="nx">to</span> <span class="k">then</span> <span class="nx">range</span><span class="p">.</span><span class="nx">to</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; - &#39;</span> <span class="o">+</span> <span class="nx">from</span> <span class="o">+</span> <span class="nx">plus</span> <span class="k">else</span> <span class="s2">&quot;#{name}.length&quot;</span>
<span class="nv">val = </span><span class="nx">@value</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">val = </span><span class="nx">@value</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="s2">&quot;#{name}.splice.apply(#{name}, [#{from}, #{to}].concat(#{val}))&quot;</span></pre></div> </td> </tr> <tr id="section-85"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-85">#</a> </div> <p>Compile the assignment from an array splice literal, using JavaScript's <span class="s2">&quot;#{name}.splice.apply(#{name}, [#{from}, #{to}].concat(#{val}))&quot;</span></pre></div> </td> </tr> <tr id="section-84"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-84">#</a> </div> <p>Compile the assignment from an array splice literal, using JavaScript's
<code>Array#splice</code> method.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-86"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-86">#</a> </div> <h3>CodeNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.CodeNode = </span><span class="nx">class</span> <span class="nx">CodeNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <code>Array#splice</code> method.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-85"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-85">#</a> </div> <h3>CodeNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.CodeNode = </span><span class="nx">class</span> <span class="nx">CodeNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;CodeNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;CodeNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">,</span> <span class="s1">&#39;body&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;params&#39;</span><span class="p">,</span> <span class="s1">&#39;body&#39;</span><span class="p">]</span>
@ -666,7 +669,7 @@ for details.</p> </td> <td class="code"> <
<span class="nx">@params</span> <span class="o">or=</span> <span class="p">[]</span> <span class="nx">@params</span> <span class="o">or=</span> <span class="p">[]</span>
<span class="nx">@body</span> <span class="o">or=</span> <span class="k">new</span> <span class="nx">Expressions</span> <span class="nx">@body</span> <span class="o">or=</span> <span class="k">new</span> <span class="nx">Expressions</span>
<span class="vi">@bound = </span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">&#39;boundfunc&#39;</span> <span class="vi">@bound = </span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">&#39;boundfunc&#39;</span>
<span class="vi">@context = </span><span class="s1">&#39;this&#39;</span> <span class="k">if</span> <span class="nx">@bound</span></pre></div> </td> </tr> <tr id="section-87"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-87">#</a> </div> <p>A function definition. This is the only node that creates a new Scope. <span class="vi">@context = </span><span class="s1">&#39;this&#39;</span> <span class="k">if</span> <span class="nx">@bound</span></pre></div> </td> </tr> <tr id="section-86"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-86">#</a> </div> <p>A function definition. This is the only node that creates a new Scope.
When for the purposes of walking the contents of a function body, the CodeNode When for the purposes of walking the contents of a function body, the CodeNode
has no <em>children</em> -- they're within the inner scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> has no <em>children</em> -- they're within the inner scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">sharedScope = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;sharedScope&#39;</span> <span class="nv">sharedScope = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;sharedScope&#39;</span>
@ -688,7 +691,7 @@ has no <em>children</em> -- they're within the inner scope.</p> </td
<span class="k">else</span> <span class="k">else</span>
<span class="k">if</span> <span class="nx">param</span><span class="p">.</span><span class="nx">attach</span> <span class="k">if</span> <span class="nx">param</span><span class="p">.</span><span class="nx">attach</span>
<span class="p">{</span><span class="nx">value</span><span class="p">}</span> <span class="o">=</span> <span class="nx">param</span> <span class="p">{</span><span class="nx">value</span><span class="p">}</span> <span class="o">=</span> <span class="nx">param</span>
<span class="p">[</span><span class="nx">param</span><span class="p">,</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">literal</span><span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()),</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span><span class="p">]</span> <span class="p">[</span><span class="nx">param</span><span class="p">,</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">literal</span><span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;arg&#39;</span><span class="p">),</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span><span class="p">]</span>
<span class="nx">@body</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">AssignNode</span> <span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="s1">&#39;this&#39;</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">AccessorNode</span> <span class="nx">value</span><span class="p">]),</span> <span class="nx">param</span> <span class="nx">@body</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">AssignNode</span> <span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="s1">&#39;this&#39;</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">AccessorNode</span> <span class="nx">value</span><span class="p">]),</span> <span class="nx">param</span>
<span class="k">if</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span> <span class="k">if</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span>
<span class="nv">splat = </span><span class="k">new</span> <span class="nx">SplatNode</span> <span class="nx">param</span><span class="p">.</span><span class="nx">value</span> <span class="nv">splat = </span><span class="k">new</span> <span class="nx">SplatNode</span> <span class="nx">param</span><span class="p">.</span><span class="nx">value</span>
@ -707,7 +710,7 @@ has no <em>children</em> -- they're within the inner scope.</p> </td
<span class="k">if</span> <span class="nx">top</span> <span class="k">then</span> <span class="s2">&quot;(#{func})&quot;</span> <span class="k">else</span> <span class="nx">func</span> <span class="k">if</span> <span class="nx">top</span> <span class="k">then</span> <span class="s2">&quot;(#{func})&quot;</span> <span class="k">else</span> <span class="nx">func</span>
<span class="nx">topSensitive</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">topSensitive</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="kc">true</span></pre></div> </td> </tr> <tr id="section-88"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-88">#</a> </div> <p>Compilation creates a new scope unless explicitly asked to share with the <span class="kc">true</span></pre></div> </td> </tr> <tr id="section-87"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-87">#</a> </div> <p>Compilation creates a new scope unless explicitly asked to share with the
outer scope. Handles splat parameters in the parameter list by peeking at outer scope. Handles splat parameters in the parameter list by peeking at
the JavaScript <code>arguments</code> objects. If the function is bound with the <code>=&gt;</code> the JavaScript <code>arguments</code> objects. If the function is bound with the <code>=&gt;</code>
arrow, generates a wrapper that saves the current value of <code>this</code> through arrow, generates a wrapper that saves the current value of <code>this</code> through
@ -716,8 +719,8 @@ a closure.</p> </td> <td class="code"> <di
<span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">idt</span> <span class="o">or=</span> <span class="s1">&#39;&#39;</span> <span class="nx">idt</span> <span class="o">or=</span> <span class="s1">&#39;&#39;</span>
<span class="nv">children = </span><span class="p">(</span><span class="nx">child</span><span class="p">.</span><span class="nx">toString</span><span class="p">(</span><span class="nx">idt</span> <span class="o">+</span> <span class="nx">TAB</span><span class="p">)</span> <span class="k">for</span> <span class="nx">child</span> <span class="k">in</span> <span class="nx">@collectChildren</span><span class="p">()).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="nv">children = </span><span class="p">(</span><span class="nx">child</span><span class="p">.</span><span class="nx">toString</span><span class="p">(</span><span class="nx">idt</span> <span class="o">+</span> <span class="nx">TAB</span><span class="p">)</span> <span class="k">for</span> <span class="nx">child</span> <span class="k">in</span> <span class="nx">@collectChildren</span><span class="p">()).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">idt</span> <span class="o">+</span> <span class="nx">children</span></pre></div> </td> </tr> <tr id="section-89"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-89">#</a> </div> <p>Short-circuit traverseChildren method to prevent it from crossing scope boundaries <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">idt</span> <span class="o">+</span> <span class="nx">children</span></pre></div> </td> </tr> <tr id="section-88"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-88">#</a> </div> <p>Short-circuit traverseChildren method to prevent it from crossing scope boundaries
unless crossScope is true</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-90"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-90">#</a> </div> <h3>ParamNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ParamNode = </span><span class="nx">class</span> <span class="nx">ParamNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> unless crossScope is true</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-89"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-89">#</a> </div> <h3>ParamNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ParamNode = </span><span class="nx">class</span> <span class="nx">ParamNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ParamNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ParamNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span>
@ -730,9 +733,9 @@ unless crossScope is true</p> </td> <td class="code">
<span class="nx">@value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
<span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">toString</span><span class="o">:</span> <span class="p">(</span><span class="nx">idt</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">@attach</span> <span class="k">then</span> <span class="p">(</span><span class="nx">literal</span> <span class="s1">&#39;@&#39;</span> <span class="o">+</span> <span class="nx">@name</span><span class="p">).</span><span class="nx">toString</span> <span class="nx">idt</span> <span class="k">else</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">toString</span> <span class="nx">idt</span></pre></div> </td> </tr> <tr id="section-91"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-91">#</a> </div> <p>A parameter in a function definition. Beyond a typical Javascript parameter, <span class="k">if</span> <span class="nx">@attach</span> <span class="k">then</span> <span class="p">(</span><span class="nx">literal</span> <span class="s1">&#39;@&#39;</span> <span class="o">+</span> <span class="nx">@name</span><span class="p">).</span><span class="nx">toString</span> <span class="nx">idt</span> <span class="k">else</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">toString</span> <span class="nx">idt</span></pre></div> </td> </tr> <tr id="section-90"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-90">#</a> </div> <p>A parameter in a function definition. Beyond a typical Javascript parameter,
these parameters can also attach themselves to the context of the function, these parameters can also attach themselves to the context of the function,
as well as be a splat, gathering up a group of parameters into an array.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-92"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-92">#</a> </div> <h3>SplatNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.SplatNode = </span><span class="nx">class</span> <span class="nx">SplatNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> as well as be a splat, gathering up a group of parameters into an array.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-91"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-91">#</a> </div> <h3>SplatNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.SplatNode = </span><span class="nx">class</span> <span class="nx">SplatNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;SplatNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;SplatNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span>
@ -743,28 +746,28 @@ as well as be a splat, gathering up a group of parameters into an array.</p>
<span class="vi">@name = </span><span class="nx">name</span> <span class="vi">@name = </span><span class="nx">name</span>
<span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">@index</span><span class="o">?</span> <span class="k">then</span> <span class="nx">@compileParam</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-93"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-93">#</a> </div> <p>A splat, either as a parameter to a function, an argument to a call, <span class="k">if</span> <span class="nx">@index</span><span class="o">?</span> <span class="k">then</span> <span class="nx">@compileParam</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-92"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-92">#</a> </div> <p>A splat, either as a parameter to a function, an argument to a call,
or as part of a destructuring assignment.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileParam</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> or as part of a destructuring assignment.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileParam</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">name = </span><span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">name = </span><span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">find</span> <span class="nx">name</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">find</span> <span class="nx">name</span>
<span class="nv">end = </span><span class="s1">&#39;&#39;</span> <span class="nv">end = </span><span class="s1">&#39;&#39;</span>
<span class="k">if</span> <span class="nx">@trailings</span><span class="p">.</span><span class="nx">length</span> <span class="k">if</span> <span class="nx">@trailings</span><span class="p">.</span><span class="nx">length</span>
<span class="nv">len = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">len = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;len&#39;</span>
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">len</span><span class="p">,</span> <span class="s2">&quot;arguments.length&quot;</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">len</span><span class="p">,</span> <span class="s2">&quot;arguments.length&quot;</span>
<span class="nv">variadic = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">variadic = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;result&#39;</span>
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">variadic</span><span class="p">,</span> <span class="nx">len</span> <span class="o">+</span> <span class="s1">&#39; &gt;= &#39;</span> <span class="o">+</span> <span class="nx">@arglength</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">variadic</span><span class="p">,</span> <span class="nx">len</span> <span class="o">+</span> <span class="s1">&#39; &gt;= &#39;</span> <span class="o">+</span> <span class="nx">@arglength</span>
<span class="nv">end = </span><span class="k">if</span> <span class="nx">@trailings</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="s2">&quot;, #{len} - #{@trailings.length}&quot;</span> <span class="nv">end = </span><span class="k">if</span> <span class="nx">@trailings</span><span class="p">.</span><span class="nx">length</span> <span class="k">then</span> <span class="s2">&quot;, #{len} - #{@trailings.length}&quot;</span>
<span class="k">for</span> <span class="nx">trailing</span><span class="p">,</span> <span class="nx">idx</span> <span class="k">in</span> <span class="nx">@trailings</span> <span class="k">for</span> <span class="nx">trailing</span><span class="p">,</span> <span class="nx">idx</span> <span class="k">in</span> <span class="nx">@trailings</span>
<span class="k">if</span> <span class="nx">trailing</span><span class="p">.</span><span class="nx">attach</span> <span class="k">if</span> <span class="nx">trailing</span><span class="p">.</span><span class="nx">attach</span>
<span class="nv">assign = </span><span class="nx">trailing</span><span class="p">.</span><span class="nx">assign</span> <span class="nv">assign = </span><span class="nx">trailing</span><span class="p">.</span><span class="nx">assign</span>
<span class="nv">trailing = </span><span class="nx">literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">trailing = </span><span class="nx">literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;arg&#39;</span>
<span class="nv">assign.value = </span><span class="nx">trailing</span> <span class="nv">assign.value = </span><span class="nx">trailing</span>
<span class="nv">pos = </span><span class="nx">@trailings</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="nx">idx</span> <span class="nv">pos = </span><span class="nx">@trailings</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="nx">idx</span>
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">assign</span><span class="p">(</span><span class="nx">trailing</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="s2">&quot;arguments[#{variadic} ? #{len} - #{pos} : #{@index + idx}]&quot;</span><span class="p">)</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">assign</span><span class="p">(</span><span class="nx">trailing</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="s2">&quot;arguments[#{variadic} ? #{len} - #{pos} : #{@index + idx}]&quot;</span><span class="p">)</span>
<span class="s2">&quot;#{name} = #{utility(&#39;slice&#39;)}.call(arguments, #{@index}#{end})&quot;</span></pre></div> </td> </tr> <tr id="section-94"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-94">#</a> </div> <p>Compiling a parameter splat means recovering the parameters that succeed <span class="s2">&quot;#{name} = #{utility(&#39;slice&#39;)}.call(arguments, #{@index}#{end})&quot;</span></pre></div> </td> </tr> <tr id="section-93"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-93">#</a> </div> <p>Compiling a parameter splat means recovering the parameters that succeed
the splat in the parameter list, by slicing the arguments object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileValue</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">trailings</span><span class="p">)</span> <span class="o">-&gt;</span> the splat in the parameter list, by slicing the arguments object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileValue</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">trailings</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">trail = </span><span class="k">if</span> <span class="nx">trailings</span> <span class="k">then</span> <span class="s2">&quot;, #{name}.length - #{trailings}&quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">trail = </span><span class="k">if</span> <span class="nx">trailings</span> <span class="k">then</span> <span class="s2">&quot;, #{name}.length - #{trailings}&quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="s2">&quot;#{utility &#39;slice&#39;}.call(#{name}, #{index}#{trail})&quot;</span></pre></div> </td> </tr> <tr id="section-95"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-95">#</a> </div> <p>A compiling a splat as a destructuring assignment means slicing arguments <span class="s2">&quot;#{utility &#39;slice&#39;}.call(#{name}, #{index}#{trail})&quot;</span></pre></div> </td> </tr> <tr id="section-94"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-94">#</a> </div> <p>A compiling a splat as a destructuring assignment means slicing arguments
from the right-hand-side's corresponding array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@compileSplattedArray</span><span class="o">:</span> <span class="p">(</span><span class="nx">list</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> from the right-hand-side's corresponding array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@compileSplattedArray</span><span class="o">:</span> <span class="p">(</span><span class="nx">list</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">args = </span><span class="p">[]</span> <span class="nv">args = </span><span class="p">[]</span>
<span class="k">for</span> <span class="nx">arg</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">list</span> <span class="k">for</span> <span class="nx">arg</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">list</span>
@ -780,8 +783,8 @@ from the right-hand-side's corresponding array.</p> </td>
<span class="k">else</span> <span class="k">else</span>
<span class="nv">code = </span><span class="s2">&quot;[#{code}]&quot;</span> <span class="nv">code = </span><span class="s2">&quot;[#{code}]&quot;</span>
<span class="nx">args</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">if</span> <span class="nx">i</span> <span class="o">is</span> <span class="mi">0</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">&quot;.concat(#{code})&quot;</span><span class="p">)</span> <span class="nx">args</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">if</span> <span class="nx">i</span> <span class="o">is</span> <span class="mi">0</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">&quot;.concat(#{code})&quot;</span><span class="p">)</span>
<span class="nx">args</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-96"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-96">#</a> </div> <p>Utility function that converts arbitrary number of elements, mixed with <span class="nx">args</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-95"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-95">#</a> </div> <p>Utility function that converts arbitrary number of elements, mixed with
splats, to a proper array</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-97"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-97">#</a> </div> <h3>WhileNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.WhileNode = </span><span class="nx">class</span> <span class="nx">WhileNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> splats, to a proper array</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-96"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-96">#</a> </div> <h3>WhileNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.WhileNode = </span><span class="nx">class</span> <span class="nx">WhileNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;WhileNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;WhileNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;condition&#39;</span><span class="p">,</span> <span class="s1">&#39;guard&#39;</span><span class="p">,</span> <span class="s1">&#39;body&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;condition&#39;</span><span class="p">,</span> <span class="s1">&#39;guard&#39;</span><span class="p">,</span> <span class="s1">&#39;body&#39;</span><span class="p">]</span>
@ -804,7 +807,7 @@ splats, to a proper array</p> </td> <td class="code">
<span class="k">this</span> <span class="k">this</span>
<span class="nx">topSensitive</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">topSensitive</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="kc">true</span></pre></div> </td> </tr> <tr id="section-98"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-98">#</a> </div> <p>A while loop, the only sort of low-level loop exposed by CoffeeScript. From <span class="kc">true</span></pre></div> </td> </tr> <tr id="section-97"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-97">#</a> </div> <p>A while loop, the only sort of low-level loop exposed by CoffeeScript. From
it, all other loops can be manufactured. Useful in cases where you need more it, all other loops can be manufactured. Useful in cases where you need more
flexibility or more speed than a comprehension can provide.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> flexibility or more speed than a comprehension can provide.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">top = </span> <span class="nx">del</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;top&#39;</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@returns</span> <span class="nv">top = </span> <span class="nx">del</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;top&#39;</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@returns</span>
@ -814,7 +817,7 @@ flexibility or more speed than a comprehension can provide.</p> </td
<span class="nv">cond = </span> <span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">cond = </span> <span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nv">set = </span> <span class="s1">&#39;&#39;</span> <span class="nv">set = </span> <span class="s1">&#39;&#39;</span>
<span class="nx">unless</span> <span class="nx">top</span> <span class="nx">unless</span> <span class="nx">top</span>
<span class="nv">rvar = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">rvar = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;result&#39;</span>
<span class="nv">set = </span><span class="s2">&quot;#{@tab}#{rvar} = [];\n&quot;</span> <span class="nv">set = </span><span class="s2">&quot;#{@tab}#{rvar} = [];\n&quot;</span>
<span class="vi">@body = </span><span class="nx">PushNode</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">rvar</span><span class="p">,</span> <span class="nx">@body</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@body</span> <span class="vi">@body = </span><span class="nx">PushNode</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">rvar</span><span class="p">,</span> <span class="nx">@body</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@body</span>
<span class="nv">pre = </span><span class="s2">&quot;#{set}#{@tab}while (#{cond})&quot;</span> <span class="nv">pre = </span><span class="s2">&quot;#{set}#{@tab}while (#{cond})&quot;</span>
@ -823,15 +826,15 @@ flexibility or more speed than a comprehension can provide.</p> </td
<span class="nv">post = </span><span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">ReturnNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">rvar</span><span class="p">)).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">()))</span> <span class="nv">post = </span><span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">ReturnNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">rvar</span><span class="p">)).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">()))</span>
<span class="k">else</span> <span class="k">else</span>
<span class="nv">post = </span><span class="s1">&#39;&#39;</span> <span class="nv">post = </span><span class="s1">&#39;&#39;</span>
<span class="s2">&quot;#{pre} {\n#{ @body.compile(o) }\n#{@tab}}#{post}&quot;</span></pre></div> </td> </tr> <tr id="section-99"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-99">#</a> </div> <p>The main difference from a JavaScript <em>while</em> is that the CoffeeScript <span class="s2">&quot;#{pre} {\n#{ @body.compile(o) }\n#{@tab}}#{post}&quot;</span></pre></div> </td> </tr> <tr id="section-98"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-98">#</a> </div> <p>The main difference from a JavaScript <em>while</em> is that the CoffeeScript
<em>while</em> can be used as a part of a larger expression -- while loops may <em>while</em> can be used as a part of a larger expression -- while loops may
return an array containing the computed result of each iteration.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-100"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-100">#</a> </div> <h3>OpNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.OpNode = </span><span class="nx">class</span> <span class="nx">OpNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span></pre></div> </td> </tr> <tr id="section-101"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-101">#</a> </div> <p>Simple Arithmetic and logical operations. Performs some conversion from return an array containing the computed result of each iteration.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-99"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-99">#</a> </div> <h3>OpNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.OpNode = </span><span class="nx">class</span> <span class="nx">OpNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span></pre></div> </td> </tr> <tr id="section-100"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-100">#</a> </div> <p>Simple Arithmetic and logical operations. Performs some conversion from
CoffeeScript operations into their JavaScript equivalents.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">CONVERSIONS</span><span class="o">:</span> CoffeeScript operations into their JavaScript equivalents.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">CONVERSIONS</span><span class="o">:</span>
<span class="s1">&#39;==&#39;</span><span class="o">:</span> <span class="s1">&#39;===&#39;</span> <span class="s1">&#39;==&#39;</span><span class="o">:</span> <span class="s1">&#39;===&#39;</span>
<span class="s1">&#39;!=&#39;</span><span class="o">:</span> <span class="s1">&#39;!==&#39;</span></pre></div> </td> </tr> <tr id="section-102"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-102">#</a> </div> <p>The map of conversions from CoffeeScript to JavaScript symbols.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">INVERSIONS</span><span class="o">:</span> <span class="s1">&#39;!=&#39;</span><span class="o">:</span> <span class="s1">&#39;!==&#39;</span></pre></div> </td> </tr> <tr id="section-101"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-101">#</a> </div> <p>The map of conversions from CoffeeScript to JavaScript symbols.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">INVERSIONS</span><span class="o">:</span>
<span class="s1">&#39;!==&#39;</span><span class="o">:</span> <span class="s1">&#39;===&#39;</span> <span class="s1">&#39;!==&#39;</span><span class="o">:</span> <span class="s1">&#39;===&#39;</span>
<span class="s1">&#39;===&#39;</span><span class="o">:</span> <span class="s1">&#39;!==&#39;</span></pre></div> </td> </tr> <tr id="section-103"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-103">#</a> </div> <p>The map of invertible operators.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">CHAINABLE</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;&lt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;=&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;=&#39;</span><span class="p">,</span> <span class="s1">&#39;===&#39;</span><span class="p">,</span> <span class="s1">&#39;!==&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-104"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-104">#</a> </div> <p>The list of operators for which we perform <span class="s1">&#39;===&#39;</span><span class="o">:</span> <span class="s1">&#39;!==&#39;</span></pre></div> </td> </tr> <tr id="section-102"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-102">#</a> </div> <p>The map of invertible operators.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">CHAINABLE</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;&lt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&gt;=&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;=&#39;</span><span class="p">,</span> <span class="s1">&#39;===&#39;</span><span class="p">,</span> <span class="s1">&#39;!==&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-103"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-103">#</a> </div> <p>The list of operators for which we perform
<a href="http://docs.python.org/reference/expressions.html#notin">Python-style comparison chaining</a>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ASSIGNMENT</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;||=&#39;</span><span class="p">,</span> <span class="s1">&#39;&amp;&amp;=&#39;</span><span class="p">,</span> <span class="s1">&#39;?=&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-105"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-105">#</a> </div> <p>Our assignment operators that have no JavaScript equivalent.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">PREFIX_OPERATORS</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;typeof&#39;</span><span class="p">,</span> <span class="s1">&#39;delete&#39;</span><span class="p">]</span> <a href="http://docs.python.org/reference/expressions.html#notin">Python-style comparison chaining</a>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ASSIGNMENT</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;||=&#39;</span><span class="p">,</span> <span class="s1">&#39;&amp;&amp;=&#39;</span><span class="p">,</span> <span class="s1">&#39;?=&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-104"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-104">#</a> </div> <p>Our assignment operators that have no JavaScript equivalent.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">PREFIX_OPERATORS</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;typeof&#39;</span><span class="p">,</span> <span class="s1">&#39;delete&#39;</span><span class="p">]</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;OpNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;OpNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;first&#39;</span><span class="p">,</span> <span class="s1">&#39;second&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;first&#39;</span><span class="p">,</span> <span class="s1">&#39;second&#39;</span><span class="p">]</span>
@ -872,11 +875,11 @@ CoffeeScript operations into their JavaScript equivalents.</p> </td>
<span class="k">return</span> <span class="nx">@compileExistence</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@operator</span> <span class="o">is</span> <span class="s1">&#39;?&#39;</span> <span class="k">return</span> <span class="nx">@compileExistence</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@operator</span> <span class="o">is</span> <span class="s1">&#39;?&#39;</span>
<span class="vi">@first = </span><span class="k">new</span> <span class="nx">ParentheticalNode</span><span class="p">(</span><span class="nx">@first</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@first</span> <span class="k">instanceof</span> <span class="nx">OpNode</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isMutator</span><span class="p">()</span> <span class="vi">@first = </span><span class="k">new</span> <span class="nx">ParentheticalNode</span><span class="p">(</span><span class="nx">@first</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@first</span> <span class="k">instanceof</span> <span class="nx">OpNode</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isMutator</span><span class="p">()</span>
<span class="vi">@second = </span><span class="k">new</span> <span class="nx">ParentheticalNode</span><span class="p">(</span><span class="nx">@second</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@second</span> <span class="k">instanceof</span> <span class="nx">OpNode</span> <span class="o">and</span> <span class="nx">@second</span><span class="p">.</span><span class="nx">isMutator</span><span class="p">()</span> <span class="vi">@second = </span><span class="k">new</span> <span class="nx">ParentheticalNode</span><span class="p">(</span><span class="nx">@second</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@second</span> <span class="k">instanceof</span> <span class="nx">OpNode</span> <span class="o">and</span> <span class="nx">@second</span><span class="p">.</span><span class="nx">isMutator</span><span class="p">()</span>
<span class="p">[</span><span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">@operator</span><span class="p">,</span> <span class="nx">@second</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)].</span><span class="nx">join</span> <span class="s1">&#39; &#39;</span></pre></div> </td> </tr> <tr id="section-106"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-106">#</a> </div> <p>Operators must come before their operands with a space.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileChain</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">@operator</span><span class="p">,</span> <span class="nx">@second</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)].</span><span class="nx">join</span> <span class="s1">&#39; &#39;</span></pre></div> </td> </tr> <tr id="section-105"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-105">#</a> </div> <p>Operators must come before their operands with a space.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileChain</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">shared = </span><span class="nx">@first</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">second</span> <span class="nv">shared = </span><span class="nx">@first</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">second</span>
<span class="p">[</span><span class="nx">@first</span><span class="p">.</span><span class="nx">second</span><span class="p">,</span> <span class="nx">shared</span><span class="p">]</span> <span class="o">=</span> <span class="nx">shared</span><span class="p">.</span><span class="nx">compileReference</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">shared</span><span class="p">.</span><span class="nx">containsType</span> <span class="nx">CallNode</span> <span class="p">[</span><span class="nx">@first</span><span class="p">.</span><span class="nx">second</span><span class="p">,</span> <span class="nx">shared</span><span class="p">]</span> <span class="o">=</span> <span class="nx">shared</span><span class="p">.</span><span class="nx">compileReference</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">shared</span><span class="p">.</span><span class="nx">containsType</span> <span class="nx">CallNode</span>
<span class="p">[</span><span class="nx">first</span><span class="p">,</span> <span class="nx">second</span><span class="p">,</span> <span class="nx">shared</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">@second</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">shared</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)]</span> <span class="p">[</span><span class="nx">first</span><span class="p">,</span> <span class="nx">second</span><span class="p">,</span> <span class="nx">shared</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">@second</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">),</span> <span class="nx">shared</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)]</span>
<span class="s2">&quot;(#{first}) &amp;&amp; (#{shared} #{@operator} #{second})&quot;</span></pre></div> </td> </tr> <tr id="section-107"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-107">#</a> </div> <p>Mimic Python's chained comparisons when multiple comparison operators are <span class="s2">&quot;(#{first}) &amp;&amp; (#{shared} #{@operator} #{second})&quot;</span></pre></div> </td> </tr> <tr id="section-106"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-106">#</a> </div> <p>Mimic Python's chained comparisons when multiple comparison operators are
used sequentially. For example:</p> used sequentially. For example:</p>
<pre><code>bin/coffee -e "puts 50 &lt; 65 &gt; 10" <pre><code>bin/coffee -e "puts 50 &lt; 65 &gt; 10"
@ -887,16 +890,16 @@ true
<span class="nv">second = </span><span class="s2">&quot;(#{second})&quot;</span> <span class="k">if</span> <span class="nx">@second</span> <span class="k">instanceof</span> <span class="nx">OpNode</span> <span class="nv">second = </span><span class="s2">&quot;(#{second})&quot;</span> <span class="k">if</span> <span class="nx">@second</span> <span class="k">instanceof</span> <span class="nx">OpNode</span>
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">first</span><span class="p">)</span> <span class="k">if</span> <span class="nx">first</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">IDENTIFIER</span><span class="p">)</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">first</span><span class="p">)</span> <span class="k">if</span> <span class="nx">first</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">IDENTIFIER</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;#{first} = #{ ExistenceNode.compileTest(o, literal(firstVar))[0] } ? #{firstVar} : #{second}&quot;</span> <span class="k">if</span> <span class="nx">@operator</span> <span class="o">is</span> <span class="s1">&#39;?=&#39;</span> <span class="k">return</span> <span class="s2">&quot;#{first} = #{ ExistenceNode.compileTest(o, literal(firstVar))[0] } ? #{firstVar} : #{second}&quot;</span> <span class="k">if</span> <span class="nx">@operator</span> <span class="o">is</span> <span class="s1">&#39;?=&#39;</span>
<span class="s2">&quot;#{first} #{ @operator.substr(0, 2) } (#{firstVar} = #{second})&quot;</span></pre></div> </td> </tr> <tr id="section-108"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-108">#</a> </div> <p>When compiling a conditional assignment, take care to ensure that the <span class="s2">&quot;#{first} #{ @operator.substr(0, 2) } (#{firstVar} = #{second})&quot;</span></pre></div> </td> </tr> <tr id="section-107"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-107">#</a> </div> <p>When compiling a conditional assignment, take care to ensure that the
operands are only evaluated once, even though we have to reference them operands are only evaluated once, even though we have to reference them
more than once.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileExistence</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> more than once.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileExistence</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="p">[</span><span class="nx">test</span><span class="p">,</span> <span class="nx">ref</span><span class="p">]</span> <span class="o">=</span> <span class="nx">ExistenceNode</span><span class="p">.</span><span class="nx">compileTest</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">@first</span><span class="p">)</span> <span class="p">[</span><span class="nx">test</span><span class="p">,</span> <span class="nx">ref</span><span class="p">]</span> <span class="o">=</span> <span class="nx">ExistenceNode</span><span class="p">.</span><span class="nx">compileTest</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">@first</span><span class="p">)</span>
<span class="s2">&quot;#{test} ? #{ref} : #{ @second.compile(o) }&quot;</span></pre></div> </td> </tr> <tr id="section-109"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-109">#</a> </div> <p>If this is an existence operator, we delegate to <code>ExistenceNode.compileTest</code> <span class="s2">&quot;#{test} ? #{ref} : #{ @second.compile(o) }&quot;</span></pre></div> </td> </tr> <tr id="section-108"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-108">#</a> </div> <p>If this is an existence operator, we delegate to <code>ExistenceNode.compileTest</code>
to give us the safe references for the variables.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileUnary</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> to give us the safe references for the variables.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileUnary</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">space = </span><span class="k">if</span> <span class="nx">indexOf</span><span class="p">(</span><span class="nx">@PREFIX_OPERATORS</span><span class="p">,</span> <span class="nx">@operator</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">then</span> <span class="s1">&#39; &#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">space = </span><span class="k">if</span> <span class="nx">indexOf</span><span class="p">(</span><span class="nx">@PREFIX_OPERATORS</span><span class="p">,</span> <span class="nx">@operator</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">then</span> <span class="s1">&#39; &#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nv">parts = </span><span class="p">[</span><span class="nx">@operator</span><span class="p">,</span> <span class="nx">space</span><span class="p">,</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)]</span> <span class="nv">parts = </span><span class="p">[</span><span class="nx">@operator</span><span class="p">,</span> <span class="nx">space</span><span class="p">,</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)]</span>
<span class="nv">parts = </span><span class="nx">parts</span><span class="p">.</span><span class="nx">reverse</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@flip</span> <span class="nv">parts = </span><span class="nx">parts</span><span class="p">.</span><span class="nx">reverse</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@flip</span>
<span class="nx">parts</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-110"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-110">#</a> </div> <p>Compile a unary <strong>OpNode</strong>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.InNode = </span><span class="nx">class</span> <span class="nx">InNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="nx">parts</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-109"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-109">#</a> </div> <p>Compile a unary <strong>OpNode</strong>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.InNode = </span><span class="nx">class</span> <span class="nx">InNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;InNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;InNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;object&#39;</span><span class="p">,</span> <span class="s1">&#39;array&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;object&#39;</span><span class="p">,</span> <span class="s1">&#39;array&#39;</span><span class="p">]</span>
@ -918,9 +921,9 @@ to give us the safe references for the variables.</p> </td>
<span class="nx">compileLoopTest</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileLoopTest</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="p">[</span><span class="nx">@arr1</span><span class="p">,</span> <span class="nx">@arr2</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@array</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">precompile</span><span class="o">:</span> <span class="kc">yes</span> <span class="p">[</span><span class="nx">@arr1</span><span class="p">,</span> <span class="nx">@arr2</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@array</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">precompile</span><span class="o">:</span> <span class="kc">yes</span>
<span class="p">[</span><span class="nx">i</span><span class="p">,</span> <span class="nx">l</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">(),</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()]</span> <span class="p">[</span><span class="nx">i</span><span class="p">,</span> <span class="nx">l</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">(</span><span class="s1">&#39;i&#39;</span><span class="p">),</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">(</span><span class="s1">&#39;len&#39;</span><span class="p">)]</span>
<span class="nv">prefix = </span><span class="k">if</span> <span class="nx">@obj1</span> <span class="o">isnt</span> <span class="nx">@obj2</span> <span class="k">then</span> <span class="nx">@obj1</span> <span class="o">+</span> <span class="s1">&#39;; &#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">prefix = </span><span class="k">if</span> <span class="nx">@obj1</span> <span class="o">isnt</span> <span class="nx">@obj2</span> <span class="k">then</span> <span class="nx">@obj1</span> <span class="o">+</span> <span class="s1">&#39;; &#39;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="s2">&quot;(function(){ #{prefix}for (var #{i}=0, #{l}=#{@arr1}.length; #{i}&lt;#{l}; #{i}++) { if (#{@arr2}[#{i}] === #{@obj2}) return true; } return false; }).call(this)&quot;</span></pre></div> </td> </tr> <tr id="section-111"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-111">#</a> </div> <h3>InNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-112"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-112">#</a> </div> <h3>TryNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.TryNode = </span><span class="nx">class</span> <span class="nx">TryNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="s2">&quot;(function(){ #{prefix}for (var #{i}=0, #{l}=#{@arr1}.length; #{i}&lt;#{l}; #{i}++) { if (#{@arr2}[#{i}] === #{@obj2}) return true; } return false; }).call(this)&quot;</span></pre></div> </td> </tr> <tr id="section-110"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-110">#</a> </div> <h3>InNode</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-111"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-111">#</a> </div> <h3>TryNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.TryNode = </span><span class="nx">class</span> <span class="nx">TryNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;TryNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;TryNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;attempt&#39;</span><span class="p">,</span> <span class="s1">&#39;recovery&#39;</span><span class="p">,</span> <span class="s1">&#39;ensure&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;attempt&#39;</span><span class="p">,</span> <span class="s1">&#39;recovery&#39;</span><span class="p">,</span> <span class="s1">&#39;ensure&#39;</span><span class="p">]</span>
@ -932,26 +935,26 @@ to give us the safe references for the variables.</p> </td>
<span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="vi">@attempt = </span><span class="nx">@attempt</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@attempt</span> <span class="vi">@attempt = </span><span class="nx">@attempt</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@attempt</span>
<span class="vi">@recovery = </span><span class="nx">@recovery</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@recovery</span> <span class="vi">@recovery = </span><span class="nx">@recovery</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@recovery</span>
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-113"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-113">#</a> </div> <p>A classic <em>try/catch/finally</em> block.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-112"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-112">#</a> </div> <p>A classic <em>try/catch/finally</em> block.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">o.indent = </span><span class="nx">@idt</span> <span class="mi">1</span> <span class="nv">o.indent = </span><span class="nx">@idt</span> <span class="mi">1</span>
<span class="nv">o.top = </span><span class="kc">true</span> <span class="nv">o.top = </span><span class="kc">true</span>
<span class="nv">attemptPart = </span><span class="nx">@attempt</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">attemptPart = </span><span class="nx">@attempt</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nv">errorPart = </span><span class="k">if</span> <span class="nx">@error</span> <span class="k">then</span> <span class="s2">&quot; (#{ @error.compile(o) }) &quot;</span> <span class="k">else</span> <span class="s1">&#39; &#39;</span> <span class="nv">errorPart = </span><span class="k">if</span> <span class="nx">@error</span> <span class="k">then</span> <span class="s2">&quot; (#{ @error.compile(o) }) &quot;</span> <span class="k">else</span> <span class="s1">&#39; &#39;</span>
<span class="nv">catchPart = </span><span class="k">if</span> <span class="nx">@recovery</span> <span class="k">then</span> <span class="s2">&quot; catch#{errorPart}{\n#{ @recovery.compile(o) }\n#{@tab}}&quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">catchPart = </span><span class="k">if</span> <span class="nx">@recovery</span> <span class="k">then</span> <span class="s2">&quot; catch#{errorPart}{\n#{ @recovery.compile(o) }\n#{@tab}}&quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nv">finallyPart = </span><span class="p">(</span><span class="nx">@ensure</span> <span class="o">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">and</span> <span class="s1">&#39; finally {\n&#39;</span> <span class="o">+</span> <span class="nx">@ensure</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;\n#{@tab}}&quot;</span> <span class="nv">finallyPart = </span><span class="p">(</span><span class="nx">@ensure</span> <span class="o">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">and</span> <span class="s1">&#39; finally {\n&#39;</span> <span class="o">+</span> <span class="nx">@ensure</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;\n#{@tab}}&quot;</span>
<span class="s2">&quot;#{@tab}try {\n#{attemptPart}\n#{@tab}}#{catchPart}#{finallyPart}&quot;</span></pre></div> </td> </tr> <tr id="section-114"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-114">#</a> </div> <p>Compilation is more or less as you would expect -- the <em>finally</em> clause <span class="s2">&quot;#{@tab}try {\n#{attemptPart}\n#{@tab}}#{catchPart}#{finallyPart}&quot;</span></pre></div> </td> </tr> <tr id="section-113"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-113">#</a> </div> <p>Compilation is more or less as you would expect -- the <em>finally</em> clause
is optional, the <em>catch</em> is not.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-115"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-115">#</a> </div> <h3>ThrowNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ThrowNode = </span><span class="nx">class</span> <span class="nx">ThrowNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> is optional, the <em>catch</em> is not.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-114"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-114">#</a> </div> <h3>ThrowNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ThrowNode = </span><span class="nx">class</span> <span class="nx">ThrowNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ThrowNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ThrowNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;expression&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;expression&#39;</span><span class="p">]</span>
<span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">yes</span> <span class="nx">isStatement</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="kc">yes</span>
<span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">constructor</span><span class="o">:</span> <span class="p">(</span><span class="nx">@expression</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">super</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-116"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-116">#</a> </div> <p>Simple node to throw an exception.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="k">super</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-115"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-115">#</a> </div> <p>Simple node to throw an exception.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">makeReturn</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="k">this</span> <span class="k">return</span> <span class="k">this</span>
<span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="s2">&quot;#{@tab}throw #{@expression.compile(o)};&quot;</span></pre></div> </td> </tr> <tr id="section-117"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-117">#</a> </div> <p>A <strong>ThrowNode</strong> is already a return, of sorts...</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-118"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-118">#</a> </div> <h3>ExistenceNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ExistenceNode = </span><span class="nx">class</span> <span class="nx">ExistenceNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="s2">&quot;#{@tab}throw #{@expression.compile(o)};&quot;</span></pre></div> </td> </tr> <tr id="section-116"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-116">#</a> </div> <p>A <strong>ThrowNode</strong> is already a return, of sorts...</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-117"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-117">#</a> </div> <h3>ExistenceNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ExistenceNode = </span><span class="nx">class</span> <span class="nx">ExistenceNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ExistenceNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ExistenceNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;expression&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;expression&#39;</span><span class="p">]</span>
@ -961,13 +964,13 @@ is optional, the <em>catch</em> is not.</p> </td> <td cl
<span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">test = </span><span class="nx">ExistenceNode</span><span class="p">.</span><span class="nx">compileTest</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">@expression</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="nv">test = </span><span class="nx">ExistenceNode</span><span class="p">.</span><span class="nx">compileTest</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">@expression</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="nx">@parenthetical</span> <span class="k">then</span> <span class="nx">test</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">test</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">else</span> <span class="nx">test</span></pre></div> </td> </tr> <tr id="section-119"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-119">#</a> </div> <p>Checks a variable for existence -- not <em>null</em> and not <em>undefined</em>. This is <span class="k">if</span> <span class="nx">@parenthetical</span> <span class="k">then</span> <span class="nx">test</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">test</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="k">else</span> <span class="nx">test</span></pre></div> </td> </tr> <tr id="section-118"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-118">#</a> </div> <p>Checks a variable for existence -- not <em>null</em> and not <em>undefined</em>. This is
similar to <code>.nil?</code> in Ruby, and avoids having to consult a JavaScript truth similar to <code>.nil?</code> in Ruby, and avoids having to consult a JavaScript truth
table.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@compileTest</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">variable</span><span class="p">)</span> <span class="o">-&gt;</span> table.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@compileTest</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">variable</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="p">[</span><span class="nx">first</span><span class="p">,</span> <span class="nx">second</span><span class="p">]</span> <span class="o">=</span> <span class="nx">variable</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">precompile</span><span class="o">:</span> <span class="kc">yes</span> <span class="p">[</span><span class="nx">first</span><span class="p">,</span> <span class="nx">second</span><span class="p">]</span> <span class="o">=</span> <span class="nx">variable</span><span class="p">.</span><span class="nx">compileReference</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">precompile</span><span class="o">:</span> <span class="kc">yes</span>
<span class="p">[</span><span class="s2">&quot;(typeof #{first} !== \&quot;undefined\&quot; &amp;&amp; #{second} !== null)&quot;</span><span class="p">,</span> <span class="nx">second</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-120"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-120">#</a> </div> <p>The meat of the <strong>ExistenceNode</strong> is in this static <code>compileTest</code> method <span class="p">[</span><span class="s2">&quot;(typeof #{first} !== \&quot;undefined\&quot; &amp;&amp; #{second} !== null)&quot;</span><span class="p">,</span> <span class="nx">second</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-119"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-119">#</a> </div> <p>The meat of the <strong>ExistenceNode</strong> is in this static <code>compileTest</code> method
because other nodes like to check the existence of their variables as well. because other nodes like to check the existence of their variables as well.
Be careful not to double-evaluate anything.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-121"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-121">#</a> </div> <h3>ParentheticalNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ParentheticalNode = </span><span class="nx">class</span> <span class="nx">ParentheticalNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> Be careful not to double-evaluate anything.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-120"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-120">#</a> </div> <h3>ParentheticalNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ParentheticalNode = </span><span class="nx">class</span> <span class="nx">ParentheticalNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ParentheticalNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ParentheticalNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;expression&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;expression&#39;</span><span class="p">]</span>
@ -991,11 +994,11 @@ Be careful not to double-evaluate anything.</p> </td> <t
<span class="k">return</span> <span class="nx">code</span> <span class="k">if</span> <span class="nx">top</span> <span class="o">and</span> <span class="nx">@expression</span><span class="p">.</span><span class="nx">isPureStatement</span> <span class="nx">o</span> <span class="k">return</span> <span class="nx">code</span> <span class="k">if</span> <span class="nx">top</span> <span class="o">and</span> <span class="nx">@expression</span><span class="p">.</span><span class="nx">isPureStatement</span> <span class="nx">o</span>
<span class="k">if</span> <span class="nx">@parenthetical</span> <span class="o">or</span> <span class="nx">@isStatement</span> <span class="nx">o</span> <span class="k">if</span> <span class="nx">@parenthetical</span> <span class="o">or</span> <span class="nx">@isStatement</span> <span class="nx">o</span>
<span class="k">return</span> <span class="k">if</span> <span class="nx">top</span> <span class="k">then</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="nx">code</span> <span class="o">+</span> <span class="s1">&#39;;&#39;</span> <span class="k">else</span> <span class="nx">code</span> <span class="k">return</span> <span class="k">if</span> <span class="nx">top</span> <span class="k">then</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="nx">code</span> <span class="o">+</span> <span class="s1">&#39;;&#39;</span> <span class="k">else</span> <span class="nx">code</span>
<span class="s2">&quot;(#{code})&quot;</span></pre></div> </td> </tr> <tr id="section-122"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-122">#</a> </div> <p>An extra set of parentheses, specified explicitly in the source. At one time <span class="s2">&quot;(#{code})&quot;</span></pre></div> </td> </tr> <tr id="section-121"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-121">#</a> </div> <p>An extra set of parentheses, specified explicitly in the source. At one time
we tried to clean up the results by detecting and removing redundant we tried to clean up the results by detecting and removing redundant
parentheses, but no longer -- you can put in as many as you please.</p> parentheses, but no longer -- you can put in as many as you please.</p>
<p>Parentheses are a good way to force any statement to become an expression.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-123"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-123">#</a> </div> <h3>ForNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ForNode = </span><span class="nx">class</span> <span class="nx">ForNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <p>Parentheses are a good way to force any statement to become an expression.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-122"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-122">#</a> </div> <h3>ForNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.ForNode = </span><span class="nx">class</span> <span class="nx">ForNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ForNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;ForNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;body&#39;</span><span class="p">,</span> <span class="s1">&#39;source&#39;</span><span class="p">,</span> <span class="s1">&#39;guard&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;body&#39;</span><span class="p">,</span> <span class="s1">&#39;source&#39;</span><span class="p">,</span> <span class="s1">&#39;guard&#39;</span><span class="p">]</span>
@ -1024,7 +1027,7 @@ parentheses, but no longer -- you can put in as many as you please.</p>
<span class="nx">compileReturnValue</span><span class="o">:</span> <span class="p">(</span><span class="nx">val</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileReturnValue</span><span class="o">:</span> <span class="p">(</span><span class="nx">val</span><span class="p">,</span> <span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">ReturnNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">val</span><span class="p">)).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@returns</span> <span class="k">return</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">ReturnNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">val</span><span class="p">)).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">if</span> <span class="nx">@returns</span>
<span class="k">return</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">val</span> <span class="k">if</span> <span class="nx">val</span> <span class="k">return</span> <span class="s1">&#39;\n&#39;</span> <span class="o">+</span> <span class="nx">val</span> <span class="k">if</span> <span class="nx">val</span>
<span class="s1">&#39;&#39;</span></pre></div> </td> </tr> <tr id="section-124"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-124">#</a> </div> <p>CoffeeScript's replacement for the <em>for</em> loop is our array and object <span class="s1">&#39;&#39;</span></pre></div> </td> </tr> <tr id="section-123"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-123">#</a> </div> <p>CoffeeScript's replacement for the <em>for</em> loop is our array and object
comprehensions, that compile into <em>for</em> loops here. They also act as an comprehensions, that compile into <em>for</em> loops here. They also act as an
expression, able to return the result of each filtered iteration.</p> expression, able to return the result of each filtered iteration.</p>
@ -1036,12 +1039,12 @@ you can map and filter in a single pass.</p> </td> <td c
<span class="nv">source = </span><span class="k">if</span> <span class="nx">range</span> <span class="k">then</span> <span class="nx">@source</span><span class="p">.</span><span class="nx">base</span> <span class="k">else</span> <span class="nx">@source</span> <span class="nv">source = </span><span class="k">if</span> <span class="nx">range</span> <span class="k">then</span> <span class="nx">@source</span><span class="p">.</span><span class="nx">base</span> <span class="k">else</span> <span class="nx">@source</span>
<span class="nv">codeInBody = </span><span class="nx">@body</span><span class="p">.</span><span class="nx">contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span> <span class="k">instanceof</span> <span class="nx">CodeNode</span> <span class="nv">codeInBody = </span><span class="nx">@body</span><span class="p">.</span><span class="nx">contains</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">n</span> <span class="k">instanceof</span> <span class="nx">CodeNode</span>
<span class="nv">scope = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span> <span class="nv">scope = </span><span class="nx">o</span><span class="p">.</span><span class="nx">scope</span>
<span class="nv">name = </span><span class="p">(</span><span class="nx">@name</span> <span class="o">and</span> <span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span> <span class="o">or</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">name = </span><span class="p">(</span><span class="nx">@name</span> <span class="o">and</span> <span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">))</span> <span class="o">or</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;i&#39;</span>
<span class="nv">index = </span><span class="nx">@index</span> <span class="o">and</span> <span class="nx">@index</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span> <span class="nv">index = </span><span class="nx">@index</span> <span class="o">and</span> <span class="nx">@index</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
<span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">immediate</span><span class="o">:</span> <span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">name</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@pattern</span> <span class="o">and</span> <span class="p">(</span><span class="nx">range</span> <span class="o">or</span> <span class="o">not</span> <span class="nx">codeInBody</span><span class="p">)</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">immediate</span><span class="o">:</span> <span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">name</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@pattern</span> <span class="o">and</span> <span class="p">(</span><span class="nx">range</span> <span class="o">or</span> <span class="o">not</span> <span class="nx">codeInBody</span><span class="p">)</span>
<span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">immediate</span><span class="o">:</span> <span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">index</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">immediate</span><span class="o">:</span> <span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">index</span>
<span class="nv">rvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nx">unless</span> <span class="nx">topLevel</span> <span class="nv">rvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;result&#39;</span> <span class="nx">unless</span> <span class="nx">topLevel</span>
<span class="nv">ivar = </span><span class="k">if</span> <span class="nx">codeInBody</span> <span class="k">then</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">range</span> <span class="k">then</span> <span class="nx">name</span> <span class="k">else</span> <span class="nx">index</span> <span class="o">or</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">ivar = </span><span class="k">if</span> <span class="nx">codeInBody</span> <span class="k">then</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;i&#39;</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">range</span> <span class="k">then</span> <span class="nx">name</span> <span class="k">else</span> <span class="nx">index</span> <span class="o">or</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;i&#39;</span>
<span class="nv">varPart = </span><span class="s1">&#39;&#39;</span> <span class="nv">varPart = </span><span class="s1">&#39;&#39;</span>
<span class="nv">guardPart = </span><span class="s1">&#39;&#39;</span> <span class="nv">guardPart = </span><span class="s1">&#39;&#39;</span>
<span class="nv">body = </span><span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="nx">@body</span><span class="p">])</span> <span class="nv">body = </span><span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="nx">@body</span><span class="p">])</span>
@ -1049,14 +1052,14 @@ you can map and filter in a single pass.</p> </td> <td c
<span class="nv">sourcePart = </span><span class="nx">source</span><span class="p">.</span><span class="nx">compileVariables</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">sourcePart = </span><span class="nx">source</span><span class="p">.</span><span class="nx">compileVariables</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nv">forPart = </span><span class="nx">source</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">index</span><span class="o">:</span> <span class="nx">ivar</span><span class="p">,</span> <span class="nx">step</span><span class="o">:</span> <span class="nx">@step</span> <span class="nv">forPart = </span><span class="nx">source</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">index</span><span class="o">:</span> <span class="nx">ivar</span><span class="p">,</span> <span class="nx">step</span><span class="o">:</span> <span class="nx">@step</span>
<span class="k">else</span> <span class="k">else</span>
<span class="nv">svar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">svar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;ref&#39;</span>
<span class="nv">sourcePart = </span><span class="s2">&quot;#{svar} = #{ @source.compile(o) };&quot;</span> <span class="nv">sourcePart = </span><span class="s2">&quot;#{svar} = #{ @source.compile(o) };&quot;</span>
<span class="k">if</span> <span class="nx">@pattern</span> <span class="k">if</span> <span class="nx">@pattern</span>
<span class="nv">namePart = </span><span class="k">new</span> <span class="nx">AssignNode</span><span class="p">(</span><span class="nx">@name</span><span class="p">,</span> <span class="nx">literal</span><span class="p">(</span><span class="s2">&quot;#{svar}[#{ivar}]&quot;</span><span class="p">)).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span><span class="p">})</span> <span class="o">+</span> <span class="s1">&#39;\n&#39;</span> <span class="nv">namePart = </span><span class="k">new</span> <span class="nx">AssignNode</span><span class="p">(</span><span class="nx">@name</span><span class="p">,</span> <span class="nx">literal</span><span class="p">(</span><span class="s2">&quot;#{svar}[#{ivar}]&quot;</span><span class="p">)).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span> <span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">keepLevel</span><span class="o">:</span> <span class="kc">yes</span><span class="p">})</span> <span class="o">+</span> <span class="s1">&#39;\n&#39;</span>
<span class="k">else</span> <span class="k">else</span>
<span class="nv">namePart = </span><span class="s2">&quot;#{name} = #{svar}[#{ivar}]&quot;</span> <span class="k">if</span> <span class="nx">name</span> <span class="nv">namePart = </span><span class="s2">&quot;#{name} = #{svar}[#{ivar}]&quot;</span> <span class="k">if</span> <span class="nx">name</span>
<span class="nx">unless</span> <span class="nx">@object</span> <span class="nx">unless</span> <span class="nx">@object</span>
<span class="nv">lvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span><span class="p">()</span> <span class="nv">lvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">&#39;len&#39;</span>
<span class="nv">stepPart = </span><span class="k">if</span> <span class="nx">@step</span> <span class="k">then</span> <span class="s2">&quot;#{ivar} += #{ @step.compile(o) }&quot;</span> <span class="k">else</span> <span class="s2">&quot;#{ivar}++&quot;</span> <span class="nv">stepPart = </span><span class="k">if</span> <span class="nx">@step</span> <span class="k">then</span> <span class="s2">&quot;#{ivar} += #{ @step.compile(o) }&quot;</span> <span class="k">else</span> <span class="s2">&quot;#{ivar}++&quot;</span>
<span class="nv">forPart = </span><span class="s2">&quot;#{ivar} = 0, #{lvar} = #{svar}.length; #{ivar} &lt; #{lvar}; #{stepPart}&quot;</span> <span class="nv">forPart = </span><span class="s2">&quot;#{ivar} = 0, #{lvar} = #{svar}.length; #{ivar} &lt; #{lvar}; #{stepPart}&quot;</span>
<span class="nv">sourcePart = </span><span class="p">(</span><span class="k">if</span> <span class="nx">rvar</span> <span class="k">then</span> <span class="s2">&quot;#{rvar} = []; &quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="nx">sourcePart</span> <span class="nv">sourcePart = </span><span class="p">(</span><span class="k">if</span> <span class="nx">rvar</span> <span class="k">then</span> <span class="s2">&quot;#{rvar} = []; &quot;</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="nx">sourcePart</span>
@ -1078,10 +1081,10 @@ you can map and filter in a single pass.</p> </td> <td c
<span class="nv">guardPart = </span><span class="s2">&quot;\n#{@idt(1)}if (!#{utility(&#39;hasProp&#39;)}.call(#{svar}, #{ivar})) continue;&quot;</span> <span class="nx">unless</span> <span class="nx">@raw</span> <span class="nv">guardPart = </span><span class="s2">&quot;\n#{@idt(1)}if (!#{utility(&#39;hasProp&#39;)}.call(#{svar}, #{ivar})) continue;&quot;</span> <span class="nx">unless</span> <span class="nx">@raw</span>
<span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span><span class="p">}))</span> <span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="nx">top</span><span class="o">:</span> <span class="kc">true</span><span class="p">}))</span>
<span class="nv">vars = </span><span class="k">if</span> <span class="nx">range</span> <span class="k">then</span> <span class="nx">name</span> <span class="k">else</span> <span class="s2">&quot;#{name}, #{ivar}&quot;</span> <span class="nv">vars = </span><span class="k">if</span> <span class="nx">range</span> <span class="k">then</span> <span class="nx">name</span> <span class="k">else</span> <span class="s2">&quot;#{name}, #{ivar}&quot;</span>
<span class="s2">&quot;#{sourcePart}for (#{forPart}) {#{guardPart}\n#{varPart}#{body}\n#{@tab}}#{returnResult}&quot;</span></pre></div> </td> </tr> <tr id="section-125"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-125">#</a> </div> <p>Welcome to the hairiest method in all of CoffeeScript. Handles the inner <span class="s2">&quot;#{sourcePart}for (#{forPart}) {#{guardPart}\n#{varPart}#{body}\n#{@tab}}#{returnResult}&quot;</span></pre></div> </td> </tr> <tr id="section-124"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-124">#</a> </div> <p>Welcome to the hairiest method in all of CoffeeScript. Handles the inner
loop, filtering, stepping, and result saving for array, object, and range loop, filtering, stepping, and result saving for array, object, and range
comprehensions. Some of the generated code can be shared in common, and comprehensions. Some of the generated code can be shared in common, and
some cannot.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-126"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-126">#</a> </div> <h3>SwitchNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.SwitchNode = </span><span class="nx">class</span> <span class="nx">SwitchNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> some cannot.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-125"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-125">#</a> </div> <h3>SwitchNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.SwitchNode = </span><span class="nx">class</span> <span class="nx">SwitchNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;SwitchNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;SwitchNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;subject&#39;</span><span class="p">,</span> <span class="s1">&#39;cases&#39;</span><span class="p">,</span> <span class="s1">&#39;otherwise&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;subject&#39;</span><span class="p">,</span> <span class="s1">&#39;cases&#39;</span><span class="p">,</span> <span class="s1">&#39;otherwise&#39;</span><span class="p">]</span>
@ -1099,7 +1102,7 @@ some cannot.</p> </td> <td class="code"> <
<span class="k">this</span> <span class="k">this</span>
<span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileNode</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">idt = o.indent = </span><span class="nx">@idt</span> <span class="mi">1</span> <span class="nv">idt = o.indent = </span><span class="nx">@idt</span> <span class="mi">2</span>
<span class="nv">o.top = </span><span class="kc">yes</span> <span class="nv">o.top = </span><span class="kc">yes</span>
<span class="nv">code = </span><span class="s2">&quot;#{ @tab }switch (#{ @subject.compile o }) {&quot;</span> <span class="nv">code = </span><span class="s2">&quot;#{ @tab }switch (#{ @subject.compile o }) {&quot;</span>
<span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">@cases</span> <span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">@cases</span>
@ -1107,13 +1110,13 @@ some cannot.</p> </td> <td class="code"> <
<span class="nv">exprs = </span><span class="nx">block</span><span class="p">.</span><span class="nx">expressions</span> <span class="nv">exprs = </span><span class="nx">block</span><span class="p">.</span><span class="nx">expressions</span>
<span class="k">for</span> <span class="nx">condition</span> <span class="k">in</span> <span class="nx">flatten</span> <span class="p">[</span><span class="nx">conditions</span><span class="p">]</span> <span class="k">for</span> <span class="nx">condition</span> <span class="k">in</span> <span class="nx">flatten</span> <span class="p">[</span><span class="nx">conditions</span><span class="p">]</span>
<span class="nv">condition = </span><span class="k">new</span> <span class="nx">OpNode</span> <span class="s1">&#39;!!&#39;</span><span class="p">,</span> <span class="k">new</span> <span class="nx">ParentheticalNode</span> <span class="nx">condition</span> <span class="k">if</span> <span class="nx">@tags</span><span class="p">.</span><span class="nx">subjectless</span> <span class="nv">condition = </span><span class="k">new</span> <span class="nx">OpNode</span> <span class="s1">&#39;!!&#39;</span><span class="p">,</span> <span class="k">new</span> <span class="nx">ParentheticalNode</span> <span class="nx">condition</span> <span class="k">if</span> <span class="nx">@tags</span><span class="p">.</span><span class="nx">subjectless</span>
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ @tab }case #{ condition.compile o }:&quot;</span> <span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ @idt(1) }case #{ condition.compile o }:&quot;</span>
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ block.compile o }&quot;</span> <span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ block.compile o }&quot;</span>
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ idt }break;&quot;</span> <span class="nx">unless</span> <span class="nx">exprs</span><span class="p">[</span><span class="nx">exprs</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="k">instanceof</span> <span class="nx">ReturnNode</span> <span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ idt }break;&quot;</span> <span class="nx">unless</span> <span class="nx">exprs</span><span class="p">[</span><span class="nx">exprs</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="k">instanceof</span> <span class="nx">ReturnNode</span>
<span class="k">if</span> <span class="nx">@otherwise</span> <span class="k">if</span> <span class="nx">@otherwise</span>
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ @tab }default:\n#{ @otherwise.compile o }&quot;</span> <span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ @idt(1) }default:\n#{ @otherwise.compile o }&quot;</span>
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ @tab }}&quot;</span> <span class="nx">code</span> <span class="o">+=</span> <span class="s2">&quot;\n#{ @tab }}&quot;</span>
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-127"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-127">#</a> </div> <p>A JavaScript <em>switch</em> statement. Converts into a returnable expression on-demand.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-128"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-128">#</a> </div> <h3>IfNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.IfNode = </span><span class="nx">class</span> <span class="nx">IfNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-126"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-126">#</a> </div> <p>A JavaScript <em>switch</em> statement. Converts into a returnable expression on-demand.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-127"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-127">#</a> </div> <h3>IfNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.IfNode = </span><span class="nx">class</span> <span class="nx">IfNode</span> <span class="k">extends</span> <span class="nx">BaseNode</span>
<span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;IfNode&#39;</span> <span class="nx">class</span><span class="o">:</span> <span class="s1">&#39;IfNode&#39;</span>
<span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;condition&#39;</span><span class="p">,</span> <span class="s1">&#39;body&#39;</span><span class="p">,</span> <span class="s1">&#39;elseBody&#39;</span><span class="p">,</span> <span class="s1">&#39;assigner&#39;</span><span class="p">]</span> <span class="nx">children</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;condition&#39;</span><span class="p">,</span> <span class="s1">&#39;body&#39;</span><span class="p">,</span> <span class="s1">&#39;elseBody&#39;</span><span class="p">,</span> <span class="s1">&#39;assigner&#39;</span><span class="p">]</span>
@ -1135,7 +1138,7 @@ some cannot.</p> </td> <td class="code"> <
<span class="nx">forceStatement</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">forceStatement</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="vi">@tags.statement = </span><span class="kc">true</span> <span class="vi">@tags.statement = </span><span class="kc">true</span>
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-129"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-129">#</a> </div> <p><em>If/else</em> statements. Acts as an expression by pushing down requested returns <span class="k">this</span></pre></div> </td> </tr> <tr id="section-128"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-128">#</a> </div> <p><em>If/else</em> statements. Acts as an expression by pushing down requested returns
to the last line of each clause.</p> to the last line of each clause.</p>
<p>Single-expression <strong>IfNodes</strong> are compiled into ternary operators if possible, <p>Single-expression <strong>IfNodes</strong> are compiled into ternary operators if possible,
@ -1145,7 +1148,7 @@ because ternaries are already proper expressions, and don't need conversion.</p>
<span class="k">else</span> <span class="k">else</span>
<span class="vi">@isChain = </span><span class="nx">elseBody</span> <span class="k">instanceof</span> <span class="nx">IfNode</span> <span class="vi">@isChain = </span><span class="nx">elseBody</span> <span class="k">instanceof</span> <span class="nx">IfNode</span>
<span class="vi">@elseBody = </span><span class="nx">@ensureExpressions</span> <span class="nx">elseBody</span> <span class="vi">@elseBody = </span><span class="nx">@ensureExpressions</span> <span class="nx">elseBody</span>
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-130"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-130">#</a> </div> <p>Rewrite a chain of <strong>IfNodes</strong> to add a default case as the final <em>else</em>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isStatement</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-129"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-129">#</a> </div> <p>Rewrite a chain of <strong>IfNodes</strong> to add a default case as the final <em>else</em>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">isStatement</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@statement</span> <span class="o">or=</span> <span class="o">!!</span><span class="p">((</span><span class="nx">o</span> <span class="o">and</span> <span class="nx">o</span><span class="p">.</span><span class="nx">top</span><span class="p">)</span> <span class="o">or</span> <span class="nx">@tags</span><span class="p">.</span><span class="nx">statement</span> <span class="o">or</span> <span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">or</span> <span class="p">(</span><span class="nx">@elseBody</span> <span class="o">and</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)))</span> <span class="nx">@statement</span> <span class="o">or=</span> <span class="o">!!</span><span class="p">((</span><span class="nx">o</span> <span class="o">and</span> <span class="nx">o</span><span class="p">.</span><span class="nx">top</span><span class="p">)</span> <span class="o">or</span> <span class="nx">@tags</span><span class="p">.</span><span class="nx">statement</span> <span class="o">or</span> <span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">or</span> <span class="p">(</span><span class="nx">@elseBody</span> <span class="o">and</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)))</span>
<span class="nx">compileCondition</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">compileCondition</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
@ -1165,7 +1168,7 @@ because ternaries are already proper expressions, and don't need conversion.</p>
<span class="k">new</span> <span class="nx">ReturnNode</span> <span class="k">this</span> <span class="k">new</span> <span class="nx">ReturnNode</span> <span class="k">this</span>
<span class="nx">ensureExpressions</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">ensureExpressions</span><span class="o">:</span> <span class="p">(</span><span class="nx">node</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Expressions</span> <span class="k">then</span> <span class="nx">node</span> <span class="k">else</span> <span class="k">new</span> <span class="nx">Expressions</span> <span class="p">[</span><span class="nx">node</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-131"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-131">#</a> </div> <p>The <strong>IfNode</strong> only compiles into a statement if either of its bodies needs <span class="k">if</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Expressions</span> <span class="k">then</span> <span class="nx">node</span> <span class="k">else</span> <span class="k">new</span> <span class="nx">Expressions</span> <span class="p">[</span><span class="nx">node</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-130"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-130">#</a> </div> <p>The <strong>IfNode</strong> only compiles into a statement if either of its bodies needs
to be a statement. Otherwise a ternary is safe.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileStatement</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> to be a statement. Otherwise a ternary is safe.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileStatement</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">top = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;top&#39;</span> <span class="nv">top = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;top&#39;</span>
<span class="nv">child = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;chainChild&#39;</span> <span class="nv">child = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">&#39;chainChild&#39;</span>
@ -1181,23 +1184,23 @@ to be a statement. Otherwise a ternary is safe.</p> </td>
<span class="s1">&#39; else &#39;</span> <span class="o">+</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">(),</span> <span class="nx">chainChild</span><span class="o">:</span> <span class="kc">true</span><span class="p">}))</span> <span class="s1">&#39; else &#39;</span> <span class="o">+</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nx">indent</span><span class="o">:</span> <span class="nx">@idt</span><span class="p">(),</span> <span class="nx">chainChild</span><span class="o">:</span> <span class="kc">true</span><span class="p">}))</span>
<span class="k">else</span> <span class="k">else</span>
<span class="s2">&quot; else {\n#{ @elseBody.compile(o) }\n#{@tab}}&quot;</span> <span class="s2">&quot; else {\n#{ @elseBody.compile(o) }\n#{@tab}}&quot;</span>
<span class="s2">&quot;#{ifPart}#{elsePart}&quot;</span></pre></div> </td> </tr> <tr id="section-132"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-132">#</a> </div> <p>Compile the <strong>IfNode</strong> as a regular <em>if-else</em> statement. Flattened chains <span class="s2">&quot;#{ifPart}#{elsePart}&quot;</span></pre></div> </td> </tr> <tr id="section-131"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-131">#</a> </div> <p>Compile the <strong>IfNode</strong> as a regular <em>if-else</em> statement. Flattened chains
force inner <em>else</em> bodies into statement form.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileTernary</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span> force inner <em>else</em> bodies into statement form.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compileTernary</span><span class="o">:</span> <span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@bodyNode</span><span class="p">().</span><span class="nv">tags.operation = </span><span class="vi">@condition.tags.operation = </span><span class="kc">yes</span> <span class="nx">@bodyNode</span><span class="p">().</span><span class="nv">tags.operation = </span><span class="vi">@condition.tags.operation = </span><span class="kc">yes</span>
<span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nv">tags.operation = </span><span class="kc">yes</span> <span class="k">if</span> <span class="nx">@elseBody</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nv">tags.operation = </span><span class="kc">yes</span> <span class="k">if</span> <span class="nx">@elseBody</span>
<span class="nv">ifPart = </span><span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; ? &#39;</span> <span class="o">+</span> <span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nv">ifPart = </span><span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; ? &#39;</span> <span class="o">+</span> <span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
<span class="nv">elsePart = </span><span class="k">if</span> <span class="nx">@elseBody</span> <span class="k">then</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;null&#39;</span> <span class="nv">elsePart = </span><span class="k">if</span> <span class="nx">@elseBody</span> <span class="k">then</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;null&#39;</span>
<span class="nv">code = </span><span class="s2">&quot;#{ifPart} : #{elsePart}&quot;</span> <span class="nv">code = </span><span class="s2">&quot;#{ifPart} : #{elsePart}&quot;</span>
<span class="k">if</span> <span class="nx">@tags</span><span class="p">.</span><span class="nx">operation</span> <span class="k">then</span> <span class="s2">&quot;(#{code})&quot;</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-133"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-133">#</a> </div> <p>Compile the IfNode as a ternary operator.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-134"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-134">#</a> </div> <h2>Faux-Nodes</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-135"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-135">#</a> </div> <h3>PushNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">PushNode = exports.PushNode =</span> <span class="k">if</span> <span class="nx">@tags</span><span class="p">.</span><span class="nx">operation</span> <span class="k">then</span> <span class="s2">&quot;(#{code})&quot;</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-132"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-132">#</a> </div> <p>Compile the IfNode as a ternary operator.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-133"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-133">#</a> </div> <h2>Faux-Nodes</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-134"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-134">#</a> </div> <h3>PushNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">PushNode = exports.PushNode =</span>
<span class="nx">wrap</span><span class="o">:</span> <span class="p">(</span><span class="nx">array</span><span class="p">,</span> <span class="nx">expressions</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">wrap</span><span class="o">:</span> <span class="p">(</span><span class="nx">array</span><span class="p">,</span> <span class="nx">expressions</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">expr = </span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">()</span> <span class="nv">expr = </span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">()</span>
<span class="k">return</span> <span class="nx">expressions</span> <span class="k">if</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">isPureStatement</span><span class="p">()</span> <span class="o">or</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">containsPureStatement</span><span class="p">()</span> <span class="k">return</span> <span class="nx">expressions</span> <span class="k">if</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">isPureStatement</span><span class="p">()</span> <span class="o">or</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">containsPureStatement</span><span class="p">()</span>
<span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="k">new</span> <span class="nx">CallNode</span><span class="p">(</span> <span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="k">new</span> <span class="nx">CallNode</span><span class="p">(</span>
<span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">array</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">AccessorNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="s1">&#39;push&#39;</span><span class="p">))]),</span> <span class="p">[</span><span class="nx">expr</span><span class="p">]</span> <span class="k">new</span> <span class="nx">ValueNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="nx">array</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">AccessorNode</span><span class="p">(</span><span class="nx">literal</span><span class="p">(</span><span class="s1">&#39;push&#39;</span><span class="p">))]),</span> <span class="p">[</span><span class="nx">expr</span><span class="p">]</span>
<span class="p">)])</span></pre></div> </td> </tr> <tr id="section-136"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-136">#</a> </div> <p>Faux-nodes are never created by the grammar, but are used during code <span class="p">)])</span></pre></div> </td> </tr> <tr id="section-135"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-135">#</a> </div> <p>Faux-nodes are never created by the grammar, but are used during code
generation to generate other combinations of nodes. The <strong>PushNode</strong> creates generation to generate other combinations of nodes. The <strong>PushNode</strong> creates
the tree for <code>array.push(value)</code>, which is helpful for recording the result the tree for <code>array.push(value)</code>, which is helpful for recording the result
arrays from comprehensions.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-137"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-137">#</a> </div> <h3>ClosureNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">ClosureNode = exports.ClosureNode =</span></pre></div> </td> </tr> <tr id="section-138"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-138">#</a> </div> <p>A faux-node used to wrap an expressions body in a closure.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">wrap</span><span class="o">:</span> <span class="p">(</span><span class="nx">expressions</span><span class="p">,</span> <span class="nx">statement</span><span class="p">)</span> <span class="o">-&gt;</span> arrays from comprehensions.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-136"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-136">#</a> </div> <h3>ClosureNode</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">ClosureNode = exports.ClosureNode =</span></pre></div> </td> </tr> <tr id="section-137"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-137">#</a> </div> <p>A faux-node used to wrap an expressions body in a closure.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">wrap</span><span class="o">:</span> <span class="p">(</span><span class="nx">expressions</span><span class="p">,</span> <span class="nx">statement</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="nx">expressions</span> <span class="k">if</span> <span class="nx">expressions</span><span class="p">.</span><span class="nx">containsPureStatement</span><span class="p">()</span> <span class="k">return</span> <span class="nx">expressions</span> <span class="k">if</span> <span class="nx">expressions</span><span class="p">.</span><span class="nx">containsPureStatement</span><span class="p">()</span>
<span class="nv">func = </span><span class="k">new</span> <span class="nx">ParentheticalNode</span><span class="p">(</span><span class="k">new</span> <span class="nx">CodeNode</span><span class="p">([],</span> <span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="nx">expressions</span><span class="p">])))</span> <span class="nv">func = </span><span class="k">new</span> <span class="nx">ParentheticalNode</span><span class="p">(</span><span class="k">new</span> <span class="nx">CodeNode</span><span class="p">([],</span> <span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="nx">expressions</span><span class="p">])))</span>
<span class="nv">args = </span><span class="p">[]</span> <span class="nv">args = </span><span class="p">[]</span>
@ -1212,9 +1215,9 @@ arrays from comprehensions.</p> </td> <td class="code">
<span class="nx">args</span><span class="p">.</span><span class="nx">push</span> <span class="nx">literal</span> <span class="s1">&#39;arguments&#39;</span> <span class="k">if</span> <span class="nx">mentionsArgs</span> <span class="nx">args</span><span class="p">.</span><span class="nx">push</span> <span class="nx">literal</span> <span class="s1">&#39;arguments&#39;</span> <span class="k">if</span> <span class="nx">mentionsArgs</span>
<span class="nv">func = </span><span class="k">new</span> <span class="nx">ValueNode</span> <span class="nx">func</span><span class="p">,</span> <span class="p">[</span><span class="k">new</span> <span class="nx">AccessorNode</span><span class="p">(</span><span class="nx">meth</span><span class="p">)]</span> <span class="nv">func = </span><span class="k">new</span> <span class="nx">ValueNode</span> <span class="nx">func</span><span class="p">,</span> <span class="p">[</span><span class="k">new</span> <span class="nx">AccessorNode</span><span class="p">(</span><span class="nx">meth</span><span class="p">)]</span>
<span class="nv">call = </span><span class="k">new</span> <span class="nx">CallNode</span><span class="p">(</span><span class="nx">func</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="nv">call = </span><span class="k">new</span> <span class="nx">CallNode</span><span class="p">(</span><span class="nx">func</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span>
<span class="k">if</span> <span class="nx">statement</span> <span class="k">then</span> <span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="nx">call</span><span class="p">])</span> <span class="k">else</span> <span class="nx">call</span></pre></div> </td> </tr> <tr id="section-139"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-139">#</a> </div> <p>Wrap the expressions body, unless it contains a pure statement, <span class="k">if</span> <span class="nx">statement</span> <span class="k">then</span> <span class="nx">Expressions</span><span class="p">.</span><span class="nx">wrap</span><span class="p">([</span><span class="nx">call</span><span class="p">])</span> <span class="k">else</span> <span class="nx">call</span></pre></div> </td> </tr> <tr id="section-138"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-138">#</a> </div> <p>Wrap the expressions body, unless it contains a pure statement,
in which case, no dice. If the body mentions <code>this</code> or <code>arguments</code>, in which case, no dice. If the body mentions <code>this</code> or <code>arguments</code>,
then make sure that the closure wrapper preserves the original values.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">UTILITIES =</span></pre></div> </td> </tr> <tr id="section-140"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-140">#</a> </div> <h2>Utility Functions</h2> </td> <td class="code"> <div class="highlight"><pre> <span class="k">extends</span><span class="o">:</span> <span class="s2">&quot;&quot;&quot;</span> then make sure that the closure wrapper preserves the original values.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">UTILITIES =</span></pre></div> </td> </tr> <tr id="section-139"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-139">#</a> </div> <h2>Utility Functions</h2> </td> <td class="code"> <div class="highlight"><pre> <span class="k">extends</span><span class="o">:</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> function(child, parent) {</span> <span class="s2"> function(child, parent) {</span>
<span class="s2"> var ctor = function(){};</span> <span class="s2"> var ctor = function(){};</span>
<span class="s2"> ctor.prototype = parent.prototype;</span> <span class="s2"> ctor.prototype = parent.prototype;</span>
@ -1223,20 +1226,20 @@ then make sure that the closure wrapper preserves the original values.</p>
<span class="s2"> if (typeof parent.extended === &quot;</span><span class="nx">function</span><span class="s2">&quot;) parent.extended(child);</span> <span class="s2"> if (typeof parent.extended === &quot;</span><span class="nx">function</span><span class="s2">&quot;) parent.extended(child);</span>
<span class="s2"> child.__super__ = parent.prototype;</span> <span class="s2"> child.__super__ = parent.prototype;</span>
<span class="s2"> }</span> <span class="s2"> }</span>
<span class="s2"> &quot;&quot;&quot;</span></pre></div> </td> </tr> <tr id="section-141"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-141">#</a> </div> <p>Correctly set up a prototype chain for inheritance, including a reference <span class="s2"> &quot;&quot;&quot;</span></pre></div> </td> </tr> <tr id="section-140"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-140">#</a> </div> <p>Correctly set up a prototype chain for inheritance, including a reference
to the superclass for <code>super()</code> calls. See: to the superclass for <code>super()</code> calls. See:
<a href="http://closure-library.googlecode.com/svn/docs/closureGoogBase.js.source.html#line1206">goog.inherits</a>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">bind</span><span class="o">:</span> <span class="s2">&quot;&quot;&quot;</span> <a href="http://closure-library.googlecode.com/svn/docs/closureGoogBase.js.source.html#line1206">goog.inherits</a>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">bind</span><span class="o">:</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> function(func, context) {</span> <span class="s2"> function(func, context) {</span>
<span class="s2"> return function(){ return func.apply(context, arguments); };</span> <span class="s2"> return function(){ return func.apply(context, arguments); };</span>
<span class="s2"> }</span> <span class="s2"> }</span>
<span class="s2"> &quot;&quot;&quot;</span></pre></div> </td> </tr> <tr id="section-142"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-142">#</a> </div> <p>Create a function bound to the current value of "this".</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">hasProp</span><span class="o">:</span> <span class="s1">&#39;Object.prototype.hasOwnProperty&#39;</span> <span class="s2"> &quot;&quot;&quot;</span></pre></div> </td> </tr> <tr id="section-141"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-141">#</a> </div> <p>Create a function bound to the current value of "this".</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">hasProp</span><span class="o">:</span> <span class="s1">&#39;Object.prototype.hasOwnProperty&#39;</span>
<span class="nx">slice</span><span class="o">:</span> <span class="s1">&#39;Array.prototype.slice&#39;</span></pre></div> </td> </tr> <tr id="section-143"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-143">#</a> </div> <p>Shortcuts to speed up the lookup time for native functions.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-144"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-144">#</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">TAB = </span><span class="s1">&#39; &#39;</span></pre></div> </td> </tr> <tr id="section-145"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-145">#</a> </div> <p>Tabs are two spaces for pretty printing.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">TRAILING_WHITESPACE = </span><span class="sr">/[ \t]+$/gm</span></pre></div> </td> </tr> <tr id="section-146"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-146">#</a> </div> <p>Trim out all trailing whitespace, so that the generated code plays nice <span class="nx">slice</span><span class="o">:</span> <span class="s1">&#39;Array.prototype.slice&#39;</span></pre></div> </td> </tr> <tr id="section-142"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-142">#</a> </div> <p>Shortcuts to speed up the lookup time for native functions.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-143"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-143">#</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">TAB = </span><span class="s1">&#39; &#39;</span></pre></div> </td> </tr> <tr id="section-144"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-144">#</a> </div> <p>Tabs are two spaces for pretty printing.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">TRAILING_WHITESPACE = </span><span class="sr">/[ \t]+$/gm</span></pre></div> </td> </tr> <tr id="section-145"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-145">#</a> </div> <p>Trim out all trailing whitespace, so that the generated code plays nice
with Git.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IDENTIFIER = </span><span class="sr">/^[a-zA-Z\$_](\w|\$)*$/</span> with Git.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IDENTIFIER = </span><span class="sr">/^[a-zA-Z\$_](\w|\$)*$/</span>
<span class="nv">NUMBER = </span><span class="sr">/^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b$/i</span> <span class="nv">NUMBER = </span><span class="sr">/^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b$/i</span>
<span class="nv">SIMPLENUM = </span><span class="sr">/^-?\d+$/</span></pre></div> </td> </tr> <tr id="section-147"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-147">#</a> </div> <p>Keep these identifier regexes in sync with the Lexer.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IS_STRING = </span><span class="sr">/^[&#39;&quot;]/</span></pre></div> </td> </tr> <tr id="section-148"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-148">#</a> </div> <p>Is a literal value a string?</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-149"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-149">#</a> </div> <h2>Utility Functions</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">literal = </span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">SIMPLENUM = </span><span class="sr">/^-?\d+$/</span></pre></div> </td> </tr> <tr id="section-146"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-146">#</a> </div> <p>Keep these identifier regexes in sync with the Lexer.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IS_STRING = </span><span class="sr">/^[&#39;&quot;]/</span></pre></div> </td> </tr> <tr id="section-147"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-147">#</a> </div> <p>Is a literal value a string?</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-148"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-148">#</a> </div> <h2>Utility Functions</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">literal = </span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">new</span> <span class="nx">LiteralNode</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-150"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-150">#</a> </div> <p>Handy helper for a generating LiteralNode.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">utility = </span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="nx">LiteralNode</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-149"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-149">#</a> </div> <p>Handy helper for a generating LiteralNode.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">utility = </span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">ref = </span><span class="s2">&quot;__#{name}&quot;</span> <span class="nv">ref = </span><span class="s2">&quot;__#{name}&quot;</span>
<span class="nx">Scope</span><span class="p">.</span><span class="nx">root</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">ref</span><span class="p">,</span> <span class="nx">UTILITIES</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="nx">Scope</span><span class="p">.</span><span class="nx">root</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">ref</span><span class="p">,</span> <span class="nx">UTILITIES</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span>
<span class="nx">ref</span> <span class="nx">ref</span>
</pre></div> </td> </tr> <tr id="section-151"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-151">#</a> </div> <p>Helper for ensuring that utility functions are assigned at the top level.</p> </td> <td class="code"> <div class="highlight"><pre>undefined</pre></div> </td> </tr> </tbody> </table> </div> </body> </html> </pre></div> </td> </tr> <tr id="section-150"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-150">#</a> </div> <p>Helper for ensuring that utility functions are assigned at the top level.</p> </td> <td class="code"> <div class="highlight"><pre>undefined</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>

View file

@ -39,7 +39,7 @@ of the valid options, for <code>--help</code> and such.</p> </td>
<span class="nx">lines</span><span class="p">.</span><span class="nx">unshift</span> <span class="s2">&quot;#{@banner}\n&quot;</span> <span class="k">if</span> <span class="nx">@banner</span> <span class="nx">lines</span><span class="p">.</span><span class="nx">unshift</span> <span class="s2">&quot;#{@banner}\n&quot;</span> <span class="k">if</span> <span class="nx">@banner</span>
<span class="k">for</span> <span class="nx">rule</span> <span class="k">in</span> <span class="nx">@rules</span> <span class="k">for</span> <span class="nx">rule</span> <span class="k">in</span> <span class="nx">@rules</span>
<span class="nv">spaces = </span><span class="mi">15</span> <span class="o">-</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span><span class="p">.</span><span class="nx">length</span> <span class="nv">spaces = </span><span class="mi">15</span> <span class="o">-</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span><span class="p">.</span><span class="nx">length</span>
<span class="nv">spaces = </span><span class="k">if</span> <span class="nx">spaces</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">then</span> <span class="p">(</span><span class="s1">&#39; &#39;</span> <span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="nx">spaces</span><span class="p">]).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="nv">spaces = </span><span class="k">if</span> <span class="nx">spaces</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">then</span> <span class="nb">Array</span><span class="p">(</span><span class="nx">spaces</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nv">letPart = </span><span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="k">then</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="o">+</span> <span class="s1">&#39;, &#39;</span> <span class="k">else</span> <span class="s1">&#39; &#39;</span> <span class="nv">letPart = </span><span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="k">then</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="o">+</span> <span class="s1">&#39;, &#39;</span> <span class="k">else</span> <span class="s1">&#39; &#39;</span>
<span class="nx">lines</span><span class="p">.</span><span class="nx">push</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">letPart</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span> <span class="o">+</span> <span class="nx">spaces</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">description</span> <span class="nx">lines</span><span class="p">.</span><span class="nx">push</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">letPart</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span> <span class="o">+</span> <span class="nx">spaces</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">description</span>
<span class="s2">&quot;\n#{ lines.join(&#39;\n&#39;) }\n&quot;</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <h2>Helpers</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Regex matchers for option flags.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LONG_FLAG = </span><span class="sr">/^(--\w[\w\-]+)/</span> <span class="s2">&quot;\n#{ lines.join(&#39;\n&#39;) }\n&quot;</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <h2>Helpers</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Regex matchers for option flags.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LONG_FLAG = </span><span class="sr">/^(--\w[\w\-]+)/</span>

View file

@ -9,7 +9,7 @@ Using it looks like this:</p>
Attempt to evaluate the command. If there's an exception, print it out instead Attempt to evaluate the command. If there's an exception, print it out instead
of exiting.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">run = </span><span class="p">(</span><span class="nx">buffer</span><span class="p">)</span> <span class="o">-&gt;</span> of exiting.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">run = </span><span class="p">(</span><span class="nx">buffer</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">try</span> <span class="k">try</span>
<span class="nv">val = </span><span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">run</span> <span class="nx">buffer</span><span class="p">.</span><span class="nx">toString</span><span class="p">(),</span> <span class="nx">noWrap</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">globals</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">fileName</span><span class="o">:</span> <span class="s1">&#39;repl&#39;</span> <span class="nv">val = </span><span class="nx">CoffeeScript</span><span class="p">.</span><span class="nb">eval</span> <span class="nx">buffer</span><span class="p">.</span><span class="nx">toString</span><span class="p">(),</span> <span class="nx">noWrap</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">globals</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">fileName</span><span class="o">:</span> <span class="s1">&#39;repl&#39;</span>
<span class="nx">puts</span> <span class="nx">inspect</span> <span class="nx">val</span> <span class="k">if</span> <span class="nx">val</span> <span class="o">isnt</span> <span class="kc">undefined</span> <span class="nx">puts</span> <span class="nx">inspect</span> <span class="nx">val</span> <span class="k">if</span> <span class="nx">val</span> <span class="o">isnt</span> <span class="kc">undefined</span>
<span class="k">catch</span> <span class="nx">err</span> <span class="k">catch</span> <span class="nx">err</span>
<span class="nx">puts</span> <span class="nx">err</span><span class="p">.</span><span class="nx">stack</span> <span class="o">or</span> <span class="nx">err</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span> <span class="nx">puts</span> <span class="nx">err</span><span class="p">.</span><span class="nx">stack</span> <span class="o">or</span> <span class="nx">err</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span>

View file

@ -3,13 +3,9 @@ and shorthand syntax. This can greatly complicate a grammar and bloat
the resulting parse table. Instead of making the parser handle it all, we take the resulting parse table. Instead of making the parser handle it all, we take
a series of passes over the token stream, using this <strong>Rewriter</strong> to convert a series of passes over the token stream, using this <strong>Rewriter</strong> to convert
shorthand into the unambiguous long form, add implicit indentation and shorthand into the unambiguous long form, add implicit indentation and
parentheses, balance incorrect nestings, and generally clean things up.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Set up exported variables for both Node.js and the browser.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="nx">process</span><span class="o">?</span> parentheses, balance incorrect nestings, and generally clean things up.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Import the helpers we need.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">include</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./helpers&#39;</span><span class="p">).</span><span class="nx">helpers</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 <strong>Rewriter</strong> class is used by the <a href="lexer.html">Lexer</a>, directly against
<span class="p">{</span><span class="nx">helpers</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./helpers&#39;</span><span class="p">)</span> its internal array of tokens.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Rewriter = </span><span class="nx">class</span> <span class="nx">Rewriter</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>Helpful snippet for debugging:
<span class="k">else</span> puts (t[0] + '/' + t[1] for t in @tokens).join ' '</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Rewrite the token stream in multiple passes, one logical filter at
<span class="k">this</span><span class="p">.</span><span class="nv">exports = </span><span class="k">this</span>
<span class="nv">helpers = </span><span class="k">this</span><span class="p">.</span><span class="nx">helpers</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-3">#</a> </div> <p>Import the helpers we need.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">include</span><span class="p">}</span> <span class="o">=</span> <span class="nx">helpers</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>The <strong>Rewriter</strong> class is used by the <a href="lexer.html">Lexer</a>, directly against
its internal array of tokens.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Rewriter = </span><span class="nx">class</span> <span class="nx">Rewriter</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Helpful snippet for debugging:
puts (t[0] + '/' + t[1] for t in @tokens).join ' '</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Rewrite the token stream in multiple passes, one logical filter at
a time. This could certainly be changed into a single pass through the a time. This could certainly be changed into a single pass through the
stream, with a big ol' efficient switch, but it's much nicer to work with stream, with a big ol' efficient switch, but it's much nicer to work with
like this. The order of these passes matters -- indentation must be like this. The order of these passes matters -- indentation must be
@ -26,7 +22,7 @@ corrected before implicit parentheses can be wrapped around blocks of code.</p>
<span class="nx">@addImplicitParentheses</span><span class="p">()</span> <span class="nx">@addImplicitParentheses</span><span class="p">()</span>
<span class="nx">@ensureBalance</span> <span class="nx">BALANCED_PAIRS</span> <span class="nx">@ensureBalance</span> <span class="nx">BALANCED_PAIRS</span>
<span class="nx">@rewriteClosingParens</span><span class="p">()</span> <span class="nx">@rewriteClosingParens</span><span class="p">()</span>
<span class="nx">@tokens</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Rewrite the token stream, looking one token ahead and behind. <span class="nx">@tokens</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Rewrite the token stream, looking one token ahead and behind.
Allow the return value of the block to tell us how many tokens to move Allow the return value of the block to tell us how many tokens to move
forwards (or backwards) in the stream, to make sure we don't miss anything forwards (or backwards) in the stream, to make sure we don't miss anything
as tokens are inserted and removed, and the stream changes length under as tokens are inserted and removed, and the stream changes length under
@ -47,7 +43,7 @@ our feet.</p> </td> <td class="code"> <div
<span class="nx">levels</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">include</span> <span class="nx">EXPRESSION_START</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="nx">levels</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">include</span> <span class="nx">EXPRESSION_START</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nx">levels</span> <span class="o">-=</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">include</span> <span class="nx">EXPRESSION_END</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="nx">levels</span> <span class="o">-=</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">include</span> <span class="nx">EXPRESSION_END</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nx">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="nx">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Massage newlines and indentations so that comments don't have to be <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Massage newlines and indentations so that comments don't have to be
correctly indented, or appear on a line of their own.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">adjustComments</span><span class="o">:</span> <span class="o">-&gt;</span> correctly indented, or appear on a line of their own.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">adjustComments</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;HERECOMMENT&#39;</span> <span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;HERECOMMENT&#39;</span>
@ -66,14 +62,14 @@ correctly indented, or appear on a line of their own.</p> </td>
<span class="k">else</span> <span class="k">else</span>
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s2">&quot;\n&quot;</span><span class="p">,</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span> <span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s2">&quot;\n&quot;</span><span class="p">,</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
<span class="k">return</span> <span class="mi">2</span> <span class="k">return</span> <span class="mi">2</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Leading newlines would introduce an ambiguity in the grammar, so we <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Leading newlines would introduce an ambiguity in the grammar, so we
dispatch them here.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">removeLeadingNewlines</span><span class="o">:</span> <span class="o">-&gt;</span> dispatch them here.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">removeLeadingNewlines</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">shift</span><span class="p">()</span> <span class="k">while</span> <span class="nx">@tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">and</span> <span class="nx">@tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;TERMINATOR&#39;</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Some blocks occur in the middle of expressions -- when we're expecting <span class="nx">@tokens</span><span class="p">.</span><span class="nx">shift</span><span class="p">()</span> <span class="k">while</span> <span class="nx">@tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">and</span> <span class="nx">@tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;TERMINATOR&#39;</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Some blocks occur in the middle of expressions -- when we're expecting
this, remove their trailing newlines.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">removeMidExpressionNewlines</span><span class="o">:</span> <span class="o">-&gt;</span> this, remove their trailing newlines.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">removeMidExpressionNewlines</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">include</span><span class="p">(</span><span class="nx">EXPRESSION_CLOSE</span><span class="p">,</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> <span class="o">and</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;TERMINATOR&#39;</span> <span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">include</span><span class="p">(</span><span class="nx">EXPRESSION_CLOSE</span><span class="p">,</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> <span class="o">and</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;TERMINATOR&#39;</span>
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">1</span> <span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">1</span>
<span class="k">return</span> <span class="mi">0</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>The lexer has tagged the opening parenthesis of a method call. Match it with <span class="k">return</span> <span class="mi">0</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>The lexer has tagged the opening parenthesis of a method call. Match it with
its paired close. We have the mis-nested outdent case included here for its paired close. We have the mis-nested outdent case included here for
calls that close on the same line, just before their outdent.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">closeOpenCalls</span><span class="o">:</span> <span class="o">-&gt;</span> calls that close on the same line, just before their outdent.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">closeOpenCalls</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
@ -84,14 +80,14 @@ calls that close on the same line, just before their outdent.</p> </
<span class="nv">idx = </span><span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;OUTDENT&#39;</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span> <span class="nv">idx = </span><span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;OUTDENT&#39;</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span>
<span class="nx">@tokens</span><span class="p">[</span><span class="nx">idx</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;CALL_END&#39;</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">idx</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;CALL_END&#39;</span>
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>The lexer has tagged the opening parenthesis of an indexing operation call. <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>The lexer has tagged the opening parenthesis of an indexing operation call.
Match it with its paired close.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">closeOpenIndexes</span><span class="o">:</span> <span class="o">-&gt;</span> Match it with its paired close.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">closeOpenIndexes</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;INDEX_START&#39;</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;INDEX_START&#39;</span>
<span class="nv">condition = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">&#39;]&#39;</span><span class="p">,</span> <span class="s1">&#39;INDEX_END&#39;</span><span class="p">]</span> <span class="nv">condition = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">&#39;]&#39;</span><span class="p">,</span> <span class="s1">&#39;INDEX_END&#39;</span><span class="p">]</span>
<span class="nv">action = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;INDEX_END&#39;</span> <span class="nv">action = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;INDEX_END&#39;</span>
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-13">#</a> </div> <p>Object literals may be written with implicit braces, for simple cases. <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>Object literals may be written with implicit braces, for simple cases.
Insert the missing braces here, so that the parser doesn't have to.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addImplicitBraces</span><span class="o">:</span> <span class="o">-&gt;</span> Insert the missing braces here, so that the parser doesn't have to.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addImplicitBraces</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nv">stack = </span><span class="p">[]</span> <span class="nv">stack = </span><span class="p">[]</span>
<span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
@ -103,6 +99,7 @@ Insert the missing braces here, so that the parser doesn't have to.</p>
<span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;:&#39;</span> <span class="o">and</span> <span class="p">(</span><span class="o">not</span> <span class="nx">last</span> <span class="o">or</span> <span class="nx">last</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">&#39;{&#39;</span><span class="p">)</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;:&#39;</span> <span class="o">and</span> <span class="p">(</span><span class="o">not</span> <span class="nx">last</span> <span class="o">or</span> <span class="nx">last</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">&#39;{&#39;</span><span class="p">)</span>
<span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="s1">&#39;{&#39;</span> <span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="s1">&#39;{&#39;</span>
<span class="nv">idx = </span><span class="k">if</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;@&#39;</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span> <span class="k">else</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="nv">idx = </span><span class="k">if</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;@&#39;</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span> <span class="k">else</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span>
<span class="nx">idx</span> <span class="o">-=</span> <span class="mi">2</span> <span class="k">if</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">idx</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;HERECOMMENT&#39;</span>
<span class="nv">tok = </span><span class="p">[</span><span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span> <span class="nv">tok = </span><span class="p">[</span><span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
<span class="nv">tok.generated = </span><span class="kc">yes</span> <span class="nv">tok.generated = </span><span class="kc">yes</span>
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">idx</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">tok</span> <span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">idx</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">tok</span>
@ -115,7 +112,7 @@ Insert the missing braces here, so that the parser doesn't have to.</p>
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;}&#39;</span><span class="p">,</span> <span class="s1">&#39;}&#39;</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span> <span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;}&#39;</span><span class="p">,</span> <span class="s1">&#39;}&#39;</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
<span class="k">return</span> <span class="mi">2</span> <span class="k">return</span> <span class="mi">2</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-14">#</a> </div> <p>Methods may be optionally called without parentheses, for simple cases. <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-13">#</a> </div> <p>Methods may be optionally called without parentheses, for simple cases.
Insert the implicit parentheses here, so that the parser doesn't have to Insert the implicit parentheses here, so that the parser doesn't have to
deal with them.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addImplicitParentheses</span><span class="o">:</span> <span class="o">-&gt;</span> deal with them.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addImplicitParentheses</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nv">classLine = </span><span class="kc">no</span> <span class="nv">classLine = </span><span class="kc">no</span>
@ -135,8 +132,9 @@ deal with them.</p> </td> <td class="code">
<span class="nv">condition = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">condition = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="kc">yes</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">seenSingle</span> <span class="o">and</span> <span class="nx">token</span><span class="p">.</span><span class="nx">fromThen</span> <span class="k">return</span> <span class="kc">yes</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">seenSingle</span> <span class="o">and</span> <span class="nx">token</span><span class="p">.</span><span class="nx">fromThen</span>
<span class="nv">seenSingle = </span><span class="kc">yes</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">&#39;IF&#39;</span><span class="p">,</span> <span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s1">&#39;UNLESS&#39;</span><span class="p">,</span> <span class="s1">&#39;-&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;=&gt;&#39;</span><span class="p">]</span> <span class="nv">seenSingle = </span><span class="kc">yes</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">&#39;IF&#39;</span><span class="p">,</span> <span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s1">&#39;UNLESS&#39;</span><span class="p">,</span> <span class="s1">&#39;-&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;=&gt;&#39;</span><span class="p">]</span>
<span class="nv">post = </span><span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
<span class="p">(</span><span class="o">not</span> <span class="nx">token</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">&#39;,&#39;</span> <span class="o">and</span> <span class="nx">include</span><span class="p">(</span><span class="nx">IMPLICIT_END</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">and</span> <span class="p">(</span><span class="o">not</span> <span class="nx">token</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">&#39;,&#39;</span> <span class="o">and</span> <span class="nx">include</span><span class="p">(</span><span class="nx">IMPLICIT_END</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">and</span>
<span class="o">not</span> <span class="p">(</span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;INDENT&#39;</span> <span class="o">and</span> <span class="p">(</span><span class="nx">include</span><span class="p">(</span><span class="nx">IMPLICIT_BLOCK</span><span class="p">,</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">or</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;CLASS&#39;</span> <span class="o">or</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;{&#39;</span><span class="p">)))</span> <span class="o">or</span> <span class="o">not</span> <span class="p">(</span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;INDENT&#39;</span> <span class="o">and</span> <span class="p">(</span><span class="nx">include</span><span class="p">(</span><span class="nx">IMPLICIT_BLOCK</span><span class="p">,</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">or</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;CLASS&#39;</span> <span class="o">or</span> <span class="p">(</span><span class="nx">post</span> <span class="o">and</span> <span class="nx">post</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="nx">post</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;{&#39;</span><span class="p">))))</span> <span class="o">or</span>
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;PROPERTY_ACCESS&#39;</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;OUTDENT&#39;</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;PROPERTY_ACCESS&#39;</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">&#39;OUTDENT&#39;</span>
<span class="nv">action = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">action = </span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">idx = </span><span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;OUTDENT&#39;</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span> <span class="nv">idx = </span><span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;OUTDENT&#39;</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span>
@ -144,7 +142,7 @@ deal with them.</p> </td> <td class="code">
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">idx</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">idx</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
<span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;FUNC_EXIST&#39;</span> <span class="k">if</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;?&#39;</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;FUNC_EXIST&#39;</span> <span class="k">if</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;?&#39;</span>
<span class="k">return</span> <span class="mi">2</span> <span class="k">return</span> <span class="mi">2</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-15">#</a> </div> <p>Because our grammar is LALR(1), it can't handle some single-line <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-14">#</a> </div> <p>Because our grammar is LALR(1), it can't handle some single-line
expressions that lack ending delimiters. The <strong>Rewriter</strong> adds the implicit expressions that lack ending delimiters. The <strong>Rewriter</strong> adds the implicit
blocks, so it doesn't need to. ')' can close a single-line block, blocks, so it doesn't need to. ')' can close a single-line block,
but we need to make sure it's balanced.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addImplicitIndentation</span><span class="o">:</span> <span class="o">-&gt;</span> but we need to make sure it's balanced.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addImplicitIndentation</span><span class="o">:</span> <span class="o">-&gt;</span>
@ -172,7 +170,7 @@ but we need to make sure it's balanced.</p> </td> <td cl
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;THEN&#39;</span> <span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;THEN&#39;</span>
<span class="k">return</span> <span class="mi">2</span> <span class="k">return</span> <span class="mi">2</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-16">#</a> </div> <p>Tag postfix conditionals as such, so that we can parse them with a <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-15">#</a> </div> <p>Tag postfix conditionals as such, so that we can parse them with a
different precedence.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">tagPostfixConditionals</span><span class="o">:</span> <span class="o">-&gt;</span> different precedence.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">tagPostfixConditionals</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">@scanTokens</span> <span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">&#39;IF&#39;</span><span class="p">,</span> <span class="s1">&#39;UNLESS&#39;</span><span class="p">]</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">&#39;IF&#39;</span><span class="p">,</span> <span class="s1">&#39;UNLESS&#39;</span><span class="p">]</span>
@ -183,7 +181,7 @@ different precedence.</p> </td> <td class="code">
<span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;POST_&#39;</span> <span class="o">+</span> <span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">&#39;INDENT&#39;</span> <span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;POST_&#39;</span> <span class="o">+</span> <span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">&#39;INDENT&#39;</span>
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
<span class="k">return</span> <span class="mi">1</span> <span class="k">return</span> <span class="mi">1</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-17">#</a> </div> <p>Ensure that all listed pairs of tokens are correctly balanced throughout <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-16">#</a> </div> <p>Ensure that all listed pairs of tokens are correctly balanced throughout
the course of the token stream.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ensureBalance</span><span class="o">:</span> <span class="p">(</span><span class="nx">pairs</span><span class="p">)</span> <span class="o">-&gt;</span> the course of the token stream.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">ensureBalance</span><span class="o">:</span> <span class="p">(</span><span class="nx">pairs</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">levels = </span><span class="p">{}</span> <span class="nv">levels = </span><span class="p">{}</span>
<span class="nv">openLine = </span><span class="p">{}</span> <span class="nv">openLine = </span><span class="p">{}</span>
@ -201,7 +199,7 @@ the course of the token stream.</p> </td> <td class="cod
<span class="k">if</span> <span class="nx">unclosed</span><span class="p">.</span><span class="nx">length</span> <span class="k">if</span> <span class="nx">unclosed</span><span class="p">.</span><span class="nx">length</span>
<span class="nv">open = </span><span class="nx">unclosed</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="nv">open = </span><span class="nx">unclosed</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="nv">line = </span><span class="nx">openLine</span><span class="p">[</span><span class="nx">open</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> <span class="nv">line = </span><span class="nx">openLine</span><span class="p">[</span><span class="nx">open</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">&quot;unclosed #{open} on line #{line}&quot;</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-18">#</a> </div> <p>We'd like to support syntax like this:</p> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">&quot;unclosed #{open} on line #{line}&quot;</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-17">#</a> </div> <p>We'd like to support syntax like this:</p>
<pre><code>el.click((event) -&gt; <pre><code>el.click((event) -&gt;
el.hide()) el.hide())
@ -248,20 +246,20 @@ rewriting.</li>
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">val</span> <span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">val</span>
<span class="k">return</span> <span class="mi">1</span> <span class="k">return</span> <span class="mi">1</span>
<span class="k">else</span> <span class="k">else</span>
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-19">#</a> </div> <p>Generate the indentation tokens, based on another token on the same line.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">indentation</span><span class="o">:</span> <span class="p">(</span><span class="nx">token</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-18">#</a> </div> <p>Generate the indentation tokens, based on another token on the same line.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">indentation</span><span class="o">:</span> <span class="p">(</span><span class="nx">token</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="p">[[</span><span class="s1">&#39;INDENT&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span> <span class="p">[</span><span class="s1">&#39;OUTDENT&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]]</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-20">#</a> </div> <p>Look up a tag by token index.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">tag</span><span class="o">:</span> <span class="p">(</span><span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[[</span><span class="s1">&#39;INDENT&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span> <span class="p">[</span><span class="s1">&#39;OUTDENT&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]]</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-19">#</a> </div> <p>Look up a tag by token index.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">tag</span><span class="o">:</span> <span class="p">(</span><span class="nx">i</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">and</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-21">#</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-22">#</a> </div> <p>List of the token pairs that must be balanced.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">BALANCED_PAIRS = </span><span class="p">[[</span><span class="s1">&#39;(&#39;</span><span class="p">,</span> <span class="s1">&#39;)&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;[&#39;</span><span class="p">,</span> <span class="s1">&#39;]&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="s1">&#39;}&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;INDENT&#39;</span><span class="p">,</span> <span class="s1">&#39;OUTDENT&#39;</span><span class="p">],</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">and</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-20">#</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-21">#</a> </div> <p>List of the token pairs that must be balanced.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">BALANCED_PAIRS = </span><span class="p">[[</span><span class="s1">&#39;(&#39;</span><span class="p">,</span> <span class="s1">&#39;)&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;[&#39;</span><span class="p">,</span> <span class="s1">&#39;]&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="s1">&#39;}&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;INDENT&#39;</span><span class="p">,</span> <span class="s1">&#39;OUTDENT&#39;</span><span class="p">],</span>
<span class="p">[</span><span class="s1">&#39;PARAM_START&#39;</span><span class="p">,</span> <span class="s1">&#39;PARAM_END&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;CALL_START&#39;</span><span class="p">,</span> <span class="s1">&#39;CALL_END&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;INDEX_START&#39;</span><span class="p">,</span> <span class="s1">&#39;INDEX_END&#39;</span><span class="p">]]</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-23">#</a> </div> <p>The inverse mappings of <code>BALANCED_PAIRS</code> we're trying to fix up, so we can <span class="p">[</span><span class="s1">&#39;PARAM_START&#39;</span><span class="p">,</span> <span class="s1">&#39;PARAM_END&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;CALL_START&#39;</span><span class="p">,</span> <span class="s1">&#39;CALL_END&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;INDEX_START&#39;</span><span class="p">,</span> <span class="s1">&#39;INDEX_END&#39;</span><span class="p">]]</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-22">#</a> </div> <p>The inverse mappings of <code>BALANCED_PAIRS</code> we're trying to fix up, so we can
look things up from either end.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">INVERSES = </span><span class="p">{}</span> look things up from either end.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">INVERSES = </span><span class="p">{}</span>
<span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span> <span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span>
<span class="nx">INVERSES</span><span class="p">[</span><span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="nx">INVERSES</span><span class="p">[</span><span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="nx">INVERSES</span><span class="p">[</span><span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-24">#</a> </div> <p>The tokens that signal the start of a balanced pair.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_START = </span><span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-25">#</a> </div> <p>The tokens that signal the end of a balanced pair.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_END = </span><span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-26">#</a> </div> <p>Tokens that indicate the close of a clause of an expression.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_CLOSE = </span><span class="p">[</span><span class="s1">&#39;CATCH&#39;</span><span class="p">,</span> <span class="s1">&#39;WHEN&#39;</span><span class="p">,</span> <span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s1">&#39;FINALLY&#39;</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">EXPRESSION_END</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-27">#</a> </div> <p>Tokens that, if followed by an <code>IMPLICIT_CALL</code>, indicate a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_FUNC = </span><span class="p">[</span><span class="s1">&#39;IDENTIFIER&#39;</span><span class="p">,</span> <span class="s1">&#39;SUPER&#39;</span><span class="p">,</span> <span class="s1">&#39;)&#39;</span><span class="p">,</span> <span class="s1">&#39;CALL_END&#39;</span><span class="p">,</span> <span class="s1">&#39;]&#39;</span><span class="p">,</span> <span class="s1">&#39;INDEX_END&#39;</span><span class="p">,</span> <span class="s1">&#39;@&#39;</span><span class="p">,</span> <span class="s1">&#39;THIS&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-28">#</a> </div> <p>If preceded by an <code>IMPLICIT_FUNC</code>, indicates a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_CALL = </span><span class="p">[</span> <span class="nx">INVERSES</span><span class="p">[</span><span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-23">#</a> </div> <p>The tokens that signal the start of a balanced pair.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_START = </span><span class="nx">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-24">#</a> </div> <p>The tokens that signal the end of a balanced pair.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_END = </span><span class="nx">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="nx">pair</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-25">#</a> </div> <p>Tokens that indicate the close of a clause of an expression.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_CLOSE = </span><span class="p">[</span><span class="s1">&#39;CATCH&#39;</span><span class="p">,</span> <span class="s1">&#39;WHEN&#39;</span><span class="p">,</span> <span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s1">&#39;FINALLY&#39;</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">EXPRESSION_END</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-26">#</a> </div> <p>Tokens that, if followed by an <code>IMPLICIT_CALL</code>, indicate a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_FUNC = </span><span class="p">[</span><span class="s1">&#39;IDENTIFIER&#39;</span><span class="p">,</span> <span class="s1">&#39;SUPER&#39;</span><span class="p">,</span> <span class="s1">&#39;)&#39;</span><span class="p">,</span> <span class="s1">&#39;CALL_END&#39;</span><span class="p">,</span> <span class="s1">&#39;]&#39;</span><span class="p">,</span> <span class="s1">&#39;INDEX_END&#39;</span><span class="p">,</span> <span class="s1">&#39;@&#39;</span><span class="p">,</span> <span class="s1">&#39;THIS&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-27">#</a> </div> <p>If preceded by an <code>IMPLICIT_FUNC</code>, indicates a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_CALL = </span><span class="p">[</span>
<span class="s1">&#39;IDENTIFIER&#39;</span><span class="p">,</span> <span class="s1">&#39;NUMBER&#39;</span><span class="p">,</span> <span class="s1">&#39;STRING&#39;</span><span class="p">,</span> <span class="s1">&#39;JS&#39;</span><span class="p">,</span> <span class="s1">&#39;REGEX&#39;</span><span class="p">,</span> <span class="s1">&#39;NEW&#39;</span><span class="p">,</span> <span class="s1">&#39;PARAM_START&#39;</span><span class="p">,</span> <span class="s1">&#39;CLASS&#39;</span><span class="p">,</span> <span class="s1">&#39;IDENTIFIER&#39;</span><span class="p">,</span> <span class="s1">&#39;NUMBER&#39;</span><span class="p">,</span> <span class="s1">&#39;STRING&#39;</span><span class="p">,</span> <span class="s1">&#39;JS&#39;</span><span class="p">,</span> <span class="s1">&#39;REGEX&#39;</span><span class="p">,</span> <span class="s1">&#39;NEW&#39;</span><span class="p">,</span> <span class="s1">&#39;PARAM_START&#39;</span><span class="p">,</span> <span class="s1">&#39;CLASS&#39;</span><span class="p">,</span>
<span class="s1">&#39;IF&#39;</span><span class="p">,</span> <span class="s1">&#39;UNLESS&#39;</span><span class="p">,</span> <span class="s1">&#39;TRY&#39;</span><span class="p">,</span> <span class="s1">&#39;SWITCH&#39;</span><span class="p">,</span> <span class="s1">&#39;THIS&#39;</span><span class="p">,</span> <span class="s1">&#39;NULL&#39;</span><span class="p">,</span> <span class="s1">&#39;UNARY&#39;</span> <span class="s1">&#39;IF&#39;</span><span class="p">,</span> <span class="s1">&#39;UNLESS&#39;</span><span class="p">,</span> <span class="s1">&#39;TRY&#39;</span><span class="p">,</span> <span class="s1">&#39;SWITCH&#39;</span><span class="p">,</span> <span class="s1">&#39;THIS&#39;</span><span class="p">,</span> <span class="s1">&#39;NULL&#39;</span><span class="p">,</span> <span class="s1">&#39;UNARY&#39;</span>
<span class="s1">&#39;TRUE&#39;</span><span class="p">,</span> <span class="s1">&#39;FALSE&#39;</span><span class="p">,</span> <span class="s1">&#39;YES&#39;</span><span class="p">,</span> <span class="s1">&#39;NO&#39;</span><span class="p">,</span> <span class="s1">&#39;ON&#39;</span><span class="p">,</span> <span class="s1">&#39;OFF&#39;</span><span class="p">,</span> <span class="s1">&#39;TRUE&#39;</span><span class="p">,</span> <span class="s1">&#39;FALSE&#39;</span><span class="p">,</span> <span class="s1">&#39;YES&#39;</span><span class="p">,</span> <span class="s1">&#39;NO&#39;</span><span class="p">,</span> <span class="s1">&#39;ON&#39;</span><span class="p">,</span> <span class="s1">&#39;OFF&#39;</span><span class="p">,</span>
<span class="s1">&#39;@&#39;</span><span class="p">,</span> <span class="s1">&#39;-&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;=&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;[&#39;</span><span class="p">,</span> <span class="s1">&#39;(&#39;</span><span class="p">,</span> <span class="s1">&#39;{&#39;</span> <span class="s1">&#39;@&#39;</span><span class="p">,</span> <span class="s1">&#39;-&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;=&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;[&#39;</span><span class="p">,</span> <span class="s1">&#39;(&#39;</span><span class="p">,</span> <span class="s1">&#39;{&#39;</span>
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-29">#</a> </div> <p>Tokens indicating that the implicit call must enclose a block of expressions.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_BLOCK = </span><span class="p">[</span><span class="s1">&#39;-&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;=&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="s1">&#39;[&#39;</span><span class="p">,</span> <span class="s1">&#39;,&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-30">#</a> </div> <p>Tokens that always mark the end of an implicit call for single-liners.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_END = </span><span class="p">[</span><span class="s1">&#39;POST_IF&#39;</span><span class="p">,</span> <span class="s1">&#39;POST_UNLESS&#39;</span><span class="p">,</span> <span class="s1">&#39;FOR&#39;</span><span class="p">,</span> <span class="s1">&#39;WHILE&#39;</span><span class="p">,</span> <span class="s1">&#39;UNTIL&#39;</span><span class="p">,</span> <span class="s1">&#39;LOOP&#39;</span><span class="p">,</span> <span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s1">&#39;INDENT&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-31">#</a> </div> <p>Single-line flavors of block expressions that have unclosed endings. <span class="p">]</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-28">#</a> </div> <p>Tokens indicating that the implicit call must enclose a block of expressions.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_BLOCK = </span><span class="p">[</span><span class="s1">&#39;-&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;=&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;{&#39;</span><span class="p">,</span> <span class="s1">&#39;[&#39;</span><span class="p">,</span> <span class="s1">&#39;,&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-29">#</a> </div> <p>Tokens that always mark the end of an implicit call for single-liners.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_END = </span><span class="p">[</span><span class="s1">&#39;POST_IF&#39;</span><span class="p">,</span> <span class="s1">&#39;POST_UNLESS&#39;</span><span class="p">,</span> <span class="s1">&#39;FOR&#39;</span><span class="p">,</span> <span class="s1">&#39;WHILE&#39;</span><span class="p">,</span> <span class="s1">&#39;UNTIL&#39;</span><span class="p">,</span> <span class="s1">&#39;LOOP&#39;</span><span class="p">,</span> <span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s1">&#39;INDENT&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-30">#</a> </div> <p>Single-line flavors of block expressions that have unclosed endings.
The grammar can't disambiguate them, so we insert the implicit indentation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">SINGLE_LINERS = </span><span class="p">[</span><span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;=&gt;&quot;</span><span class="p">,</span> <span class="s1">&#39;TRY&#39;</span><span class="p">,</span> <span class="s1">&#39;FINALLY&#39;</span><span class="p">,</span> <span class="s1">&#39;THEN&#39;</span><span class="p">]</span> The grammar can't disambiguate them, so we insert the implicit indentation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">SINGLE_LINERS = </span><span class="p">[</span><span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">,</span> <span class="s2">&quot;=&gt;&quot;</span><span class="p">,</span> <span class="s1">&#39;TRY&#39;</span><span class="p">,</span> <span class="s1">&#39;FINALLY&#39;</span><span class="p">,</span> <span class="s1">&#39;THEN&#39;</span><span class="p">]</span>
<span class="nv">SINGLE_CLOSERS = </span><span class="p">[</span><span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s1">&#39;CATCH&#39;</span><span class="p">,</span> <span class="s1">&#39;FINALLY&#39;</span><span class="p">,</span> <span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s1">&#39;OUTDENT&#39;</span><span class="p">,</span> <span class="s1">&#39;LEADING_WHEN&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-32"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-32">#</a> </div> <p>Tokens that end a line.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LINEBREAKS = </span><span class="p">[</span><span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s1">&#39;INDENT&#39;</span><span class="p">,</span> <span class="s1">&#39;OUTDENT&#39;</span><span class="p">]</span> <span class="nv">SINGLE_CLOSERS = </span><span class="p">[</span><span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s1">&#39;CATCH&#39;</span><span class="p">,</span> <span class="s1">&#39;FINALLY&#39;</span><span class="p">,</span> <span class="s1">&#39;ELSE&#39;</span><span class="p">,</span> <span class="s1">&#39;OUTDENT&#39;</span><span class="p">,</span> <span class="s1">&#39;LEADING_WHEN&#39;</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-31">#</a> </div> <p>Tokens that end a line.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LINEBREAKS = </span><span class="p">[</span><span class="s1">&#39;TERMINATOR&#39;</span><span class="p">,</span> <span class="s1">&#39;INDENT&#39;</span><span class="p">,</span> <span class="s1">&#39;OUTDENT&#39;</span><span class="p">]</span>
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html> </pre></div> </td> </tr> </tbody> </table> </div> </body> </html>

View file

@ -3,7 +3,7 @@ generate code, you create a tree of scopes in the same shape as the nested
function bodies. Each scope knows about the variables declared within it, function bodies. Each scope knows about the variables declared within it,
and has a reference to its parent enclosing scope. In this way, we know which and has a reference to its parent enclosing scope. In this way, we know which
variables are new and need to be declared with <code>var</code>, and which are shared variables are new and need to be declared with <code>var</code>, and which are shared
with the outside.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Set up exported variables for both <strong>Node.js</strong> and the browser.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">this</span><span class="p">.</span><span class="nv">exports = </span><span class="k">this</span> <span class="nx">unless</span> <span class="nx">process</span><span class="o">?</span> with the outside.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-2">#</a> </div> <p>Import the helpers we plan to use.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">extend</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./helpers&#39;</span><span class="p">).</span><span class="nx">helpers</span>
<span class="nv">exports.Scope = </span><span class="nx">class</span> <span class="nx">Scope</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 top-level <strong>Scope</strong> object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@root</span><span class="o">:</span> <span class="kc">null</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>Initialize a scope with its parent, for lookups up the chain, <span class="nv">exports.Scope = </span><span class="nx">class</span> <span class="nx">Scope</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 top-level <strong>Scope</strong> object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@root</span><span class="o">:</span> <span class="kc">null</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-4">#</a> </div> <p>Initialize a scope with its parent, for lookups up the chain,
as well as a reference to the <strong>Expressions</strong> node is belongs to, which is as well as a reference to the <strong>Expressions</strong> node is belongs to, which is
@ -12,39 +12,46 @@ it wraps.</p> </td> <td class="code"> <div
<span class="p">[</span><span class="nx">@parent</span><span class="p">,</span> <span class="nx">@expressions</span><span class="p">,</span> <span class="nx">@method</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">parent</span><span class="p">,</span> <span class="nx">expressions</span><span class="p">,</span> <span class="nx">method</span><span class="p">]</span> <span class="p">[</span><span class="nx">@parent</span><span class="p">,</span> <span class="nx">@expressions</span><span class="p">,</span> <span class="nx">@method</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">parent</span><span class="p">,</span> <span class="nx">expressions</span><span class="p">,</span> <span class="nx">method</span><span class="p">]</span>
<span class="vi">@variables = </span><span class="p">{}</span> <span class="vi">@variables = </span><span class="p">{}</span>
<span class="k">if</span> <span class="nx">@parent</span> <span class="k">if</span> <span class="nx">@parent</span>
<span class="vi">@tempVar = </span><span class="nx">@parent</span><span class="p">.</span><span class="nx">tempVar</span> <span class="vi">@garbage = </span><span class="nx">@parent</span><span class="p">.</span><span class="nx">garbage</span>
<span class="k">else</span> <span class="k">else</span>
<span class="nv">Scope.root = </span><span class="k">this</span> <span class="vi">@garbage = </span><span class="p">[]</span>
<span class="vi">@tempVar = </span><span class="s1">&#39;_a&#39;</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Look up a variable name in lexical scope, and declare it if it does not <span class="nv">Scope.root = </span><span class="k">this</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-5">#</a> </div> <p>Create a new garbage level</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">startLevel</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@garbage</span><span class="p">.</span><span class="nx">push</span> <span class="p">[]</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Return to the previous garbage level and erase referenced temporary
variables in current level from scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">endLevel</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="p">(</span><span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;reuse&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="nx">name</span> <span class="k">in</span> <span class="nx">@garbage</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span> <span class="k">when</span> <span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">is</span> <span class="s1">&#39;var&#39;</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Look up a variable name in lexical scope, and declare it if it does not
already exist.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">find</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span> already exist.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">find</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">return</span> <span class="kc">true</span> <span class="k">if</span> <span class="nx">@check</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">options</span> <span class="k">return</span> <span class="kc">true</span> <span class="k">if</span> <span class="nx">@check</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">options</span>
<span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;var&#39;</span> <span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;var&#39;</span>
<span class="kc">false</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-6">#</a> </div> <p>Test variables and return true the first time fn(v, k) returns true</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">any</span><span class="o">:</span> <span class="p">(</span><span class="nx">fn</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">false</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Test variables and return true the first time fn(v, k) returns true</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">any</span><span class="o">:</span> <span class="p">(</span><span class="nx">fn</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="k">for</span> <span class="nx">v</span><span class="p">,</span> <span class="nx">k</span> <span class="k">of</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">fn</span><span class="p">(</span><span class="nx">v</span><span class="p">,</span> <span class="nx">k</span><span class="p">)</span> <span class="k">for</span> <span class="nx">v</span><span class="p">,</span> <span class="nx">k</span> <span class="k">of</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">fn</span><span class="p">(</span><span class="nx">v</span><span class="p">,</span> <span class="nx">k</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">true</span> <span class="k">return</span> <span class="kc">true</span>
<span class="k">return</span> <span class="kc">false</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-7">#</a> </div> <p>Reserve a variable name as originating from a function parameter for this <span class="k">return</span> <span class="kc">false</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>Reserve a variable name as originating from a function parameter for this
scope. No <code>var</code> required for internal references.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">parameter</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">-&gt;</span> scope. No <code>var</code> required for internal references.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">parameter</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;param&#39;</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-8">#</a> </div> <p>Just check to see if a variable has already been declared, without reserving, <span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;param&#39;</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Just check to see if a variable has already been declared, without reserving,
walks up to the root scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">check</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span> walks up to the root scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">check</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nv">immediate = </span><span class="nb">Object</span><span class="o">::</span><span class="nx">hasOwnProperty</span><span class="p">.</span><span class="nx">call</span> <span class="nx">@variables</span><span class="p">,</span> <span class="nx">name</span> <span class="nv">immediate = </span><span class="nb">Object</span><span class="o">::</span><span class="nx">hasOwnProperty</span><span class="p">.</span><span class="nx">call</span> <span class="nx">@variables</span><span class="p">,</span> <span class="nx">name</span>
<span class="k">return</span> <span class="nx">immediate</span> <span class="k">if</span> <span class="nx">immediate</span> <span class="o">or</span> <span class="p">(</span><span class="nx">options</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">immediate</span><span class="p">)</span> <span class="k">return</span> <span class="nx">immediate</span> <span class="k">if</span> <span class="nx">immediate</span> <span class="o">or</span> <span class="p">(</span><span class="nx">options</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">immediate</span><span class="p">)</span>
<span class="o">!!</span><span class="p">(</span><span class="nx">@parent</span> <span class="o">and</span> <span class="nx">@parent</span><span class="p">.</span><span class="nx">check</span><span class="p">(</span><span class="nx">name</span><span class="p">))</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-9">#</a> </div> <p>If we need to store an intermediate result, find an available name for a <span class="o">!!</span><span class="p">(</span><span class="nx">@parent</span> <span class="o">and</span> <span class="nx">@parent</span><span class="p">.</span><span class="nx">check</span><span class="p">(</span><span class="nx">name</span><span class="p">))</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>Generate a temporary variable name at the given index.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">temporary</span><span class="o">:</span> <span class="p">(</span><span class="nx">type</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="o">-&gt;</span>
compiler-generated variable. <code>_a</code>, <code>_b</code>, and so on...</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">freeVariable</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="k">if</span> <span class="nx">type</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">1</span>
<span class="k">while</span> <span class="nx">@check</span> <span class="nx">@tempVar</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="nx">type</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">index</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">index</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span>
<span class="nv">ordinal = </span><span class="mi">1</span> <span class="o">+</span> <span class="nb">parseInt</span> <span class="nx">@tempVar</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="mi">36</span> <span class="k">else</span>
<span class="vi">@tempVar = </span><span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="nx">ordinal</span><span class="p">.</span><span class="nx">toString</span><span class="p">(</span><span class="mi">36</span><span class="p">).</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\d/g</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span><span class="p">)</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="p">(</span><span class="nx">index</span> <span class="o">+</span> <span class="nb">parseInt</span> <span class="nx">type</span><span class="p">,</span> <span class="mi">36</span><span class="p">).</span><span class="nx">toString</span><span class="p">(</span><span class="mi">36</span><span class="p">).</span><span class="nx">replace</span> <span class="sr">/\d/g</span><span class="p">,</span> <span class="s1">&#39;a&#39;</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>If we need to store an intermediate result, find an available name for a
<span class="nx">@variables</span><span class="p">[</span><span class="nx">@tempVar</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;var&#39;</span> compiler-generated variable. <code>_var</code>, <code>_var2</code>, and so on...</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">freeVariable</span><span class="o">:</span> <span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@tempVar</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-10">#</a> </div> <p>Ensure that an assignment is made at the top of this scope <span class="nv">index = </span><span class="mi">0</span>
<span class="nx">index</span><span class="o">++</span> <span class="k">while</span> <span class="nx">@check</span><span class="p">(</span><span class="nv">temp = </span><span class="nx">@temporary</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="o">and</span> <span class="nx">@variables</span><span class="p">[</span><span class="nx">temp</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">&#39;reuse&#39;</span>
<span class="nx">@variables</span><span class="p">[</span><span class="nx">temp</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;var&#39;</span>
<span class="nx">@garbage</span><span class="p">[</span><span class="nx">@garbage</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="nx">push</span> <span class="nx">temp</span> <span class="k">if</span> <span class="nx">@garbage</span><span class="p">.</span><span class="nx">length</span>
<span class="nx">temp</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-13">#</a> </div> <p>Ensure that an assignment is made at the top of this scope
(or at the top-level scope, if requested).</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">assign</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">-&gt;</span> (or at the top-level scope, if requested).</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">assign</span><span class="o">:</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">assigned</span><span class="o">:</span> <span class="kc">true</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-11">#</a> </div> <p>Does this scope reference any variables that need to be declared in the <span class="nx">@variables</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">assigned</span><span class="o">:</span> <span class="kc">true</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-14">#</a> </div> <p>Does this scope reference any variables that need to be declared in the
given function body?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">hasDeclarations</span><span class="o">:</span> <span class="p">(</span><span class="nx">body</span><span class="p">)</span> <span class="o">-&gt;</span> given function body?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">hasDeclarations</span><span class="o">:</span> <span class="p">(</span><span class="nx">body</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">body</span> <span class="o">is</span> <span class="nx">@expressions</span> <span class="o">and</span> <span class="nx">@any</span> <span class="p">(</span><span class="nx">k</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">val</span> <span class="o">is</span> <span class="s1">&#39;var&#39;</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-12">#</a> </div> <p>Does this scope reference any assignments that need to be declared at the <span class="nx">body</span> <span class="o">is</span> <span class="nx">@expressions</span> <span class="o">and</span> <span class="nx">@any</span> <span class="p">(</span><span class="nx">k</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">val</span> <span class="o">is</span> <span class="s1">&#39;var&#39;</span> <span class="o">or</span> <span class="nx">val</span> <span class="o">is</span> <span class="s1">&#39;reuse&#39;</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-15">#</a> </div> <p>Does this scope reference any assignments that need to be declared at the
top of the given function body?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">hasAssignments</span><span class="o">:</span> <span class="p">(</span><span class="nx">body</span><span class="p">)</span> <span class="o">-&gt;</span> top of the given function body?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">hasAssignments</span><span class="o">:</span> <span class="p">(</span><span class="nx">body</span><span class="p">)</span> <span class="o">-&gt;</span>
<span class="nx">body</span> <span class="o">is</span> <span class="nx">@expressions</span> <span class="o">and</span> <span class="nx">@any</span> <span class="p">(</span><span class="nx">k</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">val</span><span class="p">.</span><span class="nx">assigned</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-13">#</a> </div> <p>Return the list of variables first declared in this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">declaredVariables</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">body</span> <span class="o">is</span> <span class="nx">@expressions</span> <span class="o">and</span> <span class="nx">@any</span> <span class="p">(</span><span class="nx">k</span><span class="p">,</span> <span class="nx">val</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nx">val</span><span class="p">.</span><span class="nx">assigned</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-16">#</a> </div> <p>Return the list of variables first declared in this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">declaredVariables</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="p">(</span><span class="nx">key</span> <span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">val</span> <span class="o">is</span> <span class="s1">&#39;var&#39;</span><span class="p">).</span><span class="nx">sort</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-14">#</a> </div> <p>Return the list of assignments that are supposed to be made at the top <span class="p">(</span><span class="nx">key</span> <span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">val</span> <span class="o">is</span> <span class="s1">&#39;var&#39;</span> <span class="o">or</span> <span class="nx">val</span> <span class="o">is</span> <span class="s1">&#39;reuse&#39;</span><span class="p">).</span><span class="nx">sort</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-17">#</a> </div> <p>Return the list of assignments that are supposed to be made at the top
of this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">assignedVariables</span><span class="o">:</span> <span class="o">-&gt;</span> of this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">assignedVariables</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="s2">&quot;#{key} = #{val.value}&quot;</span> <span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">val</span><span class="p">.</span><span class="nx">assigned</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-15">#</a> </div> <p>Compile the JavaScript for all of the variable declarations in this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compiledDeclarations</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="s2">&quot;#{key} = #{val.value}&quot;</span> <span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">val</span><span class="p">.</span><span class="nx">assigned</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-18">#</a> </div> <p>Compile the JavaScript for all of the variable declarations in this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compiledDeclarations</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@declaredVariables</span><span class="p">().</span><span class="nx">join</span> <span class="s1">&#39;, &#39;</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-16">#</a> </div> <p>Compile the JavaScript for all of the variable assignments in this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compiledAssignments</span><span class="o">:</span> <span class="o">-&gt;</span> <span class="nx">@declaredVariables</span><span class="p">().</span><span class="nx">join</span> <span class="s1">&#39;, &#39;</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="octowrap"> <a class="octothorpe" href="#section-19">#</a> </div> <p>Compile the JavaScript forall of the variable assignments in this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">compiledAssignments</span><span class="o">:</span> <span class="o">-&gt;</span>
<span class="nx">@assignedVariables</span><span class="p">().</span><span class="nx">join</span> <span class="s1">&#39;, &#39;</span> <span class="nx">@assignedVariables</span><span class="p">().</span><span class="nx">join</span> <span class="s1">&#39;, &#39;</span>
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html> </pre></div> </td> </tr> </tbody> </table> </div> </body> </html>

View file

@ -124,7 +124,7 @@
<p> <p>
<b>Latest Version:</b> <b>Latest Version:</b>
<a href="http://github.com/jashkenas/coffee-script/tarball/0.9.3">0.9.3</a> <a href="http://github.com/jashkenas/coffee-script/tarball/0.9.4">0.9.4</a>
</p> </p>
<h2> <h2>
@ -169,7 +169,7 @@
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.9.3">0.9.3</a>. release: <a href="http://github.com/jashkenas/coffee-script/tarball/0.9.4">0.9.4</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>
@ -925,6 +925,11 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
&mdash; a CoffeeScript compiler plug-in that allows you to include external &mdash; a CoffeeScript compiler plug-in that allows you to include external
source files. source files.
</li> </li>
<li>
<b>mauricemach</b>'s <a href="http://github.com/mauricemach/coffeekup">CoffeeKup</a>
&mdash; Markup as CoffeeScript. After _why's
<a href="http://markaby.github.com/">Markaby</a>.
</li>
<li> <li>
<b>jashkenas</b>'s <a href="http://jashkenas.github.com/docco/">Docco</a> <b>jashkenas</b>'s <a href="http://jashkenas.github.com/docco/">Docco</a>
&mdash; a quick-and-dirty literate-programming-style documentation generator &mdash; a quick-and-dirty literate-programming-style documentation generator
@ -952,6 +957,15 @@ coffee --print app/scripts/*.coffee > concatenation.js</pre>
Change Log Change Log
</h2> </h2>
<p>
<b class="header" style="margin-top: 20px;">0.9.4</b>
CoffeeScript now uses appropriately-named temporary variables, and recycles
their references after use. Added <tt>require.extensions</tt> support for
<b>Node.js 0.3</b>. Loading CoffeeScript in the browser now adds just a
single <tt>CoffeeScript</tt> object to global scope.
Fixes for implicit object and block comment edge cases.
</p>
<p> <p>
<b class="header" style="margin-top: 20px;">0.9.3</b> <b class="header" style="margin-top: 20px;">0.9.3</b>
CoffeeScript <tt>switch</tt> statements now compile into JS <tt>switch</tt> CoffeeScript <tt>switch</tt> statements now compile into JS <tt>switch</tt>

View file

@ -1,18 +1,18 @@
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, food, lunch, roid, roid2; var _i, _j, _len, _len2, _ref, _ref2, _result, food, lunch, roid, roid2;
lunch = (function() { lunch = (function() {
_a = []; _c = ['toast', 'cheese', 'wine']; _result = []; _ref = ['toast', 'cheese', 'wine'];
for (_b = 0, _d = _c.length; _b < _d; _b++) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
food = _c[_b]; food = _ref[_i];
_a.push(eat(food)); _result.push(eat(food));
} }
return _a; return _result;
})(); })();
_f = asteroids; _ref = asteroids;
for (_e = 0, _g = _f.length; _e < _g; _e++) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
roid = _f[_e]; roid = _ref[_i];
_i = asteroids; _ref2 = asteroids;
for (_h = 0, _j = _i.length; _h < _j; _h++) { for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
roid2 = _i[_h]; roid2 = _ref2[_j];
if (roid !== roid2) { if (roid !== roid2) {
if (roid.overlaps(roid2)) { if (roid.overlaps(roid2)) {
roid.explode(); roid.explode();

View file

@ -1,3 +1,4 @@
/*CoffeeScript Compiler v0.9.3 /*
CoffeeScript Compiler v0.9.4
Released under the MIT License Released under the MIT License
*/ */

View file

@ -7,8 +7,8 @@ var __extends = function(child, parent) {
if (typeof parent.extended === "function") parent.extended(child); if (typeof parent.extended === "function") parent.extended(child);
child.__super__ = parent.prototype; child.__super__ = parent.prototype;
}; };
Animal = function(_a) { Animal = function(_arg) {
this.name = _a; this.name = _arg;
return this; return this;
}; };
Animal.prototype.move = function(meters) { Animal.prototype.move = function(meters) {

View file

@ -1,11 +1,11 @@
var _a, _b, _c, globals, name; var _i, _ref, _result, globals, name;
var __hasProp = Object.prototype.hasOwnProperty; var __hasProp = Object.prototype.hasOwnProperty;
globals = (function() { globals = (function() {
_b = []; _c = window; _result = []; _ref = window;
for (name in _c) { for (name in _ref) {
if (!__hasProp.call(_c, name)) continue; if (!__hasProp.call(_ref, name)) continue;
_a = _c[name]; _i = _ref[name];
_b.push(name); _result.push(name);
} }
return _b; return _result;
})().slice(0, 10); })().slice(0, 10);

View file

@ -1,8 +1,8 @@
var _a, city, forecast, temp, weatherReport; var _ref, city, forecast, temp, weatherReport;
weatherReport = function(location) { weatherReport = function(location) {
return [location, 72, "Mostly Sunny"]; return [location, 72, "Mostly Sunny"];
}; };
_a = weatherReport("Berkeley, CA"); _ref = weatherReport("Berkeley, CA");
city = _a[0]; city = _ref[0];
temp = _a[1]; temp = _ref[1];
forecast = _a[2]; forecast = _ref[2];

View file

@ -1,4 +1,4 @@
var _a, _b, age, ages, child, yearsOld; var _ref, _result, age, ages, child, yearsOld;
var __hasProp = Object.prototype.hasOwnProperty; var __hasProp = Object.prototype.hasOwnProperty;
yearsOld = { yearsOld = {
max: 10, max: 10,
@ -6,11 +6,11 @@ yearsOld = {
tim: 11 tim: 11
}; };
ages = (function() { ages = (function() {
_a = []; _b = yearsOld; _result = []; _ref = yearsOld;
for (child in _b) { for (child in _ref) {
if (!__hasProp.call(_b, child)) continue; if (!__hasProp.call(_ref, child)) continue;
age = _b[child]; age = _ref[child];
_a.push(child + " is " + age); _result.push(child + " is " + age);
} }
return _a; return _result;
})(); })();

View file

@ -1,4 +1,4 @@
var _a, _b, _c, city, futurists, name, street; var _ref, _ref2, _ref3, city, futurists, name, street;
futurists = { futurists = {
sculptor: "Umberto Boccioni", sculptor: "Umberto Boccioni",
painter: "Vladimir Burliuk", painter: "Vladimir Burliuk",
@ -7,9 +7,9 @@ futurists = {
address: ["Via Roma 42R", "Bellagio, Italy 22021"] address: ["Via Roma 42R", "Bellagio, Italy 22021"]
} }
}; };
_a = futurists; _ref = futurists;
_b = _a.poet; _ref2 = _ref.poet;
name = _b.name; name = _ref2.name;
_c = _b.address; _ref3 = _ref2.address;
street = _c[0]; street = _ref3[0];
city = _c[1]; city = _ref3[1];

View file

@ -1,4 +1,4 @@
var _a, _b, _c, _d, cubes, list, math, num, number, opposite, race, square; var _i, _len, _ref, _result, cubes, list, math, num, number, opposite, race, square;
var __slice = Array.prototype.slice; var __slice = Array.prototype.slice;
number = 42; number = 42;
opposite = true; opposite = true;
@ -25,10 +25,10 @@ if (typeof elvis !== "undefined" && elvis !== null) {
alert("I knew it!"); alert("I knew it!");
} }
cubes = (function() { cubes = (function() {
_a = []; _c = list; _result = []; _ref = list;
for (_b = 0, _d = _c.length; _b < _d; _b++) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
num = _c[_b]; num = _ref[_i];
_a.push(math.cube(num)); _result.push(math.cube(num));
} }
return _a; return _result;
})(); })();

View file

@ -1,6 +1,6 @@
var _a, theBait, theSwitch; var _ref, theBait, theSwitch;
theBait = 1000; theBait = 1000;
theSwitch = 0; theSwitch = 0;
_a = [theSwitch, theBait]; _ref = [theSwitch, theBait];
theBait = _a[0]; theBait = _ref[0];
theSwitch = _a[1]; theSwitch = _ref[1];

View file

@ -1,7 +1,7 @@
var _a, close, contents, open, tag; var _ref, close, contents, open, tag;
var __slice = Array.prototype.slice; var __slice = Array.prototype.slice;
tag = "<impossible>"; tag = "<impossible>";
_a = tag.split(""); _ref = tag.split("");
open = _a[0]; open = _ref[0];
contents = __slice.call(_a, 1, _a.length - 1); contents = __slice.call(_ref, 1, _ref.length - 1);
close = _a[_a.length - 1]; close = _ref[_ref.length - 1];

View file

@ -1,19 +1,19 @@
var _a, countdown, deliverEggs, num; var _result, countdown, deliverEggs, num;
countdown = (function() { countdown = (function() {
_a = []; _result = [];
for (num = 10; num >= 1; num--) { for (num = 10; num >= 1; num--) {
_a.push(num); _result.push(num);
} }
return _a; return _result;
})(); })();
deliverEggs = function() { deliverEggs = function() {
var _b, _c, dozen, i; var _ref, _result2, dozen, i;
_b = []; _c = eggs.length; _result2 = []; _ref = eggs.length;
for (i = 0; (0 <= _c ? i < _c : i > _c); i += 12) { for (i = 0; (0 <= _ref ? i < _ref : i > _ref); i += 12) {
_b.push((function() { _result2.push((function() {
dozen = eggs.slice(i, i + 12); dozen = eggs.slice(i, i + 12);
return deliver(new eggCarton(dozen)); return deliver(new eggCarton(dozen));
})()); })());
} }
return _b; return _result2;
}; };

View file

@ -1,2 +1,2 @@
var _a, _b; var _ref, _ref2;
(typeof (_b = ((_a = lottery.drawWinner()))) === "undefined" || _b === null) ? undefined : _b.address == null ? undefined : _b.address.zipcode; (typeof (_ref2 = ((_ref = lottery.drawWinner()))) === "undefined" || _ref2 === null) ? undefined : _ref2.address == null ? undefined : _ref2.address.zipcode;

View file

@ -1,23 +1,23 @@
switch (day) { switch (day) {
case "Mon": case "Mon":
go(work); go(work);
break; break;
case "Tue": case "Tue":
go(relax); go(relax);
break; break;
case "Thu": case "Thu":
go(iceFishing); go(iceFishing);
break; break;
case "Fri": case "Fri":
case "Sat": case "Sat":
if (day === bingoDay) { if (day === bingoDay) {
go(bingo); go(bingo);
go(dancing); go(dancing);
} }
break; break;
case "Sun": case "Sun":
go(church); go(church);
break; break;
default: default:
go(work); go(work);
} }

View file

@ -1,4 +1,4 @@
var _a, lyrics, num; var _result, lyrics, num;
if (this.studyingEconomics) { if (this.studyingEconomics) {
while (supply > demand) { while (supply > demand) {
buy(); buy();
@ -9,10 +9,10 @@ if (this.studyingEconomics) {
} }
num = 6; num = 6;
lyrics = (function() { lyrics = (function() {
_a = []; _result = [];
while (num -= 1) { while (num -= 1) {
_a.push(num + " little monkeys, jumping on the bed.\ _result.push(num + " little monkeys, jumping on the bed.\
One fell out and bumped his head."); One fell out and bumped his head.");
} }
return _a; return _result;
})(); })();

View file

@ -1,5 +1,5 @@
/** /**
* CoffeeScript Compiler v0.9.3 * CoffeeScript Compiler v0.9.4
* http://coffeescript.org * http://coffeescript.org
* *
* Copyright 2010, Jeremy Ashkenas * Copyright 2010, Jeremy Ashkenas
@ -12,11 +12,11 @@ this.addImplicitBraces();this.addImplicitParentheses();this.ensureBalance(x);thi
m){var v,u,I,M,y;if(t[0]!=="HERECOMMENT")return 1;v=[this.tokens[m-2],this.tokens[m-1],this.tokens[m+1],this.tokens[m+2]];I=v[0];y=v[1];M=v[2];if((u=v[3])&&u[0]==="INDENT"){this.tokens.splice(m+2,1);I&&I[0]==="OUTDENT"&&M&&y[0]===M[0]&&M[0]==="TERMINATOR"?this.tokens.splice(m-2,1):this.tokens.splice(m,0,u)}else if(y&&!("TERMINATOR"===(v=y[0])||"INDENT"===v||"OUTDENT"===v)){if(M&&M[0]==="TERMINATOR"&&u&&u[0]==="OUTDENT"){this.tokens.splice.apply(this.tokens,[m+2,0].concat(this.tokens.splice(m,2))); m){var v,u,I,M,y;if(t[0]!=="HERECOMMENT")return 1;v=[this.tokens[m-2],this.tokens[m-1],this.tokens[m+1],this.tokens[m+2]];I=v[0];y=v[1];M=v[2];if((u=v[3])&&u[0]==="INDENT"){this.tokens.splice(m+2,1);I&&I[0]==="OUTDENT"&&M&&y[0]===M[0]&&M[0]==="TERMINATOR"?this.tokens.splice(m-2,1):this.tokens.splice(m,0,u)}else if(y&&!("TERMINATOR"===(v=y[0])||"INDENT"===v||"OUTDENT"===v)){if(M&&M[0]==="TERMINATOR"&&u&&u[0]==="OUTDENT"){this.tokens.splice.apply(this.tokens,[m+2,0].concat(this.tokens.splice(m,2)));
this.tokens[m+2][0]!=="TERMINATOR"&&this.tokens.splice(m+2,0,["TERMINATOR","\n",y[2]])}else this.tokens.splice(m,0,["TERMINATOR","\n",y[2]]);return 2}return 1})};C.prototype.removeLeadingNewlines=function(){var t;for(t=[];this.tokens[0]&&this.tokens[0][0]==="TERMINATOR";)t.push(this.tokens.shift());return t};C.prototype.removeMidExpressionNewlines=function(){return this.scanTokens(function(t,m){if(!(D(c,this.tag(m+1))&&t[0]==="TERMINATOR"))return 1;this.tokens.splice(m,1);return 0})};C.prototype.closeOpenCalls= this.tokens[m+2][0]!=="TERMINATOR"&&this.tokens.splice(m+2,0,["TERMINATOR","\n",y[2]])}else this.tokens.splice(m,0,["TERMINATOR","\n",y[2]]);return 2}return 1})};C.prototype.removeLeadingNewlines=function(){var t;for(t=[];this.tokens[0]&&this.tokens[0][0]==="TERMINATOR";)t.push(this.tokens.shift());return t};C.prototype.removeMidExpressionNewlines=function(){return this.scanTokens(function(t,m){if(!(D(c,this.tag(m+1))&&t[0]==="TERMINATOR"))return 1;this.tokens.splice(m,1);return 0})};C.prototype.closeOpenCalls=
function(){return this.scanTokens(function(t,m){if(t[0]==="CALL_START")this.detectEnd(m+1,function(v,u){var I;return")"===(I=v[0])||"CALL_END"===I||v[0]==="OUTDENT"&&this.tokens[u-1][0]===")"},function(v,u){return this.tokens[v[0]==="OUTDENT"?u-1:u][0]="CALL_END"});return 1})};C.prototype.closeOpenIndexes=function(){return this.scanTokens(function(t,m){if(t[0]==="INDEX_START")this.detectEnd(m+1,function(v){var u;return"]"===(u=v[0])||"INDEX_END"===u},function(v){return v[0]="INDEX_END"});return 1})}; function(){return this.scanTokens(function(t,m){if(t[0]==="CALL_START")this.detectEnd(m+1,function(v,u){var I;return")"===(I=v[0])||"CALL_END"===I||v[0]==="OUTDENT"&&this.tokens[u-1][0]===")"},function(v,u){return this.tokens[v[0]==="OUTDENT"?u-1:u][0]="CALL_END"});return 1})};C.prototype.closeOpenIndexes=function(){return this.scanTokens(function(t,m){if(t[0]==="INDEX_START")this.detectEnd(m+1,function(v){var u;return"]"===(u=v[0])||"INDEX_END"===u},function(v){return v[0]="INDEX_END"});return 1})};
C.prototype.addImplicitBraces=function(){var t;t=[];return this.scanTokens(function(m,v){var u,I;if(D(h,m[0]))t.push(m[0]==="INDENT"&&this.tag(v-1)==="{"?"{":m[0]);D(j,m[0])&&t.pop();u=t[t.length-1];if(m[0]===":"&&(!u||u[0]!=="{")){t.push("{");u=this.tag(v-2)==="@"?v-2:v-1;I=["{","{",m[2]];I.generated=true;this.tokens.splice(u,0,I);this.detectEnd(v+2,function(M,y){var Q,U,S,F;Q=this.tokens.slice(y+1,y+4);U=Q[0];F=Q[1];S=Q[2];if(this.tag(y+1)==="HERECOMMENT"||this.tag(y-1)==="HERECOMMENT")return false; C.prototype.addImplicitBraces=function(){var t;t=[];return this.scanTokens(function(m,v){var u,I;if(D(h,m[0]))t.push(m[0]==="INDENT"&&this.tag(v-1)==="{"?"{":m[0]);D(j,m[0])&&t.pop();u=t[t.length-1];if(m[0]===":"&&(!u||u[0]!=="{")){t.push("{");u=this.tag(v-2)==="@"?v-2:v-1;if(this.tag(u-2)==="HERECOMMENT")u-=2;I=["{","{",m[2]];I.generated=true;this.tokens.splice(u,0,I);this.detectEnd(v+2,function(M,y){var Q,U,S,F;Q=this.tokens.slice(y+1,y+4);U=Q[0];F=Q[1];S=Q[2];if(this.tag(y+1)==="HERECOMMENT"||
return("TERMINATOR"===(Q=M[0])||"OUTDENT"===Q)&&!(F&&F[0]===":"||U&&U[0]==="@"&&S&&S[0]===":")||M[0]===","&&U&&!("IDENTIFIER"===(Q=U[0])||"STRING"===Q||"@"===Q||"TERMINATOR"===Q||"OUTDENT"===Q)},function(M,y){return this.tokens.splice(y,0,["}","}",M[2]])});return 2}return 1})};C.prototype.addImplicitParentheses=function(){var t;t=false;return this.scanTokens(function(m,v){var u,I,M,y,Q;if(m[0]==="CLASS")t=true;y=this.tokens[v-1];I=this.tokens[v+1];M=1;if(I=!t&&m[0]==="INDENT"&&I&&I.generated&&I[0]=== this.tag(y-1)==="HERECOMMENT")return false;return("TERMINATOR"===(Q=M[0])||"OUTDENT"===Q)&&!(F&&F[0]===":"||U&&U[0]==="@"&&S&&S[0]===":")||M[0]===","&&U&&!("IDENTIFIER"===(Q=U[0])||"STRING"===Q||"@"===Q||"TERMINATOR"===Q||"OUTDENT"===Q)},function(M,y){return this.tokens.splice(y,0,["}","}",M[2]])});return 2}return 1})};C.prototype.addImplicitParentheses=function(){var t;t=false;return this.scanTokens(function(m,v){var u,I,M,y,Q;if(m[0]==="CLASS")t=true;y=this.tokens[v-1];I=this.tokens[v+1];M=1;if(I=
"{"&&y&&D(A,y[0]))M=2;Q=false;if(D(P,m[0]))t=false;if(y&&!y.spaced&&m[0]==="?")m.call=true;if(y&&y.spaced&&(D(A,y[0])||y.call)&&D(r,m[0])&&!(m[0]==="UNARY"&&("IN"===(u=this.tag(v+1))||"OF"===u||"INSTANCEOF"===u))||I){this.tokens.splice(v,0,["CALL_START","(",m[2]]);this.detectEnd(v+M,function(U,S){var F;if(!Q&&U.fromThen)return true;if("IF"===(F=U[0])||"ELSE"===F||"UNLESS"===F||"->"===F||"=>"===F)Q=true;F=this.tokens[S+1];return!U.generated&&this.tokens[S-1][0]!==","&&D(d,U[0])&&!(U[0]==="INDENT"&& !t&&m[0]==="INDENT"&&I&&I.generated&&I[0]==="{"&&y&&D(A,y[0]))M=2;Q=false;if(D(P,m[0]))t=false;if(y&&!y.spaced&&m[0]==="?")m.call=true;if(y&&y.spaced&&(D(A,y[0])||y.call)&&D(r,m[0])&&!(m[0]==="UNARY"&&("IN"===(u=this.tag(v+1))||"OF"===u||"INSTANCEOF"===u))||I){this.tokens.splice(v,0,["CALL_START","(",m[2]]);this.detectEnd(v+M,function(U,S){var F;if(!Q&&U.fromThen)return true;if("IF"===(F=U[0])||"ELSE"===F||"UNLESS"===F||"->"===F||"=>"===F)Q=true;F=this.tokens[S+1];return!U.generated&&this.tokens[S-
(D(e,this.tag(S-1))||this.tag(S-2)==="CLASS"||F&&F.generated&&F[0]==="{"))||U[0]==="PROPERTY_ACCESS"&&this.tag(S-1)==="OUTDENT"},function(U,S){M=U[0]==="OUTDENT"?S+1:S;return this.tokens.splice(M,0,["CALL_END",")",U[2]])});if(y[0]==="?")y[0]="FUNC_EXIST";return 2}return 1})};C.prototype.addImplicitIndentation=function(){return this.scanTokens(function(t,m){var v,u,I,M;if(t[0]==="ELSE"&&this.tag(m-1)!=="OUTDENT"){this.tokens.splice.apply(this.tokens,[m,0].concat(this.indentation(t)));return 2}if(t[0]=== 1][0]!==","&&D(d,U[0])&&!(U[0]==="INDENT"&&(D(e,this.tag(S-1))||this.tag(S-2)==="CLASS"||F&&F.generated&&F[0]==="{"))||U[0]==="PROPERTY_ACCESS"&&this.tag(S-1)==="OUTDENT"},function(U,S){M=U[0]==="OUTDENT"?S+1:S;return this.tokens.splice(M,0,["CALL_END",")",U[2]])});if(y[0]==="?")y[0]="FUNC_EXIST";return 2}return 1})};C.prototype.addImplicitIndentation=function(){return this.scanTokens(function(t,m){var v,u,I,M;if(t[0]==="ELSE"&&this.tag(m-1)!=="OUTDENT"){this.tokens.splice.apply(this.tokens,[m,0].concat(this.indentation(t)));
"CATCH"&&(this.tag(m+2)==="TERMINATOR"||this.tag(m+2)==="FINALLY")){this.tokens.splice.apply(this.tokens,[m+2,0].concat(this.indentation(t)));return 4}if(D($,t[0])&&this.tag(m+1)!=="INDENT"&&!(t[0]==="ELSE"&&this.tag(m+1)==="IF")){M=t[0];v=this.indentation(t);u=v[0];I=v[1];if(M==="THEN")u.fromThen=true;u.generated=I.generated=true;this.tokens.splice(m+1,0,u);this.detectEnd(m+2,function(y){return D(ca,y[0])&&y[1]!==";"&&!(y[0]==="ELSE"&&!("IF"===M||"THEN"===M))},function(y,Q){return this.tokens.splice(this.tokens[Q- return 2}if(t[0]==="CATCH"&&(this.tag(m+2)==="TERMINATOR"||this.tag(m+2)==="FINALLY")){this.tokens.splice.apply(this.tokens,[m+2,0].concat(this.indentation(t)));return 4}if(D($,t[0])&&this.tag(m+1)!=="INDENT"&&!(t[0]==="ELSE"&&this.tag(m+1)==="IF")){M=t[0];v=this.indentation(t);u=v[0];I=v[1];if(M==="THEN")u.fromThen=true;u.generated=I.generated=true;this.tokens.splice(m+1,0,u);this.detectEnd(m+2,function(y){return D(ca,y[0])&&y[1]!==";"&&!(y[0]==="ELSE"&&!("IF"===M||"THEN"===M))},function(y,Q){return this.tokens.splice(this.tokens[Q-
1][0]===","?Q-1:Q,0,I)});t[0]==="THEN"&&this.tokens.splice(m,1);return 2}return 1})};C.prototype.tagPostfixConditionals=function(){return this.scanTokens(function(t,m){var v;if("IF"===(v=t[0])||"UNLESS"===v){this.detectEnd(m+1,function(u){var I;return"TERMINATOR"===(I=u[0])||"INDENT"===I},function(u){if(u[0]!=="INDENT")return t[0]="POST_"+t[0]});return 1}return 1})};C.prototype.ensureBalance=function(t){var m,v,u,I,M;u={};I={};this.scanTokens(function(y){var Q,U,S,F;Q=0;for(U=t.length;Q<U;Q++){S= 1][0]===","?Q-1:Q,0,I)});t[0]==="THEN"&&this.tokens.splice(m,1);return 2}return 1})};C.prototype.tagPostfixConditionals=function(){return this.scanTokens(function(t,m){var v;if("IF"===(v=t[0])||"UNLESS"===v){this.detectEnd(m+1,function(u){var I;return"TERMINATOR"===(I=u[0])||"INDENT"===I},function(u){if(u[0]!=="INDENT")return t[0]="POST_"+t[0]});return 1}return 1})};C.prototype.ensureBalance=function(t){var m,v,u,I,M;u={};I={};this.scanTokens(function(y){var Q,U,S,F;Q=0;for(U=t.length;Q<U;Q++){S=
t[Q];F=S[0];S=S[1];u[F]||(u[F]=0);if(y[0]===F){if(u[F]===0)I[F]=y[2];u[F]+=1}if(y[0]===S)u[F]-=1;if(u[F]<0)throw new Error("too many "+y[1]+" on line "+(y[2]+1));}return 1});m=[];for(v in u)if(N.call(u,v)){M=u[v];M>0&&m.push(v)}if(m.length){v=m[0];m=I[v]+1;throw new Error("unclosed "+v+" on line "+m);}};C.prototype.rewriteClosingParens=function(){var t,m,v,u,I;u=[];m={};t=K;for(v in t)if(N.call(t,v)){I=t[v];m[v]=0}return this.scanTokens(function(M,y){var Q,U,S,F;F=M[0];Q=K[M[0]];if(D(h,F)){u.push(M); t[Q];F=S[0];S=S[1];u[F]||(u[F]=0);if(y[0]===F){if(u[F]===0)I[F]=y[2];u[F]+=1}if(y[0]===S)u[F]-=1;if(u[F]<0)throw new Error("too many "+y[1]+" on line "+(y[2]+1));}return 1});m=[];for(v in u)if(N.call(u,v)){M=u[v];M>0&&m.push(v)}if(m.length){v=m[0];m=I[v]+1;throw new Error("unclosed "+v+" on line "+m);}};C.prototype.rewriteClosingParens=function(){var t,m,v,u,I;u=[];m={};t=K;for(v in t)if(N.call(t,v)){I=t[v];m[v]=0}return this.scanTokens(function(M,y){var Q,U,S,F;F=M[0];Q=K[M[0]];if(D(h,F)){u.push(M);
return 1}else if(D(j,F))if(m[Q]>0){m[Q]-=1;this.tokens.splice(y,1);return 0}else{Q=u.pop();U=Q[0];S=K[U];if(F===S)return 1;m[U]+=1;I=[S,U==="INDENT"?Q[1]:S];if((this.tokens[y+2]==null?undefined:this.tokens[y+2][0])===U){this.tokens.splice(y+3,0,I);u.push(Q)}else this.tokens.splice(y,0,I);return 1}else return 1})};C.prototype.indentation=function(t){return[["INDENT",2,t[2]],["OUTDENT",2,t[2]]]};C.prototype.tag=function(t){return this.tokens[t]&&this.tokens[t][0]};return C}();x=[["(",")"],["[","]"], return 1}else if(D(j,F))if(m[Q]>0){m[Q]-=1;this.tokens.splice(y,1);return 0}else{Q=u.pop();U=Q[0];S=K[U];if(F===S)return 1;m[U]+=1;I=[S,U==="INDENT"?Q[1]:S];if((this.tokens[y+2]==null?undefined:this.tokens[y+2][0])===U){this.tokens.splice(y+3,0,I);u.push(Q)}else this.tokens.splice(y,0,I);return 1}else return 1})};C.prototype.indentation=function(t){return[["INDENT",2,t[2]],["OUTDENT",2,t[2]]]};C.prototype.tag=function(t){return this.tokens[t]&&this.tokens[t][0]};return C}();x=[["(",")"],["[","]"],
@ -26,142 +26,142 @@ la,na,ja,ha,oa,G,da,W,ga,Z=Array.prototype.slice;G=T("./rewriter");na=G.Rewriter
return(new na).rewrite(this.tokens)};N.prototype.extractNextToken=function(){if(this.identifierToken())return null;if(this.commentToken())return null;if(this.whitespaceToken())return null;if(this.lineToken())return null;if(this.heredocToken())return null;if(this.stringToken())return null;if(this.numberToken())return null;if(this.regexToken())return null;if(this.jsToken())return null;return this.literalToken()};N.prototype.identifierToken=function(){var l,s,o,B;if(!(o=this.match(ca,1)))return false; return(new na).rewrite(this.tokens)};N.prototype.extractNextToken=function(){if(this.identifierToken())return null;if(this.commentToken())return null;if(this.whitespaceToken())return null;if(this.lineToken())return null;if(this.heredocToken())return null;if(this.stringToken())return null;if(this.numberToken())return null;if(this.regexToken())return null;if(this.jsToken())return null;return this.literalToken()};N.prototype.identifierToken=function(){var l,s,o,B;if(!(o=this.match(ca,1)))return false;
this.i+=o.length;s=this.tagAccessor()||this.match(x,1);B="IDENTIFIER";if(W(aa,o)||!s&&W(e,o))B=o.toUpperCase();if(B==="WHEN"&&W(D,this.tag()))B="LEADING_WHEN";if(o==="all"&&this.tag()==="FOR")B="ALL";if(W(ha,B))B="UNARY";if(W(Y,o))if(s){B="STRING";o='"'+o+'"';if(s==="accessor"){l=true;this.tag()!=="@"&&this.tokens.pop();this.token("INDEX_START","[")}}else W(la,o)&&this.identifierError(o);if(!s){if(W(h,o))B=o=K[o];if(W(L,o))B="LOGIC";if(o==="!")B="UNARY"}this.token(B,o);l&&this.token("]","]");return true}; this.i+=o.length;s=this.tagAccessor()||this.match(x,1);B="IDENTIFIER";if(W(aa,o)||!s&&W(e,o))B=o.toUpperCase();if(B==="WHEN"&&W(D,this.tag()))B="LEADING_WHEN";if(o==="all"&&this.tag()==="FOR")B="ALL";if(W(ha,B))B="UNARY";if(W(Y,o))if(s){B="STRING";o='"'+o+'"';if(s==="accessor"){l=true;this.tag()!=="@"&&this.tokens.pop();this.token("INDEX_START","[")}}else W(la,o)&&this.identifierError(o);if(!s){if(W(h,o))B=o=K[o];if(W(L,o))B="LOGIC";if(o==="!")B="UNARY"}this.token(B,o);l&&this.token("]","]");return true};
N.prototype.numberToken=function(){var l;if(!(l=this.match(y,1)))return false;if(this.tag()==="."&&ga(l,"."))return false;this.i+=l.length;this.token("NUMBER",l);return true};N.prototype.stringToken=function(){var l;if(!(ga(this.chunk,'"')||ga(this.chunk,"'")))return false;if(!(l=this.balancedToken(['"','"'],["#{","}"])||this.balancedToken(["'","'"])))return false;this.interpolateString(l.replace(/\n/g,"\\\n"));this.line+=da(l,"\n");this.i+=l.length;return true};N.prototype.heredocToken=function(){var l, N.prototype.numberToken=function(){var l;if(!(l=this.match(y,1)))return false;if(this.tag()==="."&&ga(l,"."))return false;this.i+=l.length;this.token("NUMBER",l);return true};N.prototype.stringToken=function(){var l;if(!(ga(this.chunk,'"')||ga(this.chunk,"'")))return false;if(!(l=this.balancedToken(['"','"'],["#{","}"])||this.balancedToken(["'","'"])))return false;this.interpolateString(l.replace(/\n/g,"\\\n"));this.line+=da(l,"\n");this.i+=l.length;return true};N.prototype.heredocToken=function(){var l,
s,o;if(!(s=this.chunk.match(P)))return false;o=s[1].substr(0,1);l=this.sanitizeHeredoc(s[2]||s[4]||"",{quote:o});this.interpolateString(o+l+o,{heredoc:true});this.line+=da(s[1],"\n");this.i+=s[1].length;return true};N.prototype.commentToken=function(){var l;if(!(l=this.chunk.match(r)))return false;this.line+=da(l[1],"\n");this.i+=l[1].length;if(l[4]){this.token("HERECOMMENT",this.sanitizeHeredoc(l[4],{herecomment:true,indent:l[3]}));this.token("TERMINATOR","\n")}return true};N.prototype.jsToken=function(){var l; s,o;if(!(s=this.chunk.match(P)))return false;o=s[1].substr(0,1);l=this.sanitizeHeredoc(s[2]||s[4]||"",{quote:o});this.interpolateString(o+l+o,{heredoc:true});this.line+=da(s[1],"\n");this.i+=s[1].length;return true};N.prototype.commentToken=function(){var l;if(!(l=this.chunk.match(r)))return false;this.line+=da(l[1],"\n");this.i+=l[1].length;if(l[2]){this.token("HERECOMMENT",this.sanitizeHeredoc(l[2],{herecomment:true,indent:Array(this.indent+1).join(" ")}));this.token("TERMINATOR","\n")}return true};
if(!ga(this.chunk,"`"))return false;if(!(l=this.balancedToken(["`","`"])))return false;this.token("JS",l.replace($,""));this.i+=l.length;return true};N.prototype.regexToken=function(){var l,s,o;if(!(s=this.chunk.match(ia)))return false;if(s[1]===" "&&!("CALL_START"===(l=this.tag())||"="===l))return false;if(W(I,this.tag()))return false;if(!(l=this.balancedToken(["/","/"])))return false;if(!(s=this.chunk.substr(l.length).match(U)))return false;if(s[2])l+=o=s[2];if(l.match(F)){s=l.substring(1).split("/")[0]; N.prototype.jsToken=function(){var l;if(!ga(this.chunk,"`"))return false;if(!(l=this.balancedToken(["`","`"])))return false;this.token("JS",l.replace($,""));this.i+=l.length;return true};N.prototype.regexToken=function(){var l,s,o;if(!(s=this.chunk.match(ia)))return false;if(s[1]===" "&&!("CALL_START"===(l=this.tag())||"="===l))return false;if(W(I,this.tag()))return false;if(!(l=this.balancedToken(["/","/"])))return false;if(!(s=this.chunk.substr(l.length).match(U)))return false;if(s[2])l+=o=s[2];
s=s.replace(S,function(B){return"\\"+B});this.tokens=this.tokens.concat([["(","("],["NEW","new"],["IDENTIFIER","RegExp"],["CALL_START","("]]);this.interpolateString('"'+s+'"',{escapeQuotes:true});o&&this.tokens.splice(this.tokens.length,0,[",",","],["STRING",'"'+o+'"']);this.tokens.splice(this.tokens.length,0,[")",")"],[")",")"])}else this.token("REGEX",l);this.i+=l.length;return true};N.prototype.balancedToken=function(){return this.balancedString(this.chunk,Z.call(arguments,0))};N.prototype.lineToken= if(l.match(F)){s=l.substring(1).split("/")[0];s=s.replace(S,function(B){return"\\"+B});this.tokens=this.tokens.concat([["(","("],["NEW","new"],["IDENTIFIER","RegExp"],["CALL_START","("]]);this.interpolateString('"'+s+'"',{escapeQuotes:true});o&&this.tokens.splice(this.tokens.length,0,[",",","],["STRING",'"'+o+'"']);this.tokens.splice(this.tokens.length,0,[")",")"],[")",")"])}else this.token("REGEX",l);this.i+=l.length;return true};N.prototype.balancedToken=function(){return this.balancedString(this.chunk,
function(){var l,s,o;if(!(l=this.match(v,1)))return false;this.line+=da(l,"\n");this.i+=l.length;this.prev(2);o=l.match(X).reverse()[0].match(E)[1].length;s=this.match(u,1);s=s==="."||s===","||this.unfinished();if(o-this.indebt===this.indent){if(s)return this.suppressNewlines();return this.newlineToken(l)}else if(o>this.indent){if(s){this.indebt=o-this.indent;return this.suppressNewlines()}l=o-this.indent+this.outdebt;this.token("INDENT",l);this.indents.push(l);this.outdebt=this.indebt=0}else{this.indebt= Z.call(arguments,0))};N.prototype.lineToken=function(){var l,s,o;if(!(l=this.match(v,1)))return false;this.line+=da(l,"\n");this.i+=l.length;this.prev(2);o=l.match(X).reverse()[0].match(E)[1].length;s=this.match(u,1);s=s==="."||s===","||this.unfinished();if(o-this.indebt===this.indent){if(s)return this.suppressNewlines();return this.newlineToken(l)}else if(o>this.indent){if(s){this.indebt=o-this.indent;return this.suppressNewlines()}l=o-this.indent+this.outdebt;this.token("INDENT",l);this.indents.push(l);
0;this.outdentToken(this.indent-o,s)}this.indent=o;return true};N.prototype.outdentToken=function(l,s){for(var o,B;l>0;){B=this.indents.length-1;if(this.indents[B]===undefined)l=0;else if(this.indents[B]===this.outdebt){l-=this.outdebt;this.outdebt=0}else if(this.indents[B]<this.outdebt){this.outdebt-=this.indents[B];l-=this.indents[B]}else{o=this.indents.pop();o-=this.outdebt;l-=o;this.outdebt=0;this.token("OUTDENT",o)}}if(o)this.outdebt-=l;this.tag()==="TERMINATOR"||s||this.token("TERMINATOR","\n"); this.outdebt=this.indebt=0}else{this.indebt=0;this.outdentToken(this.indent-o,s)}this.indent=o;return true};N.prototype.outdentToken=function(l,s){for(var o,B;l>0;){B=this.indents.length-1;if(this.indents[B]===undefined)l=0;else if(this.indents[B]===this.outdebt){l-=this.outdebt;this.outdebt=0}else if(this.indents[B]<this.outdebt){this.outdebt-=this.indents[B];l-=this.indents[B]}else{o=this.indents.pop();o-=this.outdebt;l-=o;this.outdebt=0;this.token("OUTDENT",o)}}if(o)this.outdebt-=l;this.tag()===
return true};N.prototype.whitespaceToken=function(){var l,s;if(!(s=this.match(oa,1)))return false;if(l=this.prev())l.spaced=true;this.i+=s.length;return true};N.prototype.newlineToken=function(){this.tag()!=="TERMINATOR"&&this.token("TERMINATOR","\n");return true};N.prototype.suppressNewlines=function(){this.value()==="\\"&&this.tokens.pop();return true};N.prototype.literalToken=function(){var l,s,o,B,q;(q=(s=this.chunk.match(Q))&&s[1])&&q.match(j)&&this.tagParameters();q||(q=this.chunk.substr(0, "TERMINATOR"||s||this.token("TERMINATOR","\n");return true};N.prototype.whitespaceToken=function(){var l,s;if(!(s=this.match(oa,1)))return false;if(l=this.prev())l.spaced=true;this.i+=s.length;return true};N.prototype.newlineToken=function(){this.tag()!=="TERMINATOR"&&this.token("TERMINATOR","\n");return true};N.prototype.suppressNewlines=function(){this.value()==="\\"&&this.tokens.pop();return true};N.prototype.literalToken=function(){var l,s,o,B,q;(q=(s=this.chunk.match(Q))&&s[1])&&q.match(j)&&
1));this.i+=q.length;s=(o=this.prev())&&o.spaced;B=q;if(q==="="){W(Y,this.value())&&this.assignmentError();if("or"===(l=this.value())||"and"===l){this.tokens.splice(this.tokens.length-1,1,["COMPOUND_ASSIGN",K[this.value()]+"=",o[2]]);return true}}if(q===";")B="TERMINATOR";else if(W(L,q))B="LOGIC";else if(W(t,q))B="MATH";else if(W(d,q))B="COMPARE";else if(W(A,q))B="COMPOUND_ASSIGN";else if(W(ha,q))B="UNARY";else if(W(ja,q))B="SHIFT";else if(W(c,this.tag())&&!s)if(q==="("){if(o[0]==="?")o[0]="FUNC_EXIST"; this.tagParameters();q||(q=this.chunk.substr(0,1));this.i+=q.length;s=(o=this.prev())&&o.spaced;B=q;if(q==="="){W(Y,this.value())&&this.assignmentError();if("or"===(l=this.value())||"and"===l){this.tokens.splice(this.tokens.length-1,1,["COMPOUND_ASSIGN",K[this.value()]+"=",o[2]]);return true}}if(q===";")B="TERMINATOR";else if(W(L,q))B="LOGIC";else if(W(t,q))B="MATH";else if(W(d,q))B="COMPARE";else if(W(A,q))B="COMPOUND_ASSIGN";else if(W(ha,q))B="UNARY";else if(W(ja,q))B="SHIFT";else if(W(c,this.tag())&&
B="CALL_START"}else if(q==="["){B="INDEX_START";this.tag()==="?"&&this.tag(1,"INDEX_SOAK");this.tag()==="::"&&this.tag(1,"INDEX_PROTO")}this.token(B,q);return true};N.prototype.tagAccessor=function(){var l;if(!(l=this.prev())||l&&l.spaced)return false;return function(){if(l[1]==="::")return this.tag(1,"PROTOTYPE_ACCESS");else if(l[1]==="."&&this.value(2)!==".")if(this.tag(2)==="?"){this.tag(1,"SOAK_ACCESS");return this.tokens.splice(-2,1)}else return this.tag(1,"PROPERTY_ACCESS");else return l[0]=== !s)if(q==="("){if(o[0]==="?")o[0]="FUNC_EXIST";B="CALL_START"}else if(q==="["){B="INDEX_START";this.tag()==="?"&&this.tag(1,"INDEX_SOAK");this.tag()==="::"&&this.tag(1,"INDEX_PROTO")}this.token(B,q);return true};N.prototype.tagAccessor=function(){var l;if(!(l=this.prev())||l&&l.spaced)return false;return function(){if(l[1]==="::")return this.tag(1,"PROTOTYPE_ACCESS");else if(l[1]==="."&&this.value(2)!==".")if(this.tag(2)==="?"){this.tag(1,"SOAK_ACCESS");return this.tokens.splice(-2,1)}else return this.tag(1,
"@"}.call(this)?"accessor":false};N.prototype.sanitizeHeredoc=function(l,s){var o,B,q;q=s.indent;if(s.herecomment&&!W(l,"\n"))return l;if(!s.herecomment)for(;(B=C.exec(l))!==null;){B=typeof(o=B[2])!=="undefined"&&o!==null?B[2]:B[3];if(!(typeof q!=="undefined"&&q!==null)||B.length<q.length)q=B}q||(q="");l=l.replace(new RegExp("^"+q,"gm"),"");if(s.herecomment)return l;l=l.replace(/^\n/,"");return l.replace(m,"\\n").replace(new RegExp(s.quote,"g"),"\\"+s.quote)};N.prototype.tagParameters=function(){var l, "PROPERTY_ACCESS");else return l[0]==="@"}.call(this)?"accessor":false};N.prototype.sanitizeHeredoc=function(l,s){var o,B,q;q=s.indent;if(s.herecomment&&!W(l,"\n"))return l;if(!s.herecomment)for(;(B=C.exec(l))!==null;){B=typeof(o=B[2])!=="undefined"&&o!==null?B[2]:B[3];if(!(typeof q!=="undefined"&&q!==null)||B.length<q.length)q=B}q||(q="");l=l.replace(new RegExp("^"+q,"gm"),"");if(s.herecomment)return l;l=l.replace(/^\n/,"");return l.replace(m,"\\n").replace(new RegExp(s.quote,"g"),"\\"+s.quote)};
s;if(this.tag()!==")")return null;for(l=0;;){l+=1;s=this.prev(l);if(!s)return null;switch(s[0]){case "IDENTIFIER":s[0]="PARAM";break;case ")":s[0]="PARAM_END";break;case "(":case "CALL_START":return s[0]="PARAM_START"}}return true};N.prototype.closeIndentation=function(){return this.outdentToken(this.indent)};N.prototype.identifierError=function(l){throw new Error('SyntaxError: Reserved word "'+l+'" on line '+(this.line+1));};N.prototype.assignmentError=function(){throw new Error('SyntaxError: Reserved word "'+ N.prototype.tagParameters=function(){var l,s;if(this.tag()!==")")return null;for(l=0;;){l+=1;s=this.prev(l);if(!s)return null;switch(s[0]){case "IDENTIFIER":s[0]="PARAM";break;case ")":s[0]="PARAM_END";break;case "(":case "CALL_START":return s[0]="PARAM_START"}}return true};N.prototype.closeIndentation=function(){return this.outdentToken(this.indent)};N.prototype.identifierError=function(l){throw new Error('SyntaxError: Reserved word "'+l+'" on line '+(this.line+1));};N.prototype.assignmentError=
this.value()+'" on line '+(this.line+1)+" can't be assigned");};N.prototype.balancedString=function(l,s){var o,B,q,R,V,ea,O,a;a=s[0][0]==="/";V=[];for(R=0;R<l.length;){if(V.length&&ga(l,"\\",R))R+=1;else{o=0;for(B=s.length;o<B;o++){O=s[o];ea=O[0];q=O[1];if(V.length&&ga(l,q,R)&&V[V.length-1]===O){V.pop();R+=q.length-1;V.length||(R+=1);break}else if(ga(l,ea,R)){V.push(O);R+=ea.length-1;break}}}if(!V.length||a&&ga(l,"\n",R))break;R+=1}if(V.length){if(a)return false;throw new Error("SyntaxError: Unterminated "+ function(){throw new Error('SyntaxError: Reserved word "'+this.value()+'" on line '+(this.line+1)+" can't be assigned");};N.prototype.balancedString=function(l,s){var o,B,q,R,V,ea,O,a;a=s[0][0]==="/";V=[];for(R=0;R<l.length;){if(V.length&&ga(l,"\\",R))R+=1;else{o=0;for(B=s.length;o<B;o++){O=s[o];ea=O[0];q=O[1];if(V.length&&ga(l,q,R)&&V[V.length-1]===O){V.pop();R+=q.length-1;V.length||(R+=1);break}else if(ga(l,ea,R)){V.push(O);R+=ea.length-1;break}}}if(!V.length||a&&ga(l,"\n",R))break;R+=1}if(V.length){if(a)return false;
V.pop()[0]+" starting on line "+(this.line+1));}return!R?false:l.substring(0,R)};N.prototype.interpolateString=function(l,s){var o,B,q,R,V,ea,O,a,b,f;s||(s={});if(l.length<3||!ga(l,'"'))return this.token("STRING",l);else{O=new N;f=[];q=l.substring(0,1);B=[1,1];V=B[0];for(o=B[1];V<l.length-1;){if(ga(l,"\\",V))V+=1;else if(R=this.balancedString(l.substring(V),[["#{","}"]])){o<V&&f.push(["STRING",q+l.substring(o,V)+q]);o=R.substring(2,R.length-1);if(o.length){if(s.heredoc)o=o.replace(new RegExp("\\\\"+ throw new Error("SyntaxError: Unterminated "+V.pop()[0]+" starting on line "+(this.line+1));}return!R?false:l.substring(0,R)};N.prototype.interpolateString=function(l,s){var o,B,q,R,V,ea,O,a,b,f;s||(s={});if(l.length<3||!ga(l,'"'))return this.token("STRING",l);else{O=new N;f=[];q=l.substring(0,1);B=[1,1];V=B[0];for(o=B[1];V<l.length-1;){if(ga(l,"\\",V))V+=1;else if(R=this.balancedString(l.substring(V),[["#{","}"]])){o<V&&f.push(["STRING",q+l.substring(o,V)+q]);o=R.substring(2,R.length-1);if(o.length){if(s.heredoc)o=
q,"g"),q);B=a=O.tokenize("("+o+")",{line:this.line});ea=0;for(o=B.length;ea<o;ea++){b=B[ea];if(b[0]==="CALL_END")b[0]=")"}a.pop();f.push(["TOKENS",a])}else f.push(["STRING",q+q]);V+=R.length-1;o=V+1}V+=1}o<V&&o<l.length-1&&f.push(["STRING",q+l.substring(o,V)+q]);f[0][0]!=="STRING"&&f.unshift(["STRING",'""']);(R=f.length>1)&&this.token("(","(");B=f;V=0;for(o=B.length;V<o;V++){q=B[V];O=q[0];q=q[1];if(O==="TOKENS")this.tokens=this.tokens.concat(q);else if(O==="STRING"&&s.escapeQuotes){q=q.substring(1, o.replace(new RegExp("\\\\"+q,"g"),q);B=a=O.tokenize("("+o+")",{line:this.line});ea=0;for(o=B.length;ea<o;ea++){b=B[ea];if(b[0]==="CALL_END")b[0]=")"}a.pop();f.push(["TOKENS",a])}else f.push(["STRING",q+q]);V+=R.length-1;o=V+1}V+=1}o<V&&o<l.length-1&&f.push(["STRING",q+l.substring(o,V)+q]);f[0][0]!=="STRING"&&f.unshift(["STRING",'""']);(R=f.length>1)&&this.token("(","(");B=f;V=0;for(o=B.length;V<o;V++){q=B[V];O=q[0];q=q[1];if(O==="TOKENS")this.tokens=this.tokens.concat(q);else if(O==="STRING"&&s.escapeQuotes){q=
q.length-1).replace(/"/g,'\\"');this.token(O,'"'+q+'"')}else this.token(O,q);V<f.length-1&&this.token("+","+")}R&&this.token(")",")");return f}};N.prototype.token=function(l,s){return this.tokens.push([l,s,this.line])};N.prototype.tag=function(l,s){var o;if(!(o=this.prev(l)))return null;if(typeof s!=="undefined"&&s!==null)return o[0]=s;return o[0]};N.prototype.value=function(l,s){var o;if(!(o=this.prev(l)))return null;if(typeof s!=="undefined"&&s!==null)return o[1]=s;return o[1]};N.prototype.prev= q.substring(1,q.length-1).replace(/"/g,'\\"');this.token(O,'"'+q+'"')}else this.token(O,q);V<f.length-1&&this.token("+","+")}R&&this.token(")",")");return f}};N.prototype.token=function(l,s){return this.tokens.push([l,s,this.line])};N.prototype.tag=function(l,s){var o;if(!(o=this.prev(l)))return null;if(typeof s!=="undefined"&&s!==null)return o[0]=s;return o[0]};N.prototype.value=function(l,s){var o;if(!(o=this.prev(l)))return null;if(typeof s!=="undefined"&&s!==null)return o[1]=s;return o[1]};N.prototype.prev=
function(l){return this.tokens[this.tokens.length-(l||1)]};N.prototype.match=function(l,s){var o;if(!(o=this.chunk.match(l)))return false;return o?o[s]:false};N.prototype.unfinished=function(){var l;l=this.prev(2);return this.value()&&this.value().match&&this.value().match(M)&&l&&l[0]!=="."&&!this.value().match(j)&&!this.chunk.match(x)};return N}();aa=["if","else","true","false","new","return","try","catch","finally","throw","break","continue","for","in","while","delete","instanceof","typeof","switch", function(l){return this.tokens[this.tokens.length-(l||1)]};N.prototype.match=function(l,s){var o;if(!(o=this.chunk.match(l)))return false;return o?o[s]:false};N.prototype.unfinished=function(){var l;l=this.prev(2);return this.value()&&this.value().match&&this.value().match(M)&&l&&l[0]!=="."&&!this.value().match(j)&&!this.chunk.match(x)};return N}();aa=["if","else","true","false","new","return","try","catch","finally","throw","break","continue","for","in","while","delete","instanceof","typeof","switch",
"super","extends","class","this","null","debugger"];h=["and","or","is","isnt","not"];e=h.concat(["then","unless","until","loop","yes","no","on","off","of","by","where","when"]);la=["case","default","do","function","var","void","with","const","let","enum","export","import","native","__hasProp","__extends","__slice"];Y=aa.concat(la);ca=/^([a-zA-Z\$_](\w|\$)*)/;y=/^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b/i;P=/^("{6}|'{6}|"{3}([\s\S]*?)\n?([ \t]*)"{3}|'{3}([\s\S]*?)\n?([ \t]*)'{3})/; "super","extends","class","this","null","debugger"];h=["and","or","is","isnt","not"];e=h.concat(["then","unless","until","loop","yes","no","on","off","of","by","where","when"]);la=["case","default","do","function","var","void","with","const","let","enum","export","import","native","__hasProp","__extends","__slice"];Y=aa.concat(la);ca=/^([a-zA-Z\$_](\w|\$)*)/;y=/^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b/i;P=/^("{6}|'{6}|"{3}([\s\S]*?)\n?([ \t]*)"{3}|'{3}([\s\S]*?)\n?([ \t]*)'{3})/;
Q=/^(-[\-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)([ \t]*)/;oa=/^([ \t]+)/;r=/^(([ \t]*\n)*([ \t]*)###([^#][\s\S]*?)(###[ \t]*\n|(###)?$)|(\s*#(?!##[^#])[^\n]*)+)/;j=/^((-|=)>)/;v=/^((\n([ \t]*))+)(\.)?/;X=/\n([ \t]*)/g;E=/\n([ \t]*)/;ia=/^\/([^\/])/;F=/([^\\]#\{.*[^\\]\})/;U=/^(([imgy]{1,4})\b|\W|$)/;S=/\\[^\$]/g;$=/(^`|`$)/g;m=/\n/g;M=/^([+\*&|\/\-%=<>!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/;C=/(\n+([ \t]*)|^([ \t]+))/g;x=/^\s*(([a-zA-Z\$_@]\w*|["'][^\r\n]+?["']|\d+)[ \t]*?[:=][^:=])/; Q=/^(-[\-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)([ \t]*)/;oa=/^([ \t]+)/;r=/^(###([^#][\s\S]*?)(###[ \t]*\n|(###)?$)|(\s*#(?!##[^#])[^\n]*)+)/;j=/^((-|=)>)/;v=/^((\n([ \t]*))+)(\.)?/;X=/\n([ \t]*)/g;E=/\n([ \t]*)/;ia=/^\/([^\/])/;F=/([^\\]#\{.*[^\\]\})/;U=/^(([imgy]{1,4})\b|\W|$)/;S=/\\[^\$]/g;$=/(^`|`$)/g;m=/\n/g;M=/^([+\*&|\/\-%=<>!.\\][<>=&|]*|and|or|is|isnt|not|delete|typeof|instanceof)$/;C=/(\n+([ \t]*)|^([ \t]+))/g;x=/^\s*(([a-zA-Z\$_@]\w*|["'][^\r\n]+?["']|\d+)[ \t]*?[:=][^:=])/;u=/^\s*(\S)/;A=["-=",
u=/^\s*(\S)/;A=["-=","+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="];ha=["UMINUS","UPLUS","!","!!","~","TYPEOF","DELETE"];L=["&","|","^","&&","||"];ja=["<<",">>",">>>"];d=["<=","<",">",">="];t=["*","/","%"];I=["NUMBER","REGEX","++","--","FALSE","NULL","TRUE","]"];c=["IDENTIFIER","SUPER",")","]","}","STRING","@","THIS","?","::"];D=["INDENT","OUTDENT","TERMINATOR"];K={and:"&&",or:"||",is:"==",isnt:"!=",not:"!","===":"=="}}).call(this)});T["./parser"]=new (function(){var z=this, "+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="];ha=["UMINUS","UPLUS","!","!!","~","TYPEOF","DELETE"];L=["&","|","^","&&","||"];ja=["<<",">>",">>>"];d=["<=","<",">",">="];t=["*","/","%"];I=["NUMBER","REGEX","++","--","FALSE","NULL","TRUE","]"];c=["IDENTIFIER","SUPER",")","]","}","STRING","@","THIS","?","::"];D=["INDENT","OUTDENT","TERMINATOR"];K={and:"&&",or:"||",is:"==",isnt:"!=",not:"!","===":"=="}}).call(this)});T["./parser"]=new (function(){var z=this,x=function(){return{trace:function(){},
x=function(){return{trace:function(){},yy:{},symbols_:{error:2,Root:3,TERMINATOR:4,Body:5,Block:6,Line:7,Expression:8,Statement:9,Return:10,Throw:11,BREAK:12,CONTINUE:13,DEBUGGER:14,Value:15,Call:16,Code:17,Operation:18,Assign:19,If:20,Try:21,While:22,For:23,Switch:24,Extends:25,Class:26,Existence:27,Comment:28,INDENT:29,OUTDENT:30,Identifier:31,IDENTIFIER:32,AlphaNumeric:33,NUMBER:34,STRING:35,Literal:36,JS:37,REGEX:38,TRUE:39,FALSE:40,YES:41,NO:42,ON:43,OFF:44,Assignable:45,"=":46,AssignObj:47, yy:{},symbols_:{error:2,Root:3,TERMINATOR:4,Body:5,Block:6,Line:7,Expression:8,Statement:9,Return:10,Throw:11,BREAK:12,CONTINUE:13,DEBUGGER:14,Value:15,Call:16,Code:17,Operation:18,Assign:19,If:20,Try:21,While:22,For:23,Switch:24,Extends:25,Class:26,Existence:27,Comment:28,INDENT:29,OUTDENT:30,Identifier:31,IDENTIFIER:32,AlphaNumeric:33,NUMBER:34,STRING:35,Literal:36,JS:37,REGEX:38,TRUE:39,FALSE:40,YES:41,NO:42,ON:43,OFF:44,Assignable:45,"=":46,AssignObj:47,":":48,RETURN:49,HERECOMMENT:50,"?":51,
":":48,RETURN:49,HERECOMMENT:50,"?":51,PARAM_START:52,ParamList:53,PARAM_END:54,FuncGlyph:55,"->":56,"=>":57,OptComma:58,",":59,Param:60,PARAM:61,"@":62,".":63,Splat:64,SimpleAssignable:65,Accessor:66,Invocation:67,ThisProperty:68,Array:69,Object:70,Parenthetical:71,Range:72,This:73,NULL:74,PROPERTY_ACCESS:75,PROTOTYPE_ACCESS:76,"::":77,SOAK_ACCESS:78,Index:79,Slice:80,INDEX_START:81,INDEX_END:82,INDEX_SOAK:83,INDEX_PROTO:84,"{":85,AssignList:86,"}":87,CLASS:88,EXTENDS:89,ClassBody:90,ClassAssign:91, PARAM_START:52,ParamList:53,PARAM_END:54,FuncGlyph:55,"->":56,"=>":57,OptComma:58,",":59,Param:60,PARAM:61,"@":62,".":63,Splat:64,SimpleAssignable:65,Accessor:66,Invocation:67,ThisProperty:68,Array:69,Object:70,Parenthetical:71,Range:72,This:73,NULL:74,PROPERTY_ACCESS:75,PROTOTYPE_ACCESS:76,"::":77,SOAK_ACCESS:78,Index:79,Slice:80,INDEX_START:81,INDEX_END:82,INDEX_SOAK:83,INDEX_PROTO:84,"{":85,AssignList:86,"}":87,CLASS:88,EXTENDS:89,ClassBody:90,ClassAssign:91,NEW:92,OptFuncExist:93,Arguments:94,
NEW:92,OptFuncExist:93,Arguments:94,SUPER:95,FUNC_EXIST:96,CALL_START:97,CALL_END:98,ArgList:99,THIS:100,RangeDots:101,"[":102,"]":103,Arg:104,SimpleArgs:105,TRY:106,Catch:107,FINALLY:108,CATCH:109,THROW:110,"(":111,")":112,WhileSource:113,WHILE:114,WHEN:115,UNTIL:116,Loop:117,LOOP:118,ForBody:119,FOR:120,ForStart:121,ForSource:122,ForVariables:123,ALL:124,ForValue:125,IN:126,OF:127,BY:128,SWITCH:129,Whens:130,ELSE:131,When:132,LEADING_WHEN:133,IfBlock:134,IF:135,UNLESS:136,POST_IF:137,POST_UNLESS:138, SUPER:95,FUNC_EXIST:96,CALL_START:97,CALL_END:98,ArgList:99,THIS:100,RangeDots:101,"[":102,"]":103,Arg:104,SimpleArgs:105,TRY:106,Catch:107,FINALLY:108,CATCH:109,THROW:110,"(":111,")":112,WhileSource:113,WHILE:114,WHEN:115,UNTIL:116,Loop:117,LOOP:118,ForBody:119,FOR:120,ForStart:121,ForSource:122,ForVariables:123,ALL:124,ForValue:125,IN:126,OF:127,BY:128,SWITCH:129,Whens:130,ELSE:131,When:132,LEADING_WHEN:133,IfBlock:134,IF:135,UNLESS:136,POST_IF:137,POST_UNLESS:138,UNARY:139,"-":140,"+":141,"--":142,
UNARY:139,"-":140,"+":141,"--":142,"++":143,"==":144,"!=":145,MATH:146,SHIFT:147,COMPARE:148,LOGIC:149,COMPOUND_ASSIGN:150,INSTANCEOF:151,$accept:0,$end:1},terminals_:{"2":"error","4":"TERMINATOR","12":"BREAK","13":"CONTINUE","14":"DEBUGGER","29":"INDENT","30":"OUTDENT","32":"IDENTIFIER","34":"NUMBER","35":"STRING","37":"JS","38":"REGEX","39":"TRUE","40":"FALSE","41":"YES","42":"NO","43":"ON","44":"OFF","46":"=","48":":","49":"RETURN","50":"HERECOMMENT","51":"?","52":"PARAM_START","54":"PARAM_END", "++":143,"==":144,"!=":145,MATH:146,SHIFT:147,COMPARE:148,LOGIC:149,COMPOUND_ASSIGN:150,INSTANCEOF:151,$accept:0,$end:1},terminals_:{"2":"error","4":"TERMINATOR","12":"BREAK","13":"CONTINUE","14":"DEBUGGER","29":"INDENT","30":"OUTDENT","32":"IDENTIFIER","34":"NUMBER","35":"STRING","37":"JS","38":"REGEX","39":"TRUE","40":"FALSE","41":"YES","42":"NO","43":"ON","44":"OFF","46":"=","48":":","49":"RETURN","50":"HERECOMMENT","51":"?","52":"PARAM_START","54":"PARAM_END","56":"->","57":"=>","59":",","61":"PARAM",
"56":"->","57":"=>","59":",","61":"PARAM","62":"@","63":".","74":"NULL","75":"PROPERTY_ACCESS","76":"PROTOTYPE_ACCESS","77":"::","78":"SOAK_ACCESS","81":"INDEX_START","82":"INDEX_END","83":"INDEX_SOAK","84":"INDEX_PROTO","85":"{","87":"}","88":"CLASS","89":"EXTENDS","92":"NEW","95":"SUPER","96":"FUNC_EXIST","97":"CALL_START","98":"CALL_END","100":"THIS","102":"[","103":"]","106":"TRY","108":"FINALLY","109":"CATCH","110":"THROW","111":"(","112":")","114":"WHILE","115":"WHEN","116":"UNTIL","118":"LOOP", "62":"@","63":".","74":"NULL","75":"PROPERTY_ACCESS","76":"PROTOTYPE_ACCESS","77":"::","78":"SOAK_ACCESS","81":"INDEX_START","82":"INDEX_END","83":"INDEX_SOAK","84":"INDEX_PROTO","85":"{","87":"}","88":"CLASS","89":"EXTENDS","92":"NEW","95":"SUPER","96":"FUNC_EXIST","97":"CALL_START","98":"CALL_END","100":"THIS","102":"[","103":"]","106":"TRY","108":"FINALLY","109":"CATCH","110":"THROW","111":"(","112":")","114":"WHILE","115":"WHEN","116":"UNTIL","118":"LOOP","120":"FOR","124":"ALL","126":"IN","127":"OF",
"120":"FOR","124":"ALL","126":"IN","127":"OF","128":"BY","129":"SWITCH","131":"ELSE","133":"LEADING_WHEN","135":"IF","136":"UNLESS","137":"POST_IF","138":"POST_UNLESS","139":"UNARY","140":"-","141":"+","142":"--","143":"++","144":"==","145":"!=","146":"MATH","147":"SHIFT","148":"COMPARE","149":"LOGIC","150":"COMPOUND_ASSIGN","151":"INSTANCEOF"},productions_:[0,[3,0],[3,1],[3,1],[3,2],[5,1],[5,3],[5,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1], "128":"BY","129":"SWITCH","131":"ELSE","133":"LEADING_WHEN","135":"IF","136":"UNLESS","137":"POST_IF","138":"POST_UNLESS","139":"UNARY","140":"-","141":"+","142":"--","143":"++","144":"==","145":"!=","146":"MATH","147":"SHIFT","148":"COMPARE","149":"LOGIC","150":"COMPOUND_ASSIGN","151":"INSTANCEOF"},productions_:[0,[3,0],[3,1],[3,1],[3,2],[5,1],[5,3],[5,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[6,3],[6,2],[6,2],
[8,1],[8,1],[8,1],[8,1],[8,1],[6,3],[6,2],[6,2],[31,1],[33,1],[33,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[19,3],[19,5],[47,1],[47,1],[47,3],[47,3],[47,5],[47,5],[47,1],[10,2],[10,1],[28,1],[27,2],[17,5],[17,2],[55,1],[55,1],[58,0],[58,1],[53,0],[53,1],[53,3],[60,1],[60,2],[60,4],[60,5],[64,4],[65,1],[65,2],[65,2],[65,1],[45,1],[45,1],[45,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[66,2],[66,2],[66,1],[66,2],[66,1],[66,1],[79,3],[79,2],[79,2],[70,4],[86,0],[86,1],[86,3], [31,1],[33,1],[33,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,1],[19,3],[19,5],[47,1],[47,1],[47,3],[47,3],[47,5],[47,5],[47,1],[10,2],[10,1],[28,1],[27,2],[17,5],[17,2],[55,1],[55,1],[58,0],[58,1],[53,0],[53,1],[53,3],[60,1],[60,2],[60,4],[60,5],[64,4],[65,1],[65,2],[65,2],[65,1],[45,1],[45,1],[45,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[66,2],[66,2],[66,1],[66,2],[66,1],[66,1],[79,3],[79,2],[79,2],[70,4],[86,0],[86,1],[86,3],[86,4],[86,6],[26,2],[26,4],[26,5],[26,7],[26,
[86,4],[86,6],[26,2],[26,4],[26,5],[26,7],[26,4],[91,1],[91,3],[91,5],[90,0],[90,1],[90,3],[90,3],[16,1],[16,2],[16,2],[25,3],[67,3],[67,3],[67,1],[67,2],[93,0],[93,1],[94,2],[94,4],[73,1],[73,1],[101,2],[101,3],[68,2],[72,5],[80,5],[80,4],[80,4],[69,2],[69,4],[99,1],[99,3],[99,4],[99,4],[99,6],[104,1],[104,1],[105,1],[105,3],[21,3],[21,4],[21,5],[107,3],[11,2],[71,3],[71,2],[113,2],[113,4],[113,2],[113,4],[22,2],[22,2],[22,2],[22,1],[117,2],[117,2],[23,2],[23,2],[23,2],[119,2],[119,2],[121,2],[121, 4],[91,1],[91,3],[91,5],[90,0],[90,1],[90,3],[90,3],[16,1],[16,2],[16,2],[25,3],[67,3],[67,3],[67,1],[67,2],[93,0],[93,1],[94,2],[94,4],[73,1],[73,1],[101,2],[101,3],[68,2],[72,5],[80,5],[80,4],[80,4],[69,2],[69,4],[99,1],[99,3],[99,4],[99,4],[99,6],[104,1],[104,1],[105,1],[105,3],[21,3],[21,4],[21,5],[107,3],[11,2],[71,3],[71,2],[113,2],[113,4],[113,2],[113,4],[22,2],[22,2],[22,2],[22,1],[117,2],[117,2],[23,2],[23,2],[23,2],[119,2],[119,2],[121,2],[121,3],[125,1],[125,1],[125,1],[123,1],[123,3],
3],[125,1],[125,1],[125,1],[123,1],[123,3],[122,2],[122,2],[122,4],[122,4],[122,4],[122,6],[122,6],[24,5],[24,7],[24,4],[24,6],[130,1],[130,2],[132,3],[132,4],[134,3],[134,3],[134,5],[134,3],[20,1],[20,3],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,3],[18,3],[18,3],[18,4],[18,4],[18,4]],performAction:function(c,j,h,e,r,d){c=d.length;switch(r){case 1:return this.$=new e.Expressions;case 2:return this.$= [122,2],[122,2],[122,4],[122,4],[122,4],[122,6],[122,6],[24,5],[24,7],[24,4],[24,6],[130,1],[130,2],[132,3],[132,4],[134,3],[134,3],[134,5],[134,3],[20,1],[20,3],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,3],[18,3],[18,3],[18,4],[18,4],[18,4]],performAction:function(c,j,h,e,r,d){c=d.length;switch(r){case 1:return this.$=new e.Expressions;case 2:return this.$=new e.Expressions;case 3:return this.$=
new e.Expressions;case 3:return this.$=d[c-1+1-1];case 4:return this.$=d[c-2+1-1];case 5:this.$=e.Expressions.wrap([d[c-1+1-1]]);break;case 6:this.$=d[c-3+1-1].push(d[c-3+3-1]);break;case 7:this.$=d[c-2+1-1];break;case 8:this.$=d[c-1+1-1];break;case 9:this.$=d[c-1+1-1];break;case 10:this.$=d[c-1+1-1];break;case 11:this.$=d[c-1+1-1];break;case 12:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 13:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 14:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 15:this.$= d[c-1+1-1];case 4:return this.$=d[c-2+1-1];case 5:this.$=e.Expressions.wrap([d[c-1+1-1]]);break;case 6:this.$=d[c-3+1-1].push(d[c-3+3-1]);break;case 7:this.$=d[c-2+1-1];break;case 8:this.$=d[c-1+1-1];break;case 9:this.$=d[c-1+1-1];break;case 10:this.$=d[c-1+1-1];break;case 11:this.$=d[c-1+1-1];break;case 12:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 13:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 14:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 15:this.$=d[c-1+1-1];break;case 16:this.$=
d[c-1+1-1];break;case 16:this.$=d[c-1+1-1];break;case 17:this.$=d[c-1+1-1];break;case 18:this.$=d[c-1+1-1];break;case 19:this.$=d[c-1+1-1];break;case 20:this.$=d[c-1+1-1];break;case 21:this.$=d[c-1+1-1];break;case 22:this.$=d[c-1+1-1];break;case 23:this.$=d[c-1+1-1];break;case 24:this.$=d[c-1+1-1];break;case 25:this.$=d[c-1+1-1];break;case 26:this.$=d[c-1+1-1];break;case 27:this.$=d[c-1+1-1];break;case 28:this.$=d[c-1+1-1];break;case 29:this.$=d[c-3+2-1];break;case 30:this.$=new e.Expressions;break; d[c-1+1-1];break;case 17:this.$=d[c-1+1-1];break;case 18:this.$=d[c-1+1-1];break;case 19:this.$=d[c-1+1-1];break;case 20:this.$=d[c-1+1-1];break;case 21:this.$=d[c-1+1-1];break;case 22:this.$=d[c-1+1-1];break;case 23:this.$=d[c-1+1-1];break;case 24:this.$=d[c-1+1-1];break;case 25:this.$=d[c-1+1-1];break;case 26:this.$=d[c-1+1-1];break;case 27:this.$=d[c-1+1-1];break;case 28:this.$=d[c-1+1-1];break;case 29:this.$=d[c-3+2-1];break;case 30:this.$=new e.Expressions;break;case 31:this.$=e.Expressions.wrap([d[c-
case 31:this.$=e.Expressions.wrap([d[c-2+2-1]]);break;case 32:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 33:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 34:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 35:this.$=d[c-1+1-1];break;case 36:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 37:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 38:this.$=new e.LiteralNode(true);break;case 39:this.$=new e.LiteralNode(false);break;case 40:this.$=new e.LiteralNode(true);break;case 41:this.$=new e.LiteralNode(false); 2+2-1]]);break;case 32:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 33:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 34:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 35:this.$=d[c-1+1-1];break;case 36:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 37:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 38:this.$=new e.LiteralNode(true);break;case 39:this.$=new e.LiteralNode(false);break;case 40:this.$=new e.LiteralNode(true);break;case 41:this.$=new e.LiteralNode(false);break;case 42:this.$=new e.LiteralNode(true);
break;case 42:this.$=new e.LiteralNode(true);break;case 43:this.$=new e.LiteralNode(false);break;case 44:this.$=new e.AssignNode(d[c-3+1-1],d[c-3+3-1]);break;case 45:this.$=new e.AssignNode(d[c-5+1-1],d[c-5+4-1]);break;case 46:this.$=new e.ValueNode(d[c-1+1-1]);break;case 47:this.$=d[c-1+1-1];break;case 48:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 49:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 50:this.$=new e.AssignNode(new e.ValueNode(d[c- break;case 43:this.$=new e.LiteralNode(false);break;case 44:this.$=new e.AssignNode(d[c-3+1-1],d[c-3+3-1]);break;case 45:this.$=new e.AssignNode(d[c-5+1-1],d[c-5+4-1]);break;case 46:this.$=new e.ValueNode(d[c-1+1-1]);break;case 47:this.$=d[c-1+1-1];break;case 48:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 49:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"object");break;case 50:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"object");
5+1-1]),d[c-5+4-1],"object");break;case 51:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"object");break;case 52:this.$=d[c-1+1-1];break;case 53:this.$=new e.ReturnNode(d[c-2+2-1]);break;case 54:this.$=new e.ReturnNode(new e.ValueNode(new e.LiteralNode("null")));break;case 55:this.$=new e.CommentNode(d[c-1+1-1]);break;case 56:this.$=new e.ExistenceNode(d[c-2+1-1]);break;case 57:this.$=new e.CodeNode(d[c-5+2-1],d[c-5+5-1],d[c-5+4-1]);break;case 58:this.$=new e.CodeNode([],d[c-2+2- break;case 51:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"object");break;case 52:this.$=d[c-1+1-1];break;case 53:this.$=new e.ReturnNode(d[c-2+2-1]);break;case 54:this.$=new e.ReturnNode(new e.ValueNode(new e.LiteralNode("null")));break;case 55:this.$=new e.CommentNode(d[c-1+1-1]);break;case 56:this.$=new e.ExistenceNode(d[c-2+1-1]);break;case 57:this.$=new e.CodeNode(d[c-5+2-1],d[c-5+5-1],d[c-5+4-1]);break;case 58:this.$=new e.CodeNode([],d[c-2+2-1],d[c-2+1-1]);break;case 59:this.$=
1],d[c-2+1-1]);break;case 59:this.$="func";break;case 60:this.$="boundfunc";break;case 61:this.$=d[c-1+1-1];break;case 62:this.$=d[c-1+1-1];break;case 63:this.$=[];break;case 64:this.$=[d[c-1+1-1]];break;case 65:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 66:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 67:this.$=new e.ParamNode(d[c-2+2-1],true);break;case 68:this.$=new e.ParamNode(d[c-4+1-1],false,true);break;case 69:this.$=new e.ParamNode(d[c-5+2-1],true,true);break;case 70:this.$=new e.SplatNode(d[c- "func";break;case 60:this.$="boundfunc";break;case 61:this.$=d[c-1+1-1];break;case 62:this.$=d[c-1+1-1];break;case 63:this.$=[];break;case 64:this.$=[d[c-1+1-1]];break;case 65:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 66:this.$=new e.LiteralNode(d[c-1+1-1]);break;case 67:this.$=new e.ParamNode(d[c-2+2-1],true);break;case 68:this.$=new e.ParamNode(d[c-4+1-1],false,true);break;case 69:this.$=new e.ParamNode(d[c-5+2-1],true,true);break;case 70:this.$=new e.SplatNode(d[c-4+1-1]);break;case 71:this.$=
4+1-1]);break;case 71:this.$=new e.ValueNode(d[c-1+1-1]);break;case 72:this.$=d[c-2+1-1].push(d[c-2+2-1]);break;case 73:this.$=new e.ValueNode(d[c-2+1-1],[d[c-2+2-1]]);break;case 74:this.$=d[c-1+1-1];break;case 75:this.$=d[c-1+1-1];break;case 76:this.$=new e.ValueNode(d[c-1+1-1]);break;case 77:this.$=new e.ValueNode(d[c-1+1-1]);break;case 78:this.$=d[c-1+1-1];break;case 79:this.$=new e.ValueNode(d[c-1+1-1]);break;case 80:this.$=new e.ValueNode(d[c-1+1-1]);break;case 81:this.$=new e.ValueNode(d[c- new e.ValueNode(d[c-1+1-1]);break;case 72:this.$=d[c-2+1-1].push(d[c-2+2-1]);break;case 73:this.$=new e.ValueNode(d[c-2+1-1],[d[c-2+2-1]]);break;case 74:this.$=d[c-1+1-1];break;case 75:this.$=d[c-1+1-1];break;case 76:this.$=new e.ValueNode(d[c-1+1-1]);break;case 77:this.$=new e.ValueNode(d[c-1+1-1]);break;case 78:this.$=d[c-1+1-1];break;case 79:this.$=new e.ValueNode(d[c-1+1-1]);break;case 80:this.$=new e.ValueNode(d[c-1+1-1]);break;case 81:this.$=new e.ValueNode(d[c-1+1-1]);break;case 82:this.$=
1+1-1]);break;case 82:this.$=d[c-1+1-1];break;case 83:this.$=new e.ValueNode(new e.LiteralNode("null"));break;case 84:this.$=new e.AccessorNode(d[c-2+2-1]);break;case 85:this.$=new e.AccessorNode(d[c-2+2-1],"prototype");break;case 86:this.$=new e.AccessorNode(new e.LiteralNode("prototype"));break;case 87:this.$=new e.AccessorNode(d[c-2+2-1],"soak");break;case 88:this.$=d[c-1+1-1];break;case 89:this.$=new e.SliceNode(d[c-1+1-1]);break;case 90:this.$=new e.IndexNode(d[c-3+2-1]);break;case 91:d[c-2+ d[c-1+1-1];break;case 83:this.$=new e.ValueNode(new e.LiteralNode("null"));break;case 84:this.$=new e.AccessorNode(d[c-2+2-1]);break;case 85:this.$=new e.AccessorNode(d[c-2+2-1],"prototype");break;case 86:this.$=new e.AccessorNode(new e.LiteralNode("prototype"));break;case 87:this.$=new e.AccessorNode(d[c-2+2-1],"soak");break;case 88:this.$=d[c-1+1-1];break;case 89:this.$=new e.SliceNode(d[c-1+1-1]);break;case 90:this.$=new e.IndexNode(d[c-3+2-1]);break;case 91:d[c-2+2-1].soakNode=true;this.$=d[c-
2-1].soakNode=true;this.$=d[c-2+2-1];break;case 92:d[c-2+2-1].proto=true;this.$=d[c-2+2-1];break;case 93:this.$=new e.ObjectNode(d[c-4+2-1]);break;case 94:this.$=[];break;case 95:this.$=[d[c-1+1-1]];break;case 96:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 97:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 98:this.$=d[c-6+1-1].concat(d[c-6+4-1]);break;case 99:this.$=new e.ClassNode(d[c-2+2-1]);break;case 100:this.$=new e.ClassNode(d[c-4+2-1],d[c-4+4-1]);break;case 101:this.$=new e.ClassNode(d[c- 2+2-1];break;case 92:d[c-2+2-1].proto=true;this.$=d[c-2+2-1];break;case 93:this.$=new e.ObjectNode(d[c-4+2-1]);break;case 94:this.$=[];break;case 95:this.$=[d[c-1+1-1]];break;case 96:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 97:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 98:this.$=d[c-6+1-1].concat(d[c-6+4-1]);break;case 99:this.$=new e.ClassNode(d[c-2+2-1]);break;case 100:this.$=new e.ClassNode(d[c-4+2-1],d[c-4+4-1]);break;case 101:this.$=new e.ClassNode(d[c-5+2-1],null,d[c-5+4-1]);
5+2-1],null,d[c-5+4-1]);break;case 102:this.$=new e.ClassNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 103:this.$=new e.ClassNode("__temp__",null,d[c-4+3-1]);break;case 104:this.$=d[c-1+1-1];break;case 105:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"this");break;case 106:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"this");break;case 107:this.$=[];break;case 108:this.$=[d[c-1+1-1]];break;case 109:this.$=d[c-3+1-1].concat(d[c-3+3-1]);break;case 110:this.$= break;case 102:this.$=new e.ClassNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 103:this.$=new e.ClassNode("__temp__",null,d[c-4+3-1]);break;case 104:this.$=d[c-1+1-1];break;case 105:this.$=new e.AssignNode(new e.ValueNode(d[c-3+1-1]),d[c-3+3-1],"this");break;case 106:this.$=new e.AssignNode(new e.ValueNode(d[c-5+1-1]),d[c-5+4-1],"this");break;case 107:this.$=[];break;case 108:this.$=[d[c-1+1-1]];break;case 109:this.$=d[c-3+1-1].concat(d[c-3+3-1]);break;case 110:this.$=d[c-3+2-1];break;case 111:this.$=
d[c-3+2-1];break;case 111:this.$=d[c-1+1-1];break;case 112:this.$=d[c-2+2-1].newInstance();break;case 113:this.$=(new e.CallNode(d[c-2+2-1],[])).newInstance();break;case 114:this.$=new e.ExtendsNode(d[c-3+1-1],d[c-3+3-1]);break;case 115:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 116:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 117:this.$=new e.CallNode("super",[new e.SplatNode(new e.LiteralNode("arguments"))]);break;case 118:this.$=new e.CallNode("super", d[c-1+1-1];break;case 112:this.$=d[c-2+2-1].newInstance();break;case 113:this.$=(new e.CallNode(d[c-2+2-1],[])).newInstance();break;case 114:this.$=new e.ExtendsNode(d[c-3+1-1],d[c-3+3-1]);break;case 115:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 116:this.$=new e.CallNode(d[c-3+1-1],d[c-3+3-1],d[c-3+2-1]);break;case 117:this.$=new e.CallNode("super",[new e.SplatNode(new e.LiteralNode("arguments"))]);break;case 118:this.$=new e.CallNode("super",d[c-2+2-1]);break;case 119:this.$=
d[c-2+2-1]);break;case 119:this.$=false;break;case 120:this.$=true;break;case 121:this.$=[];break;case 122:this.$=d[c-4+2-1];break;case 123:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 124:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 125:this.$="inclusive";break;case 126:this.$="exclusive";break;case 127:this.$=new e.ValueNode(new e.LiteralNode("this"),[new e.AccessorNode(d[c-2+2-1])]);break;case 128:this.$=new e.RangeNode(d[c-5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 129:this.$= false;break;case 120:this.$=true;break;case 121:this.$=[];break;case 122:this.$=d[c-4+2-1];break;case 123:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 124:this.$=new e.ValueNode(new e.LiteralNode("this"));break;case 125:this.$="inclusive";break;case 126:this.$="exclusive";break;case 127:this.$=new e.ValueNode(new e.LiteralNode("this"),[new e.AccessorNode(d[c-2+2-1])]);break;case 128:this.$=new e.RangeNode(d[c-5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 129:this.$=new e.RangeNode(d[c-
new e.RangeNode(d[c-5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 130:this.$=new e.RangeNode(d[c-4+2-1],null,d[c-4+3-1]);break;case 131:this.$=new e.RangeNode(null,d[c-4+3-1],d[c-4+2-1]);break;case 132:this.$=new e.ArrayNode([]);break;case 133:this.$=new e.ArrayNode(d[c-4+2-1]);break;case 134:this.$=[d[c-1+1-1]];break;case 135:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 136:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 137:this.$=d[c-4+2-1];break;case 138:this.$=d[c-6+1-1].concat(d[c-6+4-1]); 5+2-1],d[c-5+4-1],d[c-5+3-1]);break;case 130:this.$=new e.RangeNode(d[c-4+2-1],null,d[c-4+3-1]);break;case 131:this.$=new e.RangeNode(null,d[c-4+3-1],d[c-4+2-1]);break;case 132:this.$=new e.ArrayNode([]);break;case 133:this.$=new e.ArrayNode(d[c-4+2-1]);break;case 134:this.$=[d[c-1+1-1]];break;case 135:this.$=d[c-3+1-1].concat([d[c-3+3-1]]);break;case 136:this.$=d[c-4+1-1].concat([d[c-4+4-1]]);break;case 137:this.$=d[c-4+2-1];break;case 138:this.$=d[c-6+1-1].concat(d[c-6+4-1]);break;case 139:this.$=
break;case 139:this.$=d[c-1+1-1];break;case 140:this.$=d[c-1+1-1];break;case 141:this.$=d[c-1+1-1];break;case 142:this.$=d[c-3+1-1]instanceof Array?d[c-3+1-1].concat([d[c-3+3-1]]):[d[c-3+1-1]].concat([d[c-3+3-1]]);break;case 143:this.$=new e.TryNode(d[c-3+2-1],d[c-3+3-1][0],d[c-3+3-1][1]);break;case 144:this.$=new e.TryNode(d[c-4+2-1],null,null,d[c-4+4-1]);break;case 145:this.$=new e.TryNode(d[c-5+2-1],d[c-5+3-1][0],d[c-5+3-1][1],d[c-5+5-1]);break;case 146:this.$=[d[c-3+2-1],d[c-3+3-1]];break;case 147:this.$= d[c-1+1-1];break;case 140:this.$=d[c-1+1-1];break;case 141:this.$=d[c-1+1-1];break;case 142:this.$=d[c-3+1-1]instanceof Array?d[c-3+1-1].concat([d[c-3+3-1]]):[d[c-3+1-1]].concat([d[c-3+3-1]]);break;case 143:this.$=new e.TryNode(d[c-3+2-1],d[c-3+3-1][0],d[c-3+3-1][1]);break;case 144:this.$=new e.TryNode(d[c-4+2-1],null,null,d[c-4+4-1]);break;case 145:this.$=new e.TryNode(d[c-5+2-1],d[c-5+3-1][0],d[c-5+3-1][1],d[c-5+5-1]);break;case 146:this.$=[d[c-3+2-1],d[c-3+3-1]];break;case 147:this.$=new e.ThrowNode(d[c-
new e.ThrowNode(d[c-2+2-1]);break;case 148:this.$=new e.ParentheticalNode(d[c-3+2-1]);break;case 149:this.$=new e.ParentheticalNode(new e.LiteralNode(""));break;case 150:this.$=new e.WhileNode(d[c-2+2-1]);break;case 151:this.$=new e.WhileNode(d[c-4+2-1],{guard:d[c-4+4-1]});break;case 152:this.$=new e.WhileNode(d[c-2+2-1],{invert:true});break;case 153:this.$=new e.WhileNode(d[c-4+2-1],{invert:true,guard:d[c-4+4-1]});break;case 154:this.$=d[c-2+1-1].addBody(d[c-2+2-1]);break;case 155:this.$=d[c-2+2- 2+2-1]);break;case 148:this.$=new e.ParentheticalNode(d[c-3+2-1]);break;case 149:this.$=new e.ParentheticalNode(new e.LiteralNode(""));break;case 150:this.$=new e.WhileNode(d[c-2+2-1]);break;case 151:this.$=new e.WhileNode(d[c-4+2-1],{guard:d[c-4+4-1]});break;case 152:this.$=new e.WhileNode(d[c-2+2-1],{invert:true});break;case 153:this.$=new e.WhileNode(d[c-4+2-1],{invert:true,guard:d[c-4+4-1]});break;case 154:this.$=d[c-2+1-1].addBody(d[c-2+2-1]);break;case 155:this.$=d[c-2+2-1].addBody(e.Expressions.wrap([d[c-
1].addBody(e.Expressions.wrap([d[c-2+1-1]]));break;case 156:this.$=d[c-2+2-1].addBody(e.Expressions.wrap([d[c-2+1-1]]));break;case 157:this.$=d[c-1+1-1];break;case 158:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(d[c-2+2-1]);break;case 159:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(e.Expressions.wrap([d[c-2+2-1]]));break;case 160:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2-1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]);break;case 161:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2- 2+1-1]]));break;case 156:this.$=d[c-2+2-1].addBody(e.Expressions.wrap([d[c-2+1-1]]));break;case 157:this.$=d[c-1+1-1];break;case 158:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(d[c-2+2-1]);break;case 159:this.$=(new e.WhileNode(new e.LiteralNode("true"))).addBody(e.Expressions.wrap([d[c-2+2-1]]));break;case 160:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2-1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]);break;case 161:this.$=new e.ForNode(d[c-2+1-1],d[c-2+2-1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]);
1],d[c-2+2-1].vars[0],d[c-2+2-1].vars[1]);break;case 162:this.$=new e.ForNode(d[c-2+2-1],d[c-2+1-1],d[c-2+1-1].vars[0],d[c-2+1-1].vars[1]);break;case 163:this.$={source:new e.ValueNode(d[c-2+2-1]),vars:[]};break;case 164:d[c-2+2-1].raw=d[c-2+1-1].raw;d[c-2+2-1].vars=d[c-2+1-1];this.$=d[c-2+2-1];break;case 165:this.$=d[c-2+2-1];break;case 166:d[c-3+3-1].raw=true;this.$=d[c-3+3-1];break;case 167:this.$=d[c-1+1-1];break;case 168:this.$=new e.ValueNode(d[c-1+1-1]);break;case 169:this.$=new e.ValueNode(d[c- break;case 162:this.$=new e.ForNode(d[c-2+2-1],d[c-2+1-1],d[c-2+1-1].vars[0],d[c-2+1-1].vars[1]);break;case 163:this.$={source:new e.ValueNode(d[c-2+2-1]),vars:[]};break;case 164:d[c-2+2-1].raw=d[c-2+1-1].raw;d[c-2+2-1].vars=d[c-2+1-1];this.$=d[c-2+2-1];break;case 165:this.$=d[c-2+2-1];break;case 166:d[c-3+3-1].raw=true;this.$=d[c-3+3-1];break;case 167:this.$=d[c-1+1-1];break;case 168:this.$=new e.ValueNode(d[c-1+1-1]);break;case 169:this.$=new e.ValueNode(d[c-1+1-1]);break;case 170:this.$=[d[c-1+
1+1-1]);break;case 170:this.$=[d[c-1+1-1]];break;case 171:this.$=[d[c-3+1-1],d[c-3+3-1]];break;case 172:this.$={source:d[c-2+2-1]};break;case 173:this.$={source:d[c-2+2-1],object:true};break;case 174:this.$={source:d[c-4+2-1],guard:d[c-4+4-1]};break;case 175:this.$={source:d[c-4+2-1],guard:d[c-4+4-1],object:true};break;case 176:this.$={source:d[c-4+2-1],step:d[c-4+4-1]};break;case 177:this.$={source:d[c-6+2-1],guard:d[c-6+4-1],step:d[c-6+6-1]};break;case 178:this.$={source:d[c-6+2-1],step:d[c-6+4- 1-1]];break;case 171:this.$=[d[c-3+1-1],d[c-3+3-1]];break;case 172:this.$={source:d[c-2+2-1]};break;case 173:this.$={source:d[c-2+2-1],object:true};break;case 174:this.$={source:d[c-4+2-1],guard:d[c-4+4-1]};break;case 175:this.$={source:d[c-4+2-1],guard:d[c-4+4-1],object:true};break;case 176:this.$={source:d[c-4+2-1],step:d[c-4+4-1]};break;case 177:this.$={source:d[c-6+2-1],guard:d[c-6+4-1],step:d[c-6+6-1]};break;case 178:this.$={source:d[c-6+2-1],step:d[c-6+4-1],guard:d[c-6+6-1]};break;case 179:this.$=
1],guard:d[c-6+6-1]};break;case 179:this.$=new e.SwitchNode(d[c-5+2-1],d[c-5+4-1]);break;case 180:this.$=new e.SwitchNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 181:this.$=new e.SwitchNode(null,d[c-4+3-1]);break;case 182:this.$=new e.SwitchNode(null,d[c-6+3-1],d[c-6+5-1]);break;case 183:this.$=d[c-1+1-1];break;case 184:this.$=d[c-2+1-1].concat(d[c-2+2-1]);break;case 185:this.$=[[d[c-3+2-1],d[c-3+3-1]]];break;case 186:this.$=[[d[c-4+2-1],d[c-4+3-1]]];break;case 187:this.$=new e.IfNode(d[c-3+ new e.SwitchNode(d[c-5+2-1],d[c-5+4-1]);break;case 180:this.$=new e.SwitchNode(d[c-7+2-1],d[c-7+4-1],d[c-7+6-1]);break;case 181:this.$=new e.SwitchNode(null,d[c-4+3-1]);break;case 182:this.$=new e.SwitchNode(null,d[c-6+3-1],d[c-6+5-1]);break;case 183:this.$=d[c-1+1-1];break;case 184:this.$=d[c-2+1-1].concat(d[c-2+2-1]);break;case 185:this.$=[[d[c-3+2-1],d[c-3+3-1]]];break;case 186:this.$=[[d[c-4+2-1],d[c-4+3-1]]];break;case 187:this.$=new e.IfNode(d[c-3+2-1],d[c-3+3-1]);break;case 188:this.$=new e.IfNode(d[c-
2-1],d[c-3+3-1]);break;case 188:this.$=new e.IfNode(d[c-3+2-1],d[c-3+3-1],{invert:true});break;case 189:this.$=d[c-5+1-1].addElse((new e.IfNode(d[c-5+4-1],d[c-5+5-1])).forceStatement());break;case 190:this.$=d[c-3+1-1].addElse(d[c-3+3-1]);break;case 191:this.$=d[c-1+1-1];break;case 192:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 193:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 194:this.$=new e.IfNode(d[c- 3+2-1],d[c-3+3-1],{invert:true});break;case 189:this.$=d[c-5+1-1].addElse((new e.IfNode(d[c-5+4-1],d[c-5+5-1])).forceStatement());break;case 190:this.$=d[c-3+1-1].addElse(d[c-3+3-1]);break;case 191:this.$=d[c-1+1-1];break;case 192:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 193:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true});break;case 194:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true,
3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true,invert:true});break;case 195:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true,invert:true});break;case 196:this.$=new e.OpNode(d[c-2+1-1],d[c-2+2-1]);break;case 197:this.$=new e.OpNode("-",d[c-2+2-1]);break;case 198:this.$=new e.OpNode("+",d[c-2+2-1]);break;case 199:this.$=new e.OpNode("--",d[c-2+2-1]);break;case 200:this.$=new e.OpNode("++",d[c-2+2-1]);break;case 201:this.$=new e.OpNode("--",d[c-2+1-1],null,true); invert:true});break;case 195:this.$=new e.IfNode(d[c-3+3-1],e.Expressions.wrap([d[c-3+1-1]]),{statement:true,invert:true});break;case 196:this.$=new e.OpNode(d[c-2+1-1],d[c-2+2-1]);break;case 197:this.$=new e.OpNode("-",d[c-2+2-1]);break;case 198:this.$=new e.OpNode("+",d[c-2+2-1]);break;case 199:this.$=new e.OpNode("--",d[c-2+2-1]);break;case 200:this.$=new e.OpNode("++",d[c-2+2-1]);break;case 201:this.$=new e.OpNode("--",d[c-2+1-1],null,true);break;case 202:this.$=new e.OpNode("++",d[c-2+1-1],null,
break;case 202:this.$=new e.OpNode("++",d[c-2+1-1],null,true);break;case 203:this.$=new e.OpNode("?",d[c-3+1-1],d[c-3+3-1]);break;case 204:this.$=new e.OpNode("+",d[c-3+1-1],d[c-3+3-1]);break;case 205:this.$=new e.OpNode("-",d[c-3+1-1],d[c-3+3-1]);break;case 206:this.$=new e.OpNode("==",d[c-3+1-1],d[c-3+3-1]);break;case 207:this.$=new e.OpNode("!=",d[c-3+1-1],d[c-3+3-1]);break;case 208:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 209:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c- true);break;case 203:this.$=new e.OpNode("?",d[c-3+1-1],d[c-3+3-1]);break;case 204:this.$=new e.OpNode("+",d[c-3+1-1],d[c-3+3-1]);break;case 205:this.$=new e.OpNode("-",d[c-3+1-1],d[c-3+3-1]);break;case 206:this.$=new e.OpNode("==",d[c-3+1-1],d[c-3+3-1]);break;case 207:this.$=new e.OpNode("!=",d[c-3+1-1],d[c-3+3-1]);break;case 208:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 209:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 210:this.$=new e.OpNode(d[c-3+2-1],
3+3-1]);break;case 210:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 211:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 212:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 213:this.$=new e.OpNode(d[c-5+2-1],d[c-5+1-1],d[c-5+4-1]);break;case 214:this.$=new e.InNode(d[c-3+1-1],d[c-3+3-1]);break;case 215:this.$=new e.OpNode("in",d[c-3+1-1],d[c-3+3-1]);break;case 216:this.$=new e.OpNode("instanceof",d[c-3+1-1],d[c-3+3-1]);break;case 217:this.$=new e.OpNode(d[c- d[c-3+1-1],d[c-3+3-1]);break;case 211:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 212:this.$=new e.OpNode(d[c-3+2-1],d[c-3+1-1],d[c-3+3-1]);break;case 213:this.$=new e.OpNode(d[c-5+2-1],d[c-5+1-1],d[c-5+4-1]);break;case 214:this.$=new e.InNode(d[c-3+1-1],d[c-3+3-1]);break;case 215:this.$=new e.OpNode("in",d[c-3+1-1],d[c-3+3-1]);break;case 216:this.$=new e.OpNode("instanceof",d[c-3+1-1],d[c-3+3-1]);break;case 217:this.$=new e.OpNode(d[c-4+2-1],new e.InNode(d[c-4+1-1],d[c-4+4-1]));
4+2-1],new e.InNode(d[c-4+1-1],d[c-4+4-1]));break;case 218:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("in",d[c-4+1-1],d[c-4+4-1])));break;case 219:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("instanceof",d[c-4+1-1],d[c-4+4-1])));break}},table:[{"1":[2,1],"3":1,"4":[1,2],"5":3,"6":4,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21, break;case 218:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("in",d[c-4+1-1],d[c-4+4-1])));break;case 219:this.$=new e.OpNode(d[c-4+2-1],new e.ParentheticalNode(new e.OpNode("instanceof",d[c-4+1-1],d[c-4+4-1])));break}},table:[{"1":[2,1],"3":1,"4":[1,2],"5":3,"6":4,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56,
"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1, "34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,
76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[3]},{"1":[2,2],"28":85,"50":[1,51]},{"1":[2,3],"4":[1,86]},{"4":[1,87]},{"1":[2,5],"4":[2,5],"30":[2,5]},{"5":88,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[1,89],"31":79,"32":[1,84],"33":56,"34":[1,82], 48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[3]},{"1":[2,2],"28":85,"50":[1,51]},{"1":[2,3],"4":[1,86]},{"4":[1,87]},{"1":[2,5],"4":[2,5],"30":[2,5]},{"5":88,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[1,89],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],
"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43, "39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,
"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,8],"4":[2,8],"30":[2,8],"51":[1,92],"112":[2,8],"113":107,"114":[1,74],"116":[1,75],"119":108,"120":[1,77],"121":78,"126":[1,101],"127":[1,102],"137":[1,105],"138":[1,106],"139":[1,104],"140":[1,94],"141":[1,93],"142":[1,90],"143":[1,91],"144":[1,95],"145":[1,96],"146":[1,97],"147":[1,98],"148":[1,99],"149":[1,100],"151":[1,103]},{"1":[2,9],"4":[2,9],"30":[2,9],"112":[2,9],"113":111,"114":[1,74],"116":[1, 39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,8],"4":[2,8],"30":[2,8],"51":[1,92],"112":[2,8],"113":107,"114":[1,74],"116":[1,75],"119":108,"120":[1,77],"121":78,"126":[1,101],"127":[1,102],"137":[1,105],"138":[1,106],"139":[1,104],"140":[1,94],"141":[1,93],"142":[1,90],"143":[1,91],"144":[1,95],"145":[1,96],"146":[1,97],"147":[1,98],"148":[1,99],"149":[1,100],"151":[1,103]},{"1":[2,9],"4":[2,9],"30":[2,9],"112":[2,9],"113":111,"114":[1,74],"116":[1,75],"119":112,"120":[1,77],"121":78,"137":[1,
75],"119":112,"120":[1,77],"121":78,"137":[1,109],"138":[1,110]},{"1":[2,15],"4":[2,15],"29":[2,15],"30":[2,15],"51":[2,15],"59":[2,15],"63":[2,15],"66":115,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1,120],"79":121,"80":122,"81":[1,123],"82":[2,15],"83":[1,124],"84":[1,125],"87":[2,15],"93":114,"96":[1,116],"97":[2,119],"98":[2,15],"103":[2,15],"112":[2,15],"114":[2,15],"115":[2,15],"116":[2,15],"120":[2,15],"126":[2,15],"127":[2,15],"128":[2,15],"137":[2,15],"138":[2,15],"139":[2,15],"140":[2, 109],"138":[1,110]},{"1":[2,15],"4":[2,15],"29":[2,15],"30":[2,15],"51":[2,15],"59":[2,15],"63":[2,15],"66":115,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1,120],"79":121,"80":122,"81":[1,123],"82":[2,15],"83":[1,124],"84":[1,125],"87":[2,15],"93":114,"96":[1,116],"97":[2,119],"98":[2,15],"103":[2,15],"112":[2,15],"114":[2,15],"115":[2,15],"116":[2,15],"120":[2,15],"126":[2,15],"127":[2,15],"128":[2,15],"137":[2,15],"138":[2,15],"139":[2,15],"140":[2,15],"141":[2,15],"142":[2,15],"143":[2,15],"144":[2,
15],"141":[2,15],"142":[2,15],"143":[2,15],"144":[2,15],"145":[2,15],"146":[2,15],"147":[2,15],"148":[2,15],"149":[2,15],"150":[1,113],"151":[2,15]},{"1":[2,16],"4":[2,16],"29":[2,16],"30":[2,16],"51":[2,16],"59":[2,16],"63":[2,16],"82":[2,16],"87":[2,16],"98":[2,16],"103":[2,16],"112":[2,16],"114":[2,16],"115":[2,16],"116":[2,16],"120":[2,16],"126":[2,16],"127":[2,16],"128":[2,16],"137":[2,16],"138":[2,16],"139":[2,16],"140":[2,16],"141":[2,16],"142":[2,16],"143":[2,16],"144":[2,16],"145":[2,16], 15],"145":[2,15],"146":[2,15],"147":[2,15],"148":[2,15],"149":[2,15],"150":[1,113],"151":[2,15]},{"1":[2,16],"4":[2,16],"29":[2,16],"30":[2,16],"51":[2,16],"59":[2,16],"63":[2,16],"82":[2,16],"87":[2,16],"98":[2,16],"103":[2,16],"112":[2,16],"114":[2,16],"115":[2,16],"116":[2,16],"120":[2,16],"126":[2,16],"127":[2,16],"128":[2,16],"137":[2,16],"138":[2,16],"139":[2,16],"140":[2,16],"141":[2,16],"142":[2,16],"143":[2,16],"144":[2,16],"145":[2,16],"146":[2,16],"147":[2,16],"148":[2,16],"149":[2,16],
"146":[2,16],"147":[2,16],"148":[2,16],"149":[2,16],"151":[2,16]},{"1":[2,17],"4":[2,17],"29":[2,17],"30":[2,17],"51":[2,17],"59":[2,17],"63":[2,17],"82":[2,17],"87":[2,17],"98":[2,17],"103":[2,17],"112":[2,17],"114":[2,17],"115":[2,17],"116":[2,17],"120":[2,17],"126":[2,17],"127":[2,17],"128":[2,17],"137":[2,17],"138":[2,17],"139":[2,17],"140":[2,17],"141":[2,17],"142":[2,17],"143":[2,17],"144":[2,17],"145":[2,17],"146":[2,17],"147":[2,17],"148":[2,17],"149":[2,17],"151":[2,17]},{"1":[2,18],"4":[2, "151":[2,16]},{"1":[2,17],"4":[2,17],"29":[2,17],"30":[2,17],"51":[2,17],"59":[2,17],"63":[2,17],"82":[2,17],"87":[2,17],"98":[2,17],"103":[2,17],"112":[2,17],"114":[2,17],"115":[2,17],"116":[2,17],"120":[2,17],"126":[2,17],"127":[2,17],"128":[2,17],"137":[2,17],"138":[2,17],"139":[2,17],"140":[2,17],"141":[2,17],"142":[2,17],"143":[2,17],"144":[2,17],"145":[2,17],"146":[2,17],"147":[2,17],"148":[2,17],"149":[2,17],"151":[2,17]},{"1":[2,18],"4":[2,18],"29":[2,18],"30":[2,18],"51":[2,18],"59":[2,18],
18],"29":[2,18],"30":[2,18],"51":[2,18],"59":[2,18],"63":[2,18],"82":[2,18],"87":[2,18],"98":[2,18],"103":[2,18],"112":[2,18],"114":[2,18],"115":[2,18],"116":[2,18],"120":[2,18],"126":[2,18],"127":[2,18],"128":[2,18],"137":[2,18],"138":[2,18],"139":[2,18],"140":[2,18],"141":[2,18],"142":[2,18],"143":[2,18],"144":[2,18],"145":[2,18],"146":[2,18],"147":[2,18],"148":[2,18],"149":[2,18],"151":[2,18]},{"1":[2,19],"4":[2,19],"29":[2,19],"30":[2,19],"51":[2,19],"59":[2,19],"63":[2,19],"82":[2,19],"87":[2, "63":[2,18],"82":[2,18],"87":[2,18],"98":[2,18],"103":[2,18],"112":[2,18],"114":[2,18],"115":[2,18],"116":[2,18],"120":[2,18],"126":[2,18],"127":[2,18],"128":[2,18],"137":[2,18],"138":[2,18],"139":[2,18],"140":[2,18],"141":[2,18],"142":[2,18],"143":[2,18],"144":[2,18],"145":[2,18],"146":[2,18],"147":[2,18],"148":[2,18],"149":[2,18],"151":[2,18]},{"1":[2,19],"4":[2,19],"29":[2,19],"30":[2,19],"51":[2,19],"59":[2,19],"63":[2,19],"82":[2,19],"87":[2,19],"98":[2,19],"103":[2,19],"112":[2,19],"114":[2,
19],"98":[2,19],"103":[2,19],"112":[2,19],"114":[2,19],"115":[2,19],"116":[2,19],"120":[2,19],"126":[2,19],"127":[2,19],"128":[2,19],"137":[2,19],"138":[2,19],"139":[2,19],"140":[2,19],"141":[2,19],"142":[2,19],"143":[2,19],"144":[2,19],"145":[2,19],"146":[2,19],"147":[2,19],"148":[2,19],"149":[2,19],"151":[2,19]},{"1":[2,20],"4":[2,20],"29":[2,20],"30":[2,20],"51":[2,20],"59":[2,20],"63":[2,20],"82":[2,20],"87":[2,20],"98":[2,20],"103":[2,20],"112":[2,20],"114":[2,20],"115":[2,20],"116":[2,20],"120":[2, 19],"115":[2,19],"116":[2,19],"120":[2,19],"126":[2,19],"127":[2,19],"128":[2,19],"137":[2,19],"138":[2,19],"139":[2,19],"140":[2,19],"141":[2,19],"142":[2,19],"143":[2,19],"144":[2,19],"145":[2,19],"146":[2,19],"147":[2,19],"148":[2,19],"149":[2,19],"151":[2,19]},{"1":[2,20],"4":[2,20],"29":[2,20],"30":[2,20],"51":[2,20],"59":[2,20],"63":[2,20],"82":[2,20],"87":[2,20],"98":[2,20],"103":[2,20],"112":[2,20],"114":[2,20],"115":[2,20],"116":[2,20],"120":[2,20],"126":[2,20],"127":[2,20],"128":[2,20],
20],"126":[2,20],"127":[2,20],"128":[2,20],"137":[2,20],"138":[2,20],"139":[2,20],"140":[2,20],"141":[2,20],"142":[2,20],"143":[2,20],"144":[2,20],"145":[2,20],"146":[2,20],"147":[2,20],"148":[2,20],"149":[2,20],"151":[2,20]},{"1":[2,21],"4":[2,21],"29":[2,21],"30":[2,21],"51":[2,21],"59":[2,21],"63":[2,21],"82":[2,21],"87":[2,21],"98":[2,21],"103":[2,21],"112":[2,21],"114":[2,21],"115":[2,21],"116":[2,21],"120":[2,21],"126":[2,21],"127":[2,21],"128":[2,21],"137":[2,21],"138":[2,21],"139":[2,21], "137":[2,20],"138":[2,20],"139":[2,20],"140":[2,20],"141":[2,20],"142":[2,20],"143":[2,20],"144":[2,20],"145":[2,20],"146":[2,20],"147":[2,20],"148":[2,20],"149":[2,20],"151":[2,20]},{"1":[2,21],"4":[2,21],"29":[2,21],"30":[2,21],"51":[2,21],"59":[2,21],"63":[2,21],"82":[2,21],"87":[2,21],"98":[2,21],"103":[2,21],"112":[2,21],"114":[2,21],"115":[2,21],"116":[2,21],"120":[2,21],"126":[2,21],"127":[2,21],"128":[2,21],"137":[2,21],"138":[2,21],"139":[2,21],"140":[2,21],"141":[2,21],"142":[2,21],"143":[2,
"140":[2,21],"141":[2,21],"142":[2,21],"143":[2,21],"144":[2,21],"145":[2,21],"146":[2,21],"147":[2,21],"148":[2,21],"149":[2,21],"151":[2,21]},{"1":[2,22],"4":[2,22],"29":[2,22],"30":[2,22],"51":[2,22],"59":[2,22],"63":[2,22],"82":[2,22],"87":[2,22],"98":[2,22],"103":[2,22],"112":[2,22],"114":[2,22],"115":[2,22],"116":[2,22],"120":[2,22],"126":[2,22],"127":[2,22],"128":[2,22],"137":[2,22],"138":[2,22],"139":[2,22],"140":[2,22],"141":[2,22],"142":[2,22],"143":[2,22],"144":[2,22],"145":[2,22],"146":[2, 21],"144":[2,21],"145":[2,21],"146":[2,21],"147":[2,21],"148":[2,21],"149":[2,21],"151":[2,21]},{"1":[2,22],"4":[2,22],"29":[2,22],"30":[2,22],"51":[2,22],"59":[2,22],"63":[2,22],"82":[2,22],"87":[2,22],"98":[2,22],"103":[2,22],"112":[2,22],"114":[2,22],"115":[2,22],"116":[2,22],"120":[2,22],"126":[2,22],"127":[2,22],"128":[2,22],"137":[2,22],"138":[2,22],"139":[2,22],"140":[2,22],"141":[2,22],"142":[2,22],"143":[2,22],"144":[2,22],"145":[2,22],"146":[2,22],"147":[2,22],"148":[2,22],"149":[2,22],
22],"147":[2,22],"148":[2,22],"149":[2,22],"151":[2,22]},{"1":[2,23],"4":[2,23],"29":[2,23],"30":[2,23],"51":[2,23],"59":[2,23],"63":[2,23],"82":[2,23],"87":[2,23],"98":[2,23],"103":[2,23],"112":[2,23],"114":[2,23],"115":[2,23],"116":[2,23],"120":[2,23],"126":[2,23],"127":[2,23],"128":[2,23],"137":[2,23],"138":[2,23],"139":[2,23],"140":[2,23],"141":[2,23],"142":[2,23],"143":[2,23],"144":[2,23],"145":[2,23],"146":[2,23],"147":[2,23],"148":[2,23],"149":[2,23],"151":[2,23]},{"1":[2,24],"4":[2,24],"29":[2, "151":[2,22]},{"1":[2,23],"4":[2,23],"29":[2,23],"30":[2,23],"51":[2,23],"59":[2,23],"63":[2,23],"82":[2,23],"87":[2,23],"98":[2,23],"103":[2,23],"112":[2,23],"114":[2,23],"115":[2,23],"116":[2,23],"120":[2,23],"126":[2,23],"127":[2,23],"128":[2,23],"137":[2,23],"138":[2,23],"139":[2,23],"140":[2,23],"141":[2,23],"142":[2,23],"143":[2,23],"144":[2,23],"145":[2,23],"146":[2,23],"147":[2,23],"148":[2,23],"149":[2,23],"151":[2,23]},{"1":[2,24],"4":[2,24],"29":[2,24],"30":[2,24],"51":[2,24],"59":[2,24],
24],"30":[2,24],"51":[2,24],"59":[2,24],"63":[2,24],"82":[2,24],"87":[2,24],"98":[2,24],"103":[2,24],"112":[2,24],"114":[2,24],"115":[2,24],"116":[2,24],"120":[2,24],"126":[2,24],"127":[2,24],"128":[2,24],"137":[2,24],"138":[2,24],"139":[2,24],"140":[2,24],"141":[2,24],"142":[2,24],"143":[2,24],"144":[2,24],"145":[2,24],"146":[2,24],"147":[2,24],"148":[2,24],"149":[2,24],"151":[2,24]},{"1":[2,25],"4":[2,25],"29":[2,25],"30":[2,25],"51":[2,25],"59":[2,25],"63":[2,25],"82":[2,25],"87":[2,25],"98":[2, "63":[2,24],"82":[2,24],"87":[2,24],"98":[2,24],"103":[2,24],"112":[2,24],"114":[2,24],"115":[2,24],"116":[2,24],"120":[2,24],"126":[2,24],"127":[2,24],"128":[2,24],"137":[2,24],"138":[2,24],"139":[2,24],"140":[2,24],"141":[2,24],"142":[2,24],"143":[2,24],"144":[2,24],"145":[2,24],"146":[2,24],"147":[2,24],"148":[2,24],"149":[2,24],"151":[2,24]},{"1":[2,25],"4":[2,25],"29":[2,25],"30":[2,25],"51":[2,25],"59":[2,25],"63":[2,25],"82":[2,25],"87":[2,25],"98":[2,25],"103":[2,25],"112":[2,25],"114":[2,
25],"103":[2,25],"112":[2,25],"114":[2,25],"115":[2,25],"116":[2,25],"120":[2,25],"126":[2,25],"127":[2,25],"128":[2,25],"137":[2,25],"138":[2,25],"139":[2,25],"140":[2,25],"141":[2,25],"142":[2,25],"143":[2,25],"144":[2,25],"145":[2,25],"146":[2,25],"147":[2,25],"148":[2,25],"149":[2,25],"151":[2,25]},{"1":[2,26],"4":[2,26],"29":[2,26],"30":[2,26],"51":[2,26],"59":[2,26],"63":[2,26],"82":[2,26],"87":[2,26],"98":[2,26],"103":[2,26],"112":[2,26],"114":[2,26],"115":[2,26],"116":[2,26],"120":[2,26], 25],"115":[2,25],"116":[2,25],"120":[2,25],"126":[2,25],"127":[2,25],"128":[2,25],"137":[2,25],"138":[2,25],"139":[2,25],"140":[2,25],"141":[2,25],"142":[2,25],"143":[2,25],"144":[2,25],"145":[2,25],"146":[2,25],"147":[2,25],"148":[2,25],"149":[2,25],"151":[2,25]},{"1":[2,26],"4":[2,26],"29":[2,26],"30":[2,26],"51":[2,26],"59":[2,26],"63":[2,26],"82":[2,26],"87":[2,26],"98":[2,26],"103":[2,26],"112":[2,26],"114":[2,26],"115":[2,26],"116":[2,26],"120":[2,26],"126":[2,26],"127":[2,26],"128":[2,26],
"126":[2,26],"127":[2,26],"128":[2,26],"137":[2,26],"138":[2,26],"139":[2,26],"140":[2,26],"141":[2,26],"142":[2,26],"143":[2,26],"144":[2,26],"145":[2,26],"146":[2,26],"147":[2,26],"148":[2,26],"149":[2,26],"151":[2,26]},{"1":[2,27],"4":[2,27],"29":[2,27],"30":[2,27],"51":[2,27],"59":[2,27],"63":[2,27],"82":[2,27],"87":[2,27],"98":[2,27],"103":[2,27],"112":[2,27],"114":[2,27],"115":[2,27],"116":[2,27],"120":[2,27],"126":[2,27],"127":[2,27],"128":[2,27],"137":[2,27],"138":[2,27],"139":[2,27],"140":[2, "137":[2,26],"138":[2,26],"139":[2,26],"140":[2,26],"141":[2,26],"142":[2,26],"143":[2,26],"144":[2,26],"145":[2,26],"146":[2,26],"147":[2,26],"148":[2,26],"149":[2,26],"151":[2,26]},{"1":[2,27],"4":[2,27],"29":[2,27],"30":[2,27],"51":[2,27],"59":[2,27],"63":[2,27],"82":[2,27],"87":[2,27],"98":[2,27],"103":[2,27],"112":[2,27],"114":[2,27],"115":[2,27],"116":[2,27],"120":[2,27],"126":[2,27],"127":[2,27],"128":[2,27],"137":[2,27],"138":[2,27],"139":[2,27],"140":[2,27],"141":[2,27],"142":[2,27],"143":[2,
27],"141":[2,27],"142":[2,27],"143":[2,27],"144":[2,27],"145":[2,27],"146":[2,27],"147":[2,27],"148":[2,27],"149":[2,27],"151":[2,27]},{"1":[2,28],"4":[2,28],"29":[2,28],"30":[2,28],"51":[2,28],"59":[2,28],"63":[2,28],"82":[2,28],"87":[2,28],"98":[2,28],"103":[2,28],"112":[2,28],"114":[2,28],"115":[2,28],"116":[2,28],"120":[2,28],"126":[2,28],"127":[2,28],"128":[2,28],"137":[2,28],"138":[2,28],"139":[2,28],"140":[2,28],"141":[2,28],"142":[2,28],"143":[2,28],"144":[2,28],"145":[2,28],"146":[2,28], 27],"144":[2,27],"145":[2,27],"146":[2,27],"147":[2,27],"148":[2,27],"149":[2,27],"151":[2,27]},{"1":[2,28],"4":[2,28],"29":[2,28],"30":[2,28],"51":[2,28],"59":[2,28],"63":[2,28],"82":[2,28],"87":[2,28],"98":[2,28],"103":[2,28],"112":[2,28],"114":[2,28],"115":[2,28],"116":[2,28],"120":[2,28],"126":[2,28],"127":[2,28],"128":[2,28],"137":[2,28],"138":[2,28],"139":[2,28],"140":[2,28],"141":[2,28],"142":[2,28],"143":[2,28],"144":[2,28],"145":[2,28],"146":[2,28],"147":[2,28],"148":[2,28],"149":[2,28],
"147":[2,28],"148":[2,28],"149":[2,28],"151":[2,28]},{"1":[2,10],"4":[2,10],"30":[2,10],"112":[2,10],"114":[2,10],"116":[2,10],"120":[2,10],"137":[2,10],"138":[2,10]},{"1":[2,11],"4":[2,11],"30":[2,11],"112":[2,11],"114":[2,11],"116":[2,11],"120":[2,11],"137":[2,11],"138":[2,11]},{"1":[2,12],"4":[2,12],"30":[2,12],"112":[2,12],"114":[2,12],"116":[2,12],"120":[2,12],"137":[2,12],"138":[2,12]},{"1":[2,13],"4":[2,13],"30":[2,13],"112":[2,13],"114":[2,13],"116":[2,13],"120":[2,13],"137":[2,13],"138":[2, "151":[2,28]},{"1":[2,10],"4":[2,10],"30":[2,10],"112":[2,10],"114":[2,10],"116":[2,10],"120":[2,10],"137":[2,10],"138":[2,10]},{"1":[2,11],"4":[2,11],"30":[2,11],"112":[2,11],"114":[2,11],"116":[2,11],"120":[2,11],"137":[2,11],"138":[2,11]},{"1":[2,12],"4":[2,12],"30":[2,12],"112":[2,12],"114":[2,12],"116":[2,12],"120":[2,12],"137":[2,12],"138":[2,12]},{"1":[2,13],"4":[2,13],"30":[2,13],"112":[2,13],"114":[2,13],"116":[2,13],"120":[2,13],"137":[2,13],"138":[2,13]},{"1":[2,14],"4":[2,14],"30":[2,
13]},{"1":[2,14],"4":[2,14],"30":[2,14],"112":[2,14],"114":[2,14],"116":[2,14],"120":[2,14],"137":[2,14],"138":[2,14]},{"1":[2,78],"4":[2,78],"29":[2,78],"30":[2,78],"46":[1,126],"51":[2,78],"59":[2,78],"63":[2,78],"75":[2,78],"76":[2,78],"77":[2,78],"78":[2,78],"81":[2,78],"82":[2,78],"83":[2,78],"84":[2,78],"87":[2,78],"96":[2,78],"97":[2,78],"98":[2,78],"103":[2,78],"112":[2,78],"114":[2,78],"115":[2,78],"116":[2,78],"120":[2,78],"126":[2,78],"127":[2,78],"128":[2,78],"137":[2,78],"138":[2,78], 14],"112":[2,14],"114":[2,14],"116":[2,14],"120":[2,14],"137":[2,14],"138":[2,14]},{"1":[2,78],"4":[2,78],"29":[2,78],"30":[2,78],"46":[1,126],"51":[2,78],"59":[2,78],"63":[2,78],"75":[2,78],"76":[2,78],"77":[2,78],"78":[2,78],"81":[2,78],"82":[2,78],"83":[2,78],"84":[2,78],"87":[2,78],"96":[2,78],"97":[2,78],"98":[2,78],"103":[2,78],"112":[2,78],"114":[2,78],"115":[2,78],"116":[2,78],"120":[2,78],"126":[2,78],"127":[2,78],"128":[2,78],"137":[2,78],"138":[2,78],"139":[2,78],"140":[2,78],"141":[2,
"139":[2,78],"140":[2,78],"141":[2,78],"142":[2,78],"143":[2,78],"144":[2,78],"145":[2,78],"146":[2,78],"147":[2,78],"148":[2,78],"149":[2,78],"150":[2,78],"151":[2,78]},{"1":[2,79],"4":[2,79],"29":[2,79],"30":[2,79],"51":[2,79],"59":[2,79],"63":[2,79],"75":[2,79],"76":[2,79],"77":[2,79],"78":[2,79],"81":[2,79],"82":[2,79],"83":[2,79],"84":[2,79],"87":[2,79],"96":[2,79],"97":[2,79],"98":[2,79],"103":[2,79],"112":[2,79],"114":[2,79],"115":[2,79],"116":[2,79],"120":[2,79],"126":[2,79],"127":[2,79], 78],"142":[2,78],"143":[2,78],"144":[2,78],"145":[2,78],"146":[2,78],"147":[2,78],"148":[2,78],"149":[2,78],"150":[2,78],"151":[2,78]},{"1":[2,79],"4":[2,79],"29":[2,79],"30":[2,79],"51":[2,79],"59":[2,79],"63":[2,79],"75":[2,79],"76":[2,79],"77":[2,79],"78":[2,79],"81":[2,79],"82":[2,79],"83":[2,79],"84":[2,79],"87":[2,79],"96":[2,79],"97":[2,79],"98":[2,79],"103":[2,79],"112":[2,79],"114":[2,79],"115":[2,79],"116":[2,79],"120":[2,79],"126":[2,79],"127":[2,79],"128":[2,79],"137":[2,79],"138":[2,
"128":[2,79],"137":[2,79],"138":[2,79],"139":[2,79],"140":[2,79],"141":[2,79],"142":[2,79],"143":[2,79],"144":[2,79],"145":[2,79],"146":[2,79],"147":[2,79],"148":[2,79],"149":[2,79],"150":[2,79],"151":[2,79]},{"1":[2,80],"4":[2,80],"29":[2,80],"30":[2,80],"51":[2,80],"59":[2,80],"63":[2,80],"75":[2,80],"76":[2,80],"77":[2,80],"78":[2,80],"81":[2,80],"82":[2,80],"83":[2,80],"84":[2,80],"87":[2,80],"96":[2,80],"97":[2,80],"98":[2,80],"103":[2,80],"112":[2,80],"114":[2,80],"115":[2,80],"116":[2,80], 79],"139":[2,79],"140":[2,79],"141":[2,79],"142":[2,79],"143":[2,79],"144":[2,79],"145":[2,79],"146":[2,79],"147":[2,79],"148":[2,79],"149":[2,79],"150":[2,79],"151":[2,79]},{"1":[2,80],"4":[2,80],"29":[2,80],"30":[2,80],"51":[2,80],"59":[2,80],"63":[2,80],"75":[2,80],"76":[2,80],"77":[2,80],"78":[2,80],"81":[2,80],"82":[2,80],"83":[2,80],"84":[2,80],"87":[2,80],"96":[2,80],"97":[2,80],"98":[2,80],"103":[2,80],"112":[2,80],"114":[2,80],"115":[2,80],"116":[2,80],"120":[2,80],"126":[2,80],"127":[2,
"120":[2,80],"126":[2,80],"127":[2,80],"128":[2,80],"137":[2,80],"138":[2,80],"139":[2,80],"140":[2,80],"141":[2,80],"142":[2,80],"143":[2,80],"144":[2,80],"145":[2,80],"146":[2,80],"147":[2,80],"148":[2,80],"149":[2,80],"150":[2,80],"151":[2,80]},{"1":[2,81],"4":[2,81],"29":[2,81],"30":[2,81],"51":[2,81],"59":[2,81],"63":[2,81],"75":[2,81],"76":[2,81],"77":[2,81],"78":[2,81],"81":[2,81],"82":[2,81],"83":[2,81],"84":[2,81],"87":[2,81],"96":[2,81],"97":[2,81],"98":[2,81],"103":[2,81],"112":[2,81], 80],"128":[2,80],"137":[2,80],"138":[2,80],"139":[2,80],"140":[2,80],"141":[2,80],"142":[2,80],"143":[2,80],"144":[2,80],"145":[2,80],"146":[2,80],"147":[2,80],"148":[2,80],"149":[2,80],"150":[2,80],"151":[2,80]},{"1":[2,81],"4":[2,81],"29":[2,81],"30":[2,81],"51":[2,81],"59":[2,81],"63":[2,81],"75":[2,81],"76":[2,81],"77":[2,81],"78":[2,81],"81":[2,81],"82":[2,81],"83":[2,81],"84":[2,81],"87":[2,81],"96":[2,81],"97":[2,81],"98":[2,81],"103":[2,81],"112":[2,81],"114":[2,81],"115":[2,81],"116":[2,
"114":[2,81],"115":[2,81],"116":[2,81],"120":[2,81],"126":[2,81],"127":[2,81],"128":[2,81],"137":[2,81],"138":[2,81],"139":[2,81],"140":[2,81],"141":[2,81],"142":[2,81],"143":[2,81],"144":[2,81],"145":[2,81],"146":[2,81],"147":[2,81],"148":[2,81],"149":[2,81],"150":[2,81],"151":[2,81]},{"1":[2,82],"4":[2,82],"29":[2,82],"30":[2,82],"51":[2,82],"59":[2,82],"63":[2,82],"75":[2,82],"76":[2,82],"77":[2,82],"78":[2,82],"81":[2,82],"82":[2,82],"83":[2,82],"84":[2,82],"87":[2,82],"96":[2,82],"97":[2,82], 81],"120":[2,81],"126":[2,81],"127":[2,81],"128":[2,81],"137":[2,81],"138":[2,81],"139":[2,81],"140":[2,81],"141":[2,81],"142":[2,81],"143":[2,81],"144":[2,81],"145":[2,81],"146":[2,81],"147":[2,81],"148":[2,81],"149":[2,81],"150":[2,81],"151":[2,81]},{"1":[2,82],"4":[2,82],"29":[2,82],"30":[2,82],"51":[2,82],"59":[2,82],"63":[2,82],"75":[2,82],"76":[2,82],"77":[2,82],"78":[2,82],"81":[2,82],"82":[2,82],"83":[2,82],"84":[2,82],"87":[2,82],"96":[2,82],"97":[2,82],"98":[2,82],"103":[2,82],"112":[2,
"98":[2,82],"103":[2,82],"112":[2,82],"114":[2,82],"115":[2,82],"116":[2,82],"120":[2,82],"126":[2,82],"127":[2,82],"128":[2,82],"137":[2,82],"138":[2,82],"139":[2,82],"140":[2,82],"141":[2,82],"142":[2,82],"143":[2,82],"144":[2,82],"145":[2,82],"146":[2,82],"147":[2,82],"148":[2,82],"149":[2,82],"150":[2,82],"151":[2,82]},{"1":[2,83],"4":[2,83],"29":[2,83],"30":[2,83],"51":[2,83],"59":[2,83],"63":[2,83],"75":[2,83],"76":[2,83],"77":[2,83],"78":[2,83],"81":[2,83],"82":[2,83],"83":[2,83],"84":[2,83], 82],"114":[2,82],"115":[2,82],"116":[2,82],"120":[2,82],"126":[2,82],"127":[2,82],"128":[2,82],"137":[2,82],"138":[2,82],"139":[2,82],"140":[2,82],"141":[2,82],"142":[2,82],"143":[2,82],"144":[2,82],"145":[2,82],"146":[2,82],"147":[2,82],"148":[2,82],"149":[2,82],"150":[2,82],"151":[2,82]},{"1":[2,83],"4":[2,83],"29":[2,83],"30":[2,83],"51":[2,83],"59":[2,83],"63":[2,83],"75":[2,83],"76":[2,83],"77":[2,83],"78":[2,83],"81":[2,83],"82":[2,83],"83":[2,83],"84":[2,83],"87":[2,83],"96":[2,83],"97":[2,
"87":[2,83],"96":[2,83],"97":[2,83],"98":[2,83],"103":[2,83],"112":[2,83],"114":[2,83],"115":[2,83],"116":[2,83],"120":[2,83],"126":[2,83],"127":[2,83],"128":[2,83],"137":[2,83],"138":[2,83],"139":[2,83],"140":[2,83],"141":[2,83],"142":[2,83],"143":[2,83],"144":[2,83],"145":[2,83],"146":[2,83],"147":[2,83],"148":[2,83],"149":[2,83],"150":[2,83],"151":[2,83]},{"1":[2,111],"4":[2,111],"29":[2,111],"30":[2,111],"51":[2,111],"59":[2,111],"63":[2,111],"66":128,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1, 83],"98":[2,83],"103":[2,83],"112":[2,83],"114":[2,83],"115":[2,83],"116":[2,83],"120":[2,83],"126":[2,83],"127":[2,83],"128":[2,83],"137":[2,83],"138":[2,83],"139":[2,83],"140":[2,83],"141":[2,83],"142":[2,83],"143":[2,83],"144":[2,83],"145":[2,83],"146":[2,83],"147":[2,83],"148":[2,83],"149":[2,83],"150":[2,83],"151":[2,83]},{"1":[2,111],"4":[2,111],"29":[2,111],"30":[2,111],"51":[2,111],"59":[2,111],"63":[2,111],"66":128,"75":[1,117],"76":[1,118],"77":[1,119],"78":[1,120],"79":121,"80":122,"81":[1,
120],"79":121,"80":122,"81":[1,123],"82":[2,111],"83":[1,124],"84":[1,125],"87":[2,111],"93":127,"96":[1,116],"97":[2,119],"98":[2,111],"103":[2,111],"112":[2,111],"114":[2,111],"115":[2,111],"116":[2,111],"120":[2,111],"126":[2,111],"127":[2,111],"128":[2,111],"137":[2,111],"138":[2,111],"139":[2,111],"140":[2,111],"141":[2,111],"142":[2,111],"143":[2,111],"144":[2,111],"145":[2,111],"146":[2,111],"147":[2,111],"148":[2,111],"149":[2,111],"151":[2,111]},{"15":130,"31":79,"32":[1,84],"33":56,"34":[1, 123],"82":[2,111],"83":[1,124],"84":[1,125],"87":[2,111],"93":127,"96":[1,116],"97":[2,119],"98":[2,111],"103":[2,111],"112":[2,111],"114":[2,111],"115":[2,111],"116":[2,111],"120":[2,111],"126":[2,111],"127":[2,111],"128":[2,111],"137":[2,111],"138":[2,111],"139":[2,111],"140":[2,111],"141":[2,111],"142":[2,111],"143":[2,111],"144":[2,111],"145":[2,111],"146":[2,111],"147":[2,111],"148":[2,111],"149":[2,111],"151":[2,111]},{"15":130,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,
82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131,"62":[1,68],"65":132,"67":129,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"53":133,"54":[2,63],"59":[2,63],"60":134,"61":[1,135],"62":[1,136]},{"4":[1,138],"6":137,"29":[1,6]},{"8":139,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14, 57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131,"62":[1,68],"65":132,"67":129,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"53":133,"54":[2,63],"59":[2,63],"60":134,"61":[1,135],"62":[1,136]},{"4":[1,138],"6":137,"29":[1,6]},{"8":139,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,
"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45, "25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,
"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":141,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1, "118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":141,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,
62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1, "49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":142,"9":140,"10":23,"11":24,
42]},{"8":142,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1, "12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],
33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":143,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79, "95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":143,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,
"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77], 83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,
"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":144,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36], 72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":144,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,
"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,191],"4":[2,191],"29":[2,191],"30":[2,191],"51":[2,191],"59":[2, 68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,191],"4":[2,191],"29":[2,191],"30":[2,191],"51":[2,191],"59":[2,191],"63":[2,191],"82":[2,191],"87":[2,
191],"63":[2,191],"82":[2,191],"87":[2,191],"98":[2,191],"103":[2,191],"112":[2,191],"114":[2,191],"115":[2,191],"116":[2,191],"120":[2,191],"126":[2,191],"127":[2,191],"128":[2,191],"131":[1,145],"137":[2,191],"138":[2,191],"139":[2,191],"140":[2,191],"141":[2,191],"142":[2,191],"143":[2,191],"144":[2,191],"145":[2,191],"146":[2,191],"147":[2,191],"148":[2,191],"149":[2,191],"151":[2,191]},{"4":[1,138],"6":146,"29":[1,6]},{"4":[1,138],"6":147,"29":[1,6]},{"1":[2,157],"4":[2,157],"29":[2,157],"30":[2, 191],"98":[2,191],"103":[2,191],"112":[2,191],"114":[2,191],"115":[2,191],"116":[2,191],"120":[2,191],"126":[2,191],"127":[2,191],"128":[2,191],"131":[1,145],"137":[2,191],"138":[2,191],"139":[2,191],"140":[2,191],"141":[2,191],"142":[2,191],"143":[2,191],"144":[2,191],"145":[2,191],"146":[2,191],"147":[2,191],"148":[2,191],"149":[2,191],"151":[2,191]},{"4":[1,138],"6":146,"29":[1,6]},{"4":[1,138],"6":147,"29":[1,6]},{"1":[2,157],"4":[2,157],"29":[2,157],"30":[2,157],"51":[2,157],"59":[2,157],"63":[2,
157],"51":[2,157],"59":[2,157],"63":[2,157],"82":[2,157],"87":[2,157],"98":[2,157],"103":[2,157],"112":[2,157],"114":[2,157],"115":[2,157],"116":[2,157],"120":[2,157],"126":[2,157],"127":[2,157],"128":[2,157],"137":[2,157],"138":[2,157],"139":[2,157],"140":[2,157],"141":[2,157],"142":[2,157],"143":[2,157],"144":[2,157],"145":[2,157],"146":[2,157],"147":[2,157],"148":[2,157],"149":[2,157],"151":[2,157]},{"4":[1,138],"6":148,"29":[1,6]},{"8":149,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1, 157],"82":[2,157],"87":[2,157],"98":[2,157],"103":[2,157],"112":[2,157],"114":[2,157],"115":[2,157],"116":[2,157],"120":[2,157],"126":[2,157],"127":[2,157],"128":[2,157],"137":[2,157],"138":[2,157],"139":[2,157],"140":[2,157],"141":[2,157],"142":[2,157],"143":[2,157],"144":[2,157],"145":[2,157],"146":[2,157],"147":[2,157],"148":[2,157],"149":[2,157],"151":[2,157]},{"4":[1,138],"6":148,"29":[1,6]},{"8":149,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,
27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,150],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1, "20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,150],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,
67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,75],"4":[2,75],"29":[2,75],"30":[2,75],"46":[2,75],"51":[2,75],"59":[2,75],"63":[2,75],"75":[2,75],"76":[2,75],"77":[2,75],"78":[2,75],"81":[2,75],"82":[2,75],"83":[2,75],"84":[2,75],"87":[2,75],"89":[1,151],"96":[2,75],"97":[2,75],"98":[2, 53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,75],"4":[2,75],"29":[2,75],"30":[2,75],"46":[2,75],"51":[2,75],"59":[2,75],"63":[2,75],"75":[2,75],"76":[2,75],"77":[2,75],"78":[2,75],"81":[2,75],"82":[2,75],"83":[2,75],"84":[2,75],"87":[2,75],"89":[1,151],"96":[2,75],"97":[2,75],"98":[2,75],"103":[2,75],"112":[2,75],"114":[2,
75],"103":[2,75],"112":[2,75],"114":[2,75],"115":[2,75],"116":[2,75],"120":[2,75],"126":[2,75],"127":[2,75],"128":[2,75],"137":[2,75],"138":[2,75],"139":[2,75],"140":[2,75],"141":[2,75],"142":[2,75],"143":[2,75],"144":[2,75],"145":[2,75],"146":[2,75],"147":[2,75],"148":[2,75],"149":[2,75],"150":[2,75],"151":[2,75]},{"15":154,"29":[1,153],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131, 75],"115":[2,75],"116":[2,75],"120":[2,75],"126":[2,75],"127":[2,75],"128":[2,75],"137":[2,75],"138":[2,75],"139":[2,75],"140":[2,75],"141":[2,75],"142":[2,75],"143":[2,75],"144":[2,75],"145":[2,75],"146":[2,75],"147":[2,75],"148":[2,75],"149":[2,75],"150":[2,75],"151":[2,75]},{"15":154,"29":[1,153],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":131,"62":[1,68],"65":152,"67":155,"68":80,
"62":[1,68],"65":152,"67":155,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"1":[2,55],"4":[2,55],"29":[2,55],"30":[2,55],"51":[2,55],"59":[2,55],"63":[2,55],"82":[2,55],"87":[2,55],"98":[2,55],"103":[2,55],"108":[2,55],"109":[2,55],"112":[2,55],"114":[2,55],"115":[2,55],"116":[2,55],"120":[2,55],"126":[2,55],"127":[2,55],"128":[2,55],"131":[2,55],"133":[2,55],"137":[2,55],"138":[2,55],"139":[2,55],"140":[2,55],"141":[2, "69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"95":[1,69],"100":[1,67],"102":[1,66],"111":[1,65]},{"1":[2,55],"4":[2,55],"29":[2,55],"30":[2,55],"51":[2,55],"59":[2,55],"63":[2,55],"82":[2,55],"87":[2,55],"98":[2,55],"103":[2,55],"108":[2,55],"109":[2,55],"112":[2,55],"114":[2,55],"115":[2,55],"116":[2,55],"120":[2,55],"126":[2,55],"127":[2,55],"128":[2,55],"131":[2,55],"133":[2,55],"137":[2,55],"138":[2,55],"139":[2,55],"140":[2,55],"141":[2,55],"142":[2,55],"143":[2,55],"144":[2,
55],"142":[2,55],"143":[2,55],"144":[2,55],"145":[2,55],"146":[2,55],"147":[2,55],"148":[2,55],"149":[2,55],"151":[2,55]},{"1":[2,54],"4":[2,54],"8":156,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,54],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1, 55],"145":[2,55],"146":[2,55],"147":[2,55],"148":[2,55],"149":[2,55],"151":[2,55]},{"1":[2,54],"4":[2,54],"8":156,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,54],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,
52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,54],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2,54],"138":[2,54],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]}, "56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,54],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2,54],"138":[2,54],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":157,"9":140,"10":23,"11":24,"12":[1,
{"8":157,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1, 25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,
81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,76],"4":[2,76],"29":[2,76],"30":[2,76],"46":[2,76],"51":[2,76],"59":[2,76],"63":[2,76],"75":[2,76],"76":[2,76],"77":[2,76],"78":[2,76],"81":[2,76],"82":[2,76],"83":[2,76],"84":[2,76],"87":[2, 69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,76],"4":[2,76],"29":[2,76],"30":[2,76],"46":[2,76],"51":[2,76],"59":[2,76],"63":[2,76],"75":[2,76],"76":[2,76],"77":[2,76],"78":[2,76],"81":[2,76],"82":[2,76],"83":[2,76],"84":[2,76],"87":[2,76],"96":[2,76],"97":[2,76],"98":[2,
76],"96":[2,76],"97":[2,76],"98":[2,76],"103":[2,76],"112":[2,76],"114":[2,76],"115":[2,76],"116":[2,76],"120":[2,76],"126":[2,76],"127":[2,76],"128":[2,76],"137":[2,76],"138":[2,76],"139":[2,76],"140":[2,76],"141":[2,76],"142":[2,76],"143":[2,76],"144":[2,76],"145":[2,76],"146":[2,76],"147":[2,76],"148":[2,76],"149":[2,76],"150":[2,76],"151":[2,76]},{"1":[2,77],"4":[2,77],"29":[2,77],"30":[2,77],"46":[2,77],"51":[2,77],"59":[2,77],"63":[2,77],"75":[2,77],"76":[2,77],"77":[2,77],"78":[2,77],"81":[2, 76],"103":[2,76],"112":[2,76],"114":[2,76],"115":[2,76],"116":[2,76],"120":[2,76],"126":[2,76],"127":[2,76],"128":[2,76],"137":[2,76],"138":[2,76],"139":[2,76],"140":[2,76],"141":[2,76],"142":[2,76],"143":[2,76],"144":[2,76],"145":[2,76],"146":[2,76],"147":[2,76],"148":[2,76],"149":[2,76],"150":[2,76],"151":[2,76]},{"1":[2,77],"4":[2,77],"29":[2,77],"30":[2,77],"46":[2,77],"51":[2,77],"59":[2,77],"63":[2,77],"75":[2,77],"76":[2,77],"77":[2,77],"78":[2,77],"81":[2,77],"82":[2,77],"83":[2,77],"84":[2,
77],"82":[2,77],"83":[2,77],"84":[2,77],"87":[2,77],"96":[2,77],"97":[2,77],"98":[2,77],"103":[2,77],"112":[2,77],"114":[2,77],"115":[2,77],"116":[2,77],"120":[2,77],"126":[2,77],"127":[2,77],"128":[2,77],"137":[2,77],"138":[2,77],"139":[2,77],"140":[2,77],"141":[2,77],"142":[2,77],"143":[2,77],"144":[2,77],"145":[2,77],"146":[2,77],"147":[2,77],"148":[2,77],"149":[2,77],"150":[2,77],"151":[2,77]},{"1":[2,35],"4":[2,35],"29":[2,35],"30":[2,35],"51":[2,35],"59":[2,35],"63":[2,35],"75":[2,35],"76":[2, 77],"87":[2,77],"96":[2,77],"97":[2,77],"98":[2,77],"103":[2,77],"112":[2,77],"114":[2,77],"115":[2,77],"116":[2,77],"120":[2,77],"126":[2,77],"127":[2,77],"128":[2,77],"137":[2,77],"138":[2,77],"139":[2,77],"140":[2,77],"141":[2,77],"142":[2,77],"143":[2,77],"144":[2,77],"145":[2,77],"146":[2,77],"147":[2,77],"148":[2,77],"149":[2,77],"150":[2,77],"151":[2,77]},{"1":[2,35],"4":[2,35],"29":[2,35],"30":[2,35],"51":[2,35],"59":[2,35],"63":[2,35],"75":[2,35],"76":[2,35],"77":[2,35],"78":[2,35],"81":[2,
35],"77":[2,35],"78":[2,35],"81":[2,35],"82":[2,35],"83":[2,35],"84":[2,35],"87":[2,35],"96":[2,35],"97":[2,35],"98":[2,35],"103":[2,35],"112":[2,35],"114":[2,35],"115":[2,35],"116":[2,35],"120":[2,35],"126":[2,35],"127":[2,35],"128":[2,35],"137":[2,35],"138":[2,35],"139":[2,35],"140":[2,35],"141":[2,35],"142":[2,35],"143":[2,35],"144":[2,35],"145":[2,35],"146":[2,35],"147":[2,35],"148":[2,35],"149":[2,35],"150":[2,35],"151":[2,35]},{"1":[2,36],"4":[2,36],"29":[2,36],"30":[2,36],"51":[2,36],"59":[2, 35],"82":[2,35],"83":[2,35],"84":[2,35],"87":[2,35],"96":[2,35],"97":[2,35],"98":[2,35],"103":[2,35],"112":[2,35],"114":[2,35],"115":[2,35],"116":[2,35],"120":[2,35],"126":[2,35],"127":[2,35],"128":[2,35],"137":[2,35],"138":[2,35],"139":[2,35],"140":[2,35],"141":[2,35],"142":[2,35],"143":[2,35],"144":[2,35],"145":[2,35],"146":[2,35],"147":[2,35],"148":[2,35],"149":[2,35],"150":[2,35],"151":[2,35]},{"1":[2,36],"4":[2,36],"29":[2,36],"30":[2,36],"51":[2,36],"59":[2,36],"63":[2,36],"75":[2,36],"76":[2,
36],"63":[2,36],"75":[2,36],"76":[2,36],"77":[2,36],"78":[2,36],"81":[2,36],"82":[2,36],"83":[2,36],"84":[2,36],"87":[2,36],"96":[2,36],"97":[2,36],"98":[2,36],"103":[2,36],"112":[2,36],"114":[2,36],"115":[2,36],"116":[2,36],"120":[2,36],"126":[2,36],"127":[2,36],"128":[2,36],"137":[2,36],"138":[2,36],"139":[2,36],"140":[2,36],"141":[2,36],"142":[2,36],"143":[2,36],"144":[2,36],"145":[2,36],"146":[2,36],"147":[2,36],"148":[2,36],"149":[2,36],"150":[2,36],"151":[2,36]},{"1":[2,37],"4":[2,37],"29":[2, 36],"77":[2,36],"78":[2,36],"81":[2,36],"82":[2,36],"83":[2,36],"84":[2,36],"87":[2,36],"96":[2,36],"97":[2,36],"98":[2,36],"103":[2,36],"112":[2,36],"114":[2,36],"115":[2,36],"116":[2,36],"120":[2,36],"126":[2,36],"127":[2,36],"128":[2,36],"137":[2,36],"138":[2,36],"139":[2,36],"140":[2,36],"141":[2,36],"142":[2,36],"143":[2,36],"144":[2,36],"145":[2,36],"146":[2,36],"147":[2,36],"148":[2,36],"149":[2,36],"150":[2,36],"151":[2,36]},{"1":[2,37],"4":[2,37],"29":[2,37],"30":[2,37],"51":[2,37],"59":[2,
37],"30":[2,37],"51":[2,37],"59":[2,37],"63":[2,37],"75":[2,37],"76":[2,37],"77":[2,37],"78":[2,37],"81":[2,37],"82":[2,37],"83":[2,37],"84":[2,37],"87":[2,37],"96":[2,37],"97":[2,37],"98":[2,37],"103":[2,37],"112":[2,37],"114":[2,37],"115":[2,37],"116":[2,37],"120":[2,37],"126":[2,37],"127":[2,37],"128":[2,37],"137":[2,37],"138":[2,37],"139":[2,37],"140":[2,37],"141":[2,37],"142":[2,37],"143":[2,37],"144":[2,37],"145":[2,37],"146":[2,37],"147":[2,37],"148":[2,37],"149":[2,37],"150":[2,37],"151":[2, 37],"63":[2,37],"75":[2,37],"76":[2,37],"77":[2,37],"78":[2,37],"81":[2,37],"82":[2,37],"83":[2,37],"84":[2,37],"87":[2,37],"96":[2,37],"97":[2,37],"98":[2,37],"103":[2,37],"112":[2,37],"114":[2,37],"115":[2,37],"116":[2,37],"120":[2,37],"126":[2,37],"127":[2,37],"128":[2,37],"137":[2,37],"138":[2,37],"139":[2,37],"140":[2,37],"141":[2,37],"142":[2,37],"143":[2,37],"144":[2,37],"145":[2,37],"146":[2,37],"147":[2,37],"148":[2,37],"149":[2,37],"150":[2,37],"151":[2,37]},{"1":[2,38],"4":[2,38],"29":[2,
37]},{"1":[2,38],"4":[2,38],"29":[2,38],"30":[2,38],"51":[2,38],"59":[2,38],"63":[2,38],"75":[2,38],"76":[2,38],"77":[2,38],"78":[2,38],"81":[2,38],"82":[2,38],"83":[2,38],"84":[2,38],"87":[2,38],"96":[2,38],"97":[2,38],"98":[2,38],"103":[2,38],"112":[2,38],"114":[2,38],"115":[2,38],"116":[2,38],"120":[2,38],"126":[2,38],"127":[2,38],"128":[2,38],"137":[2,38],"138":[2,38],"139":[2,38],"140":[2,38],"141":[2,38],"142":[2,38],"143":[2,38],"144":[2,38],"145":[2,38],"146":[2,38],"147":[2,38],"148":[2, 38],"30":[2,38],"51":[2,38],"59":[2,38],"63":[2,38],"75":[2,38],"76":[2,38],"77":[2,38],"78":[2,38],"81":[2,38],"82":[2,38],"83":[2,38],"84":[2,38],"87":[2,38],"96":[2,38],"97":[2,38],"98":[2,38],"103":[2,38],"112":[2,38],"114":[2,38],"115":[2,38],"116":[2,38],"120":[2,38],"126":[2,38],"127":[2,38],"128":[2,38],"137":[2,38],"138":[2,38],"139":[2,38],"140":[2,38],"141":[2,38],"142":[2,38],"143":[2,38],"144":[2,38],"145":[2,38],"146":[2,38],"147":[2,38],"148":[2,38],"149":[2,38],"150":[2,38],"151":[2,
38],"149":[2,38],"150":[2,38],"151":[2,38]},{"1":[2,39],"4":[2,39],"29":[2,39],"30":[2,39],"51":[2,39],"59":[2,39],"63":[2,39],"75":[2,39],"76":[2,39],"77":[2,39],"78":[2,39],"81":[2,39],"82":[2,39],"83":[2,39],"84":[2,39],"87":[2,39],"96":[2,39],"97":[2,39],"98":[2,39],"103":[2,39],"112":[2,39],"114":[2,39],"115":[2,39],"116":[2,39],"120":[2,39],"126":[2,39],"127":[2,39],"128":[2,39],"137":[2,39],"138":[2,39],"139":[2,39],"140":[2,39],"141":[2,39],"142":[2,39],"143":[2,39],"144":[2,39],"145":[2, 38]},{"1":[2,39],"4":[2,39],"29":[2,39],"30":[2,39],"51":[2,39],"59":[2,39],"63":[2,39],"75":[2,39],"76":[2,39],"77":[2,39],"78":[2,39],"81":[2,39],"82":[2,39],"83":[2,39],"84":[2,39],"87":[2,39],"96":[2,39],"97":[2,39],"98":[2,39],"103":[2,39],"112":[2,39],"114":[2,39],"115":[2,39],"116":[2,39],"120":[2,39],"126":[2,39],"127":[2,39],"128":[2,39],"137":[2,39],"138":[2,39],"139":[2,39],"140":[2,39],"141":[2,39],"142":[2,39],"143":[2,39],"144":[2,39],"145":[2,39],"146":[2,39],"147":[2,39],"148":[2,
39],"146":[2,39],"147":[2,39],"148":[2,39],"149":[2,39],"150":[2,39],"151":[2,39]},{"1":[2,40],"4":[2,40],"29":[2,40],"30":[2,40],"51":[2,40],"59":[2,40],"63":[2,40],"75":[2,40],"76":[2,40],"77":[2,40],"78":[2,40],"81":[2,40],"82":[2,40],"83":[2,40],"84":[2,40],"87":[2,40],"96":[2,40],"97":[2,40],"98":[2,40],"103":[2,40],"112":[2,40],"114":[2,40],"115":[2,40],"116":[2,40],"120":[2,40],"126":[2,40],"127":[2,40],"128":[2,40],"137":[2,40],"138":[2,40],"139":[2,40],"140":[2,40],"141":[2,40],"142":[2, 39],"149":[2,39],"150":[2,39],"151":[2,39]},{"1":[2,40],"4":[2,40],"29":[2,40],"30":[2,40],"51":[2,40],"59":[2,40],"63":[2,40],"75":[2,40],"76":[2,40],"77":[2,40],"78":[2,40],"81":[2,40],"82":[2,40],"83":[2,40],"84":[2,40],"87":[2,40],"96":[2,40],"97":[2,40],"98":[2,40],"103":[2,40],"112":[2,40],"114":[2,40],"115":[2,40],"116":[2,40],"120":[2,40],"126":[2,40],"127":[2,40],"128":[2,40],"137":[2,40],"138":[2,40],"139":[2,40],"140":[2,40],"141":[2,40],"142":[2,40],"143":[2,40],"144":[2,40],"145":[2,
40],"143":[2,40],"144":[2,40],"145":[2,40],"146":[2,40],"147":[2,40],"148":[2,40],"149":[2,40],"150":[2,40],"151":[2,40]},{"1":[2,41],"4":[2,41],"29":[2,41],"30":[2,41],"51":[2,41],"59":[2,41],"63":[2,41],"75":[2,41],"76":[2,41],"77":[2,41],"78":[2,41],"81":[2,41],"82":[2,41],"83":[2,41],"84":[2,41],"87":[2,41],"96":[2,41],"97":[2,41],"98":[2,41],"103":[2,41],"112":[2,41],"114":[2,41],"115":[2,41],"116":[2,41],"120":[2,41],"126":[2,41],"127":[2,41],"128":[2,41],"137":[2,41],"138":[2,41],"139":[2, 40],"146":[2,40],"147":[2,40],"148":[2,40],"149":[2,40],"150":[2,40],"151":[2,40]},{"1":[2,41],"4":[2,41],"29":[2,41],"30":[2,41],"51":[2,41],"59":[2,41],"63":[2,41],"75":[2,41],"76":[2,41],"77":[2,41],"78":[2,41],"81":[2,41],"82":[2,41],"83":[2,41],"84":[2,41],"87":[2,41],"96":[2,41],"97":[2,41],"98":[2,41],"103":[2,41],"112":[2,41],"114":[2,41],"115":[2,41],"116":[2,41],"120":[2,41],"126":[2,41],"127":[2,41],"128":[2,41],"137":[2,41],"138":[2,41],"139":[2,41],"140":[2,41],"141":[2,41],"142":[2,
41],"140":[2,41],"141":[2,41],"142":[2,41],"143":[2,41],"144":[2,41],"145":[2,41],"146":[2,41],"147":[2,41],"148":[2,41],"149":[2,41],"150":[2,41],"151":[2,41]},{"1":[2,42],"4":[2,42],"29":[2,42],"30":[2,42],"51":[2,42],"59":[2,42],"63":[2,42],"75":[2,42],"76":[2,42],"77":[2,42],"78":[2,42],"81":[2,42],"82":[2,42],"83":[2,42],"84":[2,42],"87":[2,42],"96":[2,42],"97":[2,42],"98":[2,42],"103":[2,42],"112":[2,42],"114":[2,42],"115":[2,42],"116":[2,42],"120":[2,42],"126":[2,42],"127":[2,42],"128":[2, 41],"143":[2,41],"144":[2,41],"145":[2,41],"146":[2,41],"147":[2,41],"148":[2,41],"149":[2,41],"150":[2,41],"151":[2,41]},{"1":[2,42],"4":[2,42],"29":[2,42],"30":[2,42],"51":[2,42],"59":[2,42],"63":[2,42],"75":[2,42],"76":[2,42],"77":[2,42],"78":[2,42],"81":[2,42],"82":[2,42],"83":[2,42],"84":[2,42],"87":[2,42],"96":[2,42],"97":[2,42],"98":[2,42],"103":[2,42],"112":[2,42],"114":[2,42],"115":[2,42],"116":[2,42],"120":[2,42],"126":[2,42],"127":[2,42],"128":[2,42],"137":[2,42],"138":[2,42],"139":[2,
42],"137":[2,42],"138":[2,42],"139":[2,42],"140":[2,42],"141":[2,42],"142":[2,42],"143":[2,42],"144":[2,42],"145":[2,42],"146":[2,42],"147":[2,42],"148":[2,42],"149":[2,42],"150":[2,42],"151":[2,42]},{"1":[2,43],"4":[2,43],"29":[2,43],"30":[2,43],"51":[2,43],"59":[2,43],"63":[2,43],"75":[2,43],"76":[2,43],"77":[2,43],"78":[2,43],"81":[2,43],"82":[2,43],"83":[2,43],"84":[2,43],"87":[2,43],"96":[2,43],"97":[2,43],"98":[2,43],"103":[2,43],"112":[2,43],"114":[2,43],"115":[2,43],"116":[2,43],"120":[2, 42],"140":[2,42],"141":[2,42],"142":[2,42],"143":[2,42],"144":[2,42],"145":[2,42],"146":[2,42],"147":[2,42],"148":[2,42],"149":[2,42],"150":[2,42],"151":[2,42]},{"1":[2,43],"4":[2,43],"29":[2,43],"30":[2,43],"51":[2,43],"59":[2,43],"63":[2,43],"75":[2,43],"76":[2,43],"77":[2,43],"78":[2,43],"81":[2,43],"82":[2,43],"83":[2,43],"84":[2,43],"87":[2,43],"96":[2,43],"97":[2,43],"98":[2,43],"103":[2,43],"112":[2,43],"114":[2,43],"115":[2,43],"116":[2,43],"120":[2,43],"126":[2,43],"127":[2,43],"128":[2,
43],"126":[2,43],"127":[2,43],"128":[2,43],"137":[2,43],"138":[2,43],"139":[2,43],"140":[2,43],"141":[2,43],"142":[2,43],"143":[2,43],"144":[2,43],"145":[2,43],"146":[2,43],"147":[2,43],"148":[2,43],"149":[2,43],"150":[2,43],"151":[2,43]},{"7":158,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1, 43],"137":[2,43],"138":[2,43],"139":[2,43],"140":[2,43],"141":[2,43],"142":[2,43],"143":[2,43],"144":[2,43],"145":[2,43],"146":[2,43],"147":[2,43],"148":[2,43],"149":[2,43],"150":[2,43],"151":[2,43]},{"7":158,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],
58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[1,159],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73], "42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"112":[1,159],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],
"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":160,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,164],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68], "142":[1,41],"143":[1,42]},{"8":160,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,164],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"64":165,"65":49,"67":34,"68":80,"69":54,
"64":165,"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"99":162,"100":[1,67],"102":[1,66],"103":[1,161],"104":163,"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,123],"4":[2,123],"29":[2,123],"30":[2,123],"51":[2,123],"59":[2, "70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"99":162,"100":[1,67],"102":[1,66],"103":[1,161],"104":163,"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,123],"4":[2,123],"29":[2,123],"30":[2,123],"51":[2,123],"59":[2,123],"63":[2,123],"75":[2,123],"76":[2,
123],"63":[2,123],"75":[2,123],"76":[2,123],"77":[2,123],"78":[2,123],"81":[2,123],"82":[2,123],"83":[2,123],"84":[2,123],"87":[2,123],"96":[2,123],"97":[2,123],"98":[2,123],"103":[2,123],"112":[2,123],"114":[2,123],"115":[2,123],"116":[2,123],"120":[2,123],"126":[2,123],"127":[2,123],"128":[2,123],"137":[2,123],"138":[2,123],"139":[2,123],"140":[2,123],"141":[2,123],"142":[2,123],"143":[2,123],"144":[2,123],"145":[2,123],"146":[2,123],"147":[2,123],"148":[2,123],"149":[2,123],"150":[2,123],"151":[2, 123],"77":[2,123],"78":[2,123],"81":[2,123],"82":[2,123],"83":[2,123],"84":[2,123],"87":[2,123],"96":[2,123],"97":[2,123],"98":[2,123],"103":[2,123],"112":[2,123],"114":[2,123],"115":[2,123],"116":[2,123],"120":[2,123],"126":[2,123],"127":[2,123],"128":[2,123],"137":[2,123],"138":[2,123],"139":[2,123],"140":[2,123],"141":[2,123],"142":[2,123],"143":[2,123],"144":[2,123],"145":[2,123],"146":[2,123],"147":[2,123],"148":[2,123],"149":[2,123],"150":[2,123],"151":[2,123]},{"1":[2,124],"4":[2,124],"29":[2,
123]},{"1":[2,124],"4":[2,124],"29":[2,124],"30":[2,124],"31":166,"32":[1,84],"51":[2,124],"59":[2,124],"63":[2,124],"75":[2,124],"76":[2,124],"77":[2,124],"78":[2,124],"81":[2,124],"82":[2,124],"83":[2,124],"84":[2,124],"87":[2,124],"96":[2,124],"97":[2,124],"98":[2,124],"103":[2,124],"112":[2,124],"114":[2,124],"115":[2,124],"116":[2,124],"120":[2,124],"126":[2,124],"127":[2,124],"128":[2,124],"137":[2,124],"138":[2,124],"139":[2,124],"140":[2,124],"141":[2,124],"142":[2,124],"143":[2,124],"144":[2, 124],"30":[2,124],"31":166,"32":[1,84],"51":[2,124],"59":[2,124],"63":[2,124],"75":[2,124],"76":[2,124],"77":[2,124],"78":[2,124],"81":[2,124],"82":[2,124],"83":[2,124],"84":[2,124],"87":[2,124],"96":[2,124],"97":[2,124],"98":[2,124],"103":[2,124],"112":[2,124],"114":[2,124],"115":[2,124],"116":[2,124],"120":[2,124],"126":[2,124],"127":[2,124],"128":[2,124],"137":[2,124],"138":[2,124],"139":[2,124],"140":[2,124],"141":[2,124],"142":[2,124],"143":[2,124],"144":[2,124],"145":[2,124],"146":[2,124],"147":[2,
124],"145":[2,124],"146":[2,124],"147":[2,124],"148":[2,124],"149":[2,124],"150":[2,124],"151":[2,124]},{"1":[2,117],"4":[2,117],"29":[2,117],"30":[2,117],"51":[2,117],"59":[2,117],"63":[2,117],"75":[2,117],"76":[2,117],"77":[2,117],"78":[2,117],"81":[2,117],"82":[2,117],"83":[2,117],"84":[2,117],"87":[2,117],"94":167,"96":[2,117],"97":[1,168],"98":[2,117],"103":[2,117],"112":[2,117],"114":[2,117],"115":[2,117],"116":[2,117],"120":[2,117],"126":[2,117],"127":[2,117],"128":[2,117],"137":[2,117],"138":[2, 124],"148":[2,124],"149":[2,124],"150":[2,124],"151":[2,124]},{"1":[2,117],"4":[2,117],"29":[2,117],"30":[2,117],"51":[2,117],"59":[2,117],"63":[2,117],"75":[2,117],"76":[2,117],"77":[2,117],"78":[2,117],"81":[2,117],"82":[2,117],"83":[2,117],"84":[2,117],"87":[2,117],"94":167,"96":[2,117],"97":[1,168],"98":[2,117],"103":[2,117],"112":[2,117],"114":[2,117],"115":[2,117],"116":[2,117],"120":[2,117],"126":[2,117],"127":[2,117],"128":[2,117],"137":[2,117],"138":[2,117],"139":[2,117],"140":[2,117],"141":[2,
117],"139":[2,117],"140":[2,117],"141":[2,117],"142":[2,117],"143":[2,117],"144":[2,117],"145":[2,117],"146":[2,117],"147":[2,117],"148":[2,117],"149":[2,117],"151":[2,117]},{"4":[2,59],"29":[2,59]},{"4":[2,60],"29":[2,60]},{"8":169,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1, 117],"142":[2,117],"143":[2,117],"144":[2,117],"145":[2,117],"146":[2,117],"147":[2,117],"148":[2,117],"149":[2,117],"151":[2,117]},{"4":[2,59],"29":[2,59]},{"4":[2,60],"29":[2,60]},{"8":169,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,
60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40], 63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":170,
"142":[1,41],"143":[1,42]},{"8":170,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31, "9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],
"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":171,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21, "88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":171,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],
"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47, "33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,
"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":172,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51], "129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":172,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,
"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"4":[1,138],"6":173,"8":174,"9":140,"10":23,"11":24,"12":[1, "56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"4":[1,138],"6":173,"8":174,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],
25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1, "14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],
35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"31":179,"32":[1,84],"69":180,"70":181,"72":175,"85":[1,81],"102":[1,66],"123":176,"124":[1,177],"125":178},{"122":182,"126":[1,183],"127":[1,184]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"46":[2,71],"51":[2,71], "100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"31":179,"32":[1,84],"69":180,"70":181,"72":175,"85":[1,81],"102":[1,66],"123":176,"124":[1,177],"125":178},{"122":182,"126":[1,183],"127":[1,184]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"46":[2,71],"51":[2,71],"59":[2,71],"63":[2,
"59":[2,71],"63":[2,71],"75":[2,71],"76":[2,71],"77":[2,71],"78":[2,71],"81":[2,71],"82":[2,71],"83":[2,71],"84":[2,71],"87":[2,71],"89":[2,71],"96":[2,71],"97":[2,71],"98":[2,71],"103":[2,71],"112":[2,71],"114":[2,71],"115":[2,71],"116":[2,71],"120":[2,71],"126":[2,71],"127":[2,71],"128":[2,71],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"143":[2,71],"144":[2,71],"145":[2,71],"146":[2,71],"147":[2,71],"148":[2,71],"149":[2,71],"150":[2,71],"151":[2,71]},{"1":[2, 71],"75":[2,71],"76":[2,71],"77":[2,71],"78":[2,71],"81":[2,71],"82":[2,71],"83":[2,71],"84":[2,71],"87":[2,71],"89":[2,71],"96":[2,71],"97":[2,71],"98":[2,71],"103":[2,71],"112":[2,71],"114":[2,71],"115":[2,71],"116":[2,71],"120":[2,71],"126":[2,71],"127":[2,71],"128":[2,71],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"143":[2,71],"144":[2,71],"145":[2,71],"146":[2,71],"147":[2,71],"148":[2,71],"149":[2,71],"150":[2,71],"151":[2,71]},{"1":[2,74],"4":[2,74],"29":[2,
74],"4":[2,74],"29":[2,74],"30":[2,74],"46":[2,74],"51":[2,74],"59":[2,74],"63":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"78":[2,74],"81":[2,74],"82":[2,74],"83":[2,74],"84":[2,74],"87":[2,74],"89":[2,74],"96":[2,74],"97":[2,74],"98":[2,74],"103":[2,74],"112":[2,74],"114":[2,74],"115":[2,74],"116":[2,74],"120":[2,74],"126":[2,74],"127":[2,74],"128":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"143":[2,74],"144":[2,74],"145":[2,74],"146":[2,74],"147":[2,74], 74],"30":[2,74],"46":[2,74],"51":[2,74],"59":[2,74],"63":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"78":[2,74],"81":[2,74],"82":[2,74],"83":[2,74],"84":[2,74],"87":[2,74],"89":[2,74],"96":[2,74],"97":[2,74],"98":[2,74],"103":[2,74],"112":[2,74],"114":[2,74],"115":[2,74],"116":[2,74],"120":[2,74],"126":[2,74],"127":[2,74],"128":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"143":[2,74],"144":[2,74],"145":[2,74],"146":[2,74],"147":[2,74],"148":[2,74],"149":[2,
"148":[2,74],"149":[2,74],"150":[2,74],"151":[2,74]},{"4":[2,94],"28":189,"29":[2,94],"31":187,"32":[1,84],"33":188,"34":[1,82],"35":[1,83],"47":186,"50":[1,51],"59":[2,94],"86":185,"87":[2,94]},{"1":[2,33],"4":[2,33],"29":[2,33],"30":[2,33],"48":[2,33],"51":[2,33],"59":[2,33],"63":[2,33],"75":[2,33],"76":[2,33],"77":[2,33],"78":[2,33],"81":[2,33],"82":[2,33],"83":[2,33],"84":[2,33],"87":[2,33],"96":[2,33],"97":[2,33],"98":[2,33],"103":[2,33],"112":[2,33],"114":[2,33],"115":[2,33],"116":[2,33],"120":[2, 74],"150":[2,74],"151":[2,74]},{"4":[2,94],"28":189,"29":[2,94],"31":187,"32":[1,84],"33":188,"34":[1,82],"35":[1,83],"47":186,"50":[1,51],"59":[2,94],"86":185,"87":[2,94]},{"1":[2,33],"4":[2,33],"29":[2,33],"30":[2,33],"48":[2,33],"51":[2,33],"59":[2,33],"63":[2,33],"75":[2,33],"76":[2,33],"77":[2,33],"78":[2,33],"81":[2,33],"82":[2,33],"83":[2,33],"84":[2,33],"87":[2,33],"96":[2,33],"97":[2,33],"98":[2,33],"103":[2,33],"112":[2,33],"114":[2,33],"115":[2,33],"116":[2,33],"120":[2,33],"126":[2,33],
33],"126":[2,33],"127":[2,33],"128":[2,33],"137":[2,33],"138":[2,33],"139":[2,33],"140":[2,33],"141":[2,33],"142":[2,33],"143":[2,33],"144":[2,33],"145":[2,33],"146":[2,33],"147":[2,33],"148":[2,33],"149":[2,33],"150":[2,33],"151":[2,33]},{"1":[2,34],"4":[2,34],"29":[2,34],"30":[2,34],"48":[2,34],"51":[2,34],"59":[2,34],"63":[2,34],"75":[2,34],"76":[2,34],"77":[2,34],"78":[2,34],"81":[2,34],"82":[2,34],"83":[2,34],"84":[2,34],"87":[2,34],"96":[2,34],"97":[2,34],"98":[2,34],"103":[2,34],"112":[2,34], "127":[2,33],"128":[2,33],"137":[2,33],"138":[2,33],"139":[2,33],"140":[2,33],"141":[2,33],"142":[2,33],"143":[2,33],"144":[2,33],"145":[2,33],"146":[2,33],"147":[2,33],"148":[2,33],"149":[2,33],"150":[2,33],"151":[2,33]},{"1":[2,34],"4":[2,34],"29":[2,34],"30":[2,34],"48":[2,34],"51":[2,34],"59":[2,34],"63":[2,34],"75":[2,34],"76":[2,34],"77":[2,34],"78":[2,34],"81":[2,34],"82":[2,34],"83":[2,34],"84":[2,34],"87":[2,34],"96":[2,34],"97":[2,34],"98":[2,34],"103":[2,34],"112":[2,34],"114":[2,34],"115":[2,
"114":[2,34],"115":[2,34],"116":[2,34],"120":[2,34],"126":[2,34],"127":[2,34],"128":[2,34],"137":[2,34],"138":[2,34],"139":[2,34],"140":[2,34],"141":[2,34],"142":[2,34],"143":[2,34],"144":[2,34],"145":[2,34],"146":[2,34],"147":[2,34],"148":[2,34],"149":[2,34],"150":[2,34],"151":[2,34]},{"1":[2,32],"4":[2,32],"29":[2,32],"30":[2,32],"46":[2,32],"48":[2,32],"51":[2,32],"59":[2,32],"63":[2,32],"75":[2,32],"76":[2,32],"77":[2,32],"78":[2,32],"81":[2,32],"82":[2,32],"83":[2,32],"84":[2,32],"87":[2,32], 34],"116":[2,34],"120":[2,34],"126":[2,34],"127":[2,34],"128":[2,34],"137":[2,34],"138":[2,34],"139":[2,34],"140":[2,34],"141":[2,34],"142":[2,34],"143":[2,34],"144":[2,34],"145":[2,34],"146":[2,34],"147":[2,34],"148":[2,34],"149":[2,34],"150":[2,34],"151":[2,34]},{"1":[2,32],"4":[2,32],"29":[2,32],"30":[2,32],"46":[2,32],"48":[2,32],"51":[2,32],"59":[2,32],"63":[2,32],"75":[2,32],"76":[2,32],"77":[2,32],"78":[2,32],"81":[2,32],"82":[2,32],"83":[2,32],"84":[2,32],"87":[2,32],"89":[2,32],"96":[2,32],
"89":[2,32],"96":[2,32],"97":[2,32],"98":[2,32],"103":[2,32],"112":[2,32],"114":[2,32],"115":[2,32],"116":[2,32],"120":[2,32],"126":[2,32],"127":[2,32],"128":[2,32],"137":[2,32],"138":[2,32],"139":[2,32],"140":[2,32],"141":[2,32],"142":[2,32],"143":[2,32],"144":[2,32],"145":[2,32],"146":[2,32],"147":[2,32],"148":[2,32],"149":[2,32],"150":[2,32],"151":[2,32]},{"1":[2,31],"4":[2,31],"29":[2,31],"30":[2,31],"51":[2,31],"59":[2,31],"63":[2,31],"82":[2,31],"87":[2,31],"98":[2,31],"103":[2,31],"108":[2, "97":[2,32],"98":[2,32],"103":[2,32],"112":[2,32],"114":[2,32],"115":[2,32],"116":[2,32],"120":[2,32],"126":[2,32],"127":[2,32],"128":[2,32],"137":[2,32],"138":[2,32],"139":[2,32],"140":[2,32],"141":[2,32],"142":[2,32],"143":[2,32],"144":[2,32],"145":[2,32],"146":[2,32],"147":[2,32],"148":[2,32],"149":[2,32],"150":[2,32],"151":[2,32]},{"1":[2,31],"4":[2,31],"29":[2,31],"30":[2,31],"51":[2,31],"59":[2,31],"63":[2,31],"82":[2,31],"87":[2,31],"98":[2,31],"103":[2,31],"108":[2,31],"109":[2,31],"112":[2,
31],"109":[2,31],"112":[2,31],"114":[2,31],"115":[2,31],"116":[2,31],"120":[2,31],"126":[2,31],"127":[2,31],"128":[2,31],"131":[2,31],"133":[2,31],"137":[2,31],"138":[2,31],"139":[2,31],"140":[2,31],"141":[2,31],"142":[2,31],"143":[2,31],"144":[2,31],"145":[2,31],"146":[2,31],"147":[2,31],"148":[2,31],"149":[2,31],"151":[2,31]},{"1":[2,7],"4":[2,7],"7":190,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18, 31],"114":[2,31],"115":[2,31],"116":[2,31],"120":[2,31],"126":[2,31],"127":[2,31],"128":[2,31],"131":[2,31],"133":[2,31],"137":[2,31],"138":[2,31],"139":[2,31],"140":[2,31],"141":[2,31],"142":[2,31],"143":[2,31],"144":[2,31],"145":[2,31],"146":[2,31],"147":[2,31],"148":[2,31],"149":[2,31],"151":[2,31]},{"1":[2,7],"4":[2,7],"7":190,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,
"25":19,"26":20,"27":21,"28":22,"30":[2,7],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1, "30":[2,7],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],
75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,4]},{"4":[1,86],"30":[1,191]},{"1":[2,30],"4":[2,30],"29":[2,30],"30":[2,30],"51":[2,30],"59":[2,30],"63":[2,30],"82":[2,30],"87":[2,30],"98":[2,30],"103":[2,30],"108":[2,30],"109":[2,30],"112":[2,30],"114":[2,30],"115":[2,30],"116":[2,30],"120":[2,30],"126":[2,30],"127":[2,30],"128":[2,30],"131":[2,30],"133":[2,30],"137":[2, "119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"1":[2,4]},{"4":[1,86],"30":[1,191]},{"1":[2,30],"4":[2,30],"29":[2,30],"30":[2,30],"51":[2,30],"59":[2,30],"63":[2,30],"82":[2,30],"87":[2,30],"98":[2,30],"103":[2,30],"108":[2,30],"109":[2,30],"112":[2,30],"114":[2,30],"115":[2,30],"116":[2,30],"120":[2,30],"126":[2,30],"127":[2,30],"128":[2,30],"131":[2,30],"133":[2,30],"137":[2,30],"138":[2,30],"139":[2,
30],"138":[2,30],"139":[2,30],"140":[2,30],"141":[2,30],"142":[2,30],"143":[2,30],"144":[2,30],"145":[2,30],"146":[2,30],"147":[2,30],"148":[2,30],"149":[2,30],"151":[2,30]},{"1":[2,201],"4":[2,201],"29":[2,201],"30":[2,201],"51":[2,201],"59":[2,201],"63":[2,201],"82":[2,201],"87":[2,201],"98":[2,201],"103":[2,201],"112":[2,201],"114":[2,201],"115":[2,201],"116":[2,201],"120":[2,201],"126":[2,201],"127":[2,201],"128":[2,201],"137":[2,201],"138":[2,201],"139":[2,201],"140":[2,201],"141":[2,201],"142":[2, 30],"140":[2,30],"141":[2,30],"142":[2,30],"143":[2,30],"144":[2,30],"145":[2,30],"146":[2,30],"147":[2,30],"148":[2,30],"149":[2,30],"151":[2,30]},{"1":[2,201],"4":[2,201],"29":[2,201],"30":[2,201],"51":[2,201],"59":[2,201],"63":[2,201],"82":[2,201],"87":[2,201],"98":[2,201],"103":[2,201],"112":[2,201],"114":[2,201],"115":[2,201],"116":[2,201],"120":[2,201],"126":[2,201],"127":[2,201],"128":[2,201],"137":[2,201],"138":[2,201],"139":[2,201],"140":[2,201],"141":[2,201],"142":[2,201],"143":[2,201],
201],"143":[2,201],"144":[2,201],"145":[2,201],"146":[2,201],"147":[2,201],"148":[2,201],"149":[2,201],"151":[2,201]},{"1":[2,202],"4":[2,202],"29":[2,202],"30":[2,202],"51":[2,202],"59":[2,202],"63":[2,202],"82":[2,202],"87":[2,202],"98":[2,202],"103":[2,202],"112":[2,202],"114":[2,202],"115":[2,202],"116":[2,202],"120":[2,202],"126":[2,202],"127":[2,202],"128":[2,202],"137":[2,202],"138":[2,202],"139":[2,202],"140":[2,202],"141":[2,202],"142":[2,202],"143":[2,202],"144":[2,202],"145":[2,202],"146":[2, "144":[2,201],"145":[2,201],"146":[2,201],"147":[2,201],"148":[2,201],"149":[2,201],"151":[2,201]},{"1":[2,202],"4":[2,202],"29":[2,202],"30":[2,202],"51":[2,202],"59":[2,202],"63":[2,202],"82":[2,202],"87":[2,202],"98":[2,202],"103":[2,202],"112":[2,202],"114":[2,202],"115":[2,202],"116":[2,202],"120":[2,202],"126":[2,202],"127":[2,202],"128":[2,202],"137":[2,202],"138":[2,202],"139":[2,202],"140":[2,202],"141":[2,202],"142":[2,202],"143":[2,202],"144":[2,202],"145":[2,202],"146":[2,202],"147":[2,
202],"147":[2,202],"148":[2,202],"149":[2,202],"151":[2,202]},{"1":[2,56],"4":[2,56],"8":192,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[2,56],"30":[2,56],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"51":[2,56],"52":[1,36],"55":37, 202],"148":[2,202],"149":[2,202],"151":[2,202]},{"1":[2,56],"4":[2,56],"8":192,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[2,56],"30":[2,56],"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"51":[2,56],"52":[1,36],"55":37,"56":[1,
"56":[1,70],"57":[1,71],"59":[2,56],"62":[1,68],"63":[2,56],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"82":[2,56],"85":[1,81],"87":[2,56],"88":[1,50],"92":[1,35],"95":[1,69],"98":[2,56],"100":[1,67],"102":[1,66],"103":[2,56],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,56],"113":45,"114":[2,56],"115":[2,56],"116":[2,56],"117":46,"118":[1,76],"119":47,"120":[2,56],"121":78,"126":[2,56],"127":[2,56],"128":[2,56],"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2, 70],"57":[1,71],"59":[2,56],"62":[1,68],"63":[2,56],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"82":[2,56],"85":[1,81],"87":[2,56],"88":[1,50],"92":[1,35],"95":[1,69],"98":[2,56],"100":[1,67],"102":[1,66],"103":[2,56],"106":[1,44],"110":[1,53],"111":[1,65],"112":[2,56],"113":45,"114":[2,56],"115":[2,56],"116":[2,56],"117":46,"118":[1,76],"119":47,"120":[2,56],"121":78,"126":[2,56],"127":[2,56],"128":[2,56],"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"137":[2,56],
56],"138":[2,56],"139":[2,56],"140":[2,56],"141":[2,56],"142":[2,56],"143":[2,56],"144":[2,56],"145":[2,56],"146":[2,56],"147":[2,56],"148":[2,56],"149":[2,56],"151":[2,56]},{"8":193,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1, "138":[2,56],"139":[2,56],"140":[2,56],"141":[2,56],"142":[2,56],"143":[2,56],"144":[2,56],"145":[2,56],"146":[2,56],"147":[2,56],"148":[2,56],"149":[2,56],"151":[2,56]},{"8":193,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,
64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":194,"9":140,"10":23, 64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":194,"9":140,"10":23,
"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1, "11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],"35":[1,83],"36":29,"37":[1,57],"38":[1,58],"39":[1,59],"40":[1,60],"41":[1,61],"42":[1,62],"43":[1,63],"44":[1,64],"45":28,"49":[1,52],"50":[1,51],"52":[1,36],"55":37,"56":[1,70],"57":[1,71],"62":[1,68],"65":49,"67":34,"68":80,"69":54,"70":55,"71":30,"72":31,"73":32,"74":[1,33],"85":[1,81],"88":[1,50],"92":[1,
35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":195,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82], 35],"95":[1,69],"100":[1,67],"102":[1,66],"106":[1,44],"110":[1,53],"111":[1,65],"113":45,"114":[1,74],"116":[1,75],"117":46,"118":[1,76],"119":47,"120":[1,77],"121":78,"129":[1,48],"134":43,"135":[1,72],"136":[1,73],"139":[1,38],"140":[1,39],"141":[1,40],"142":[1,41],"143":[1,42]},{"8":195,"9":140,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":79,"32":[1,84],"33":56,"34":[1,82],
@ -454,16 +454,16 @@ function(){return true};$.prototype.makeReturn=function(){this.returns=true;retu
J=a.scope;p=this.name&&this.name.compile(a)||J.freeVariable("i");n=this.index&&this.index.compile(a);if(p&&!this.pattern&&(H||!f))J.find(p,{immediate:true});n&&J.find(n,{immediate:true});pa||(ba=J.freeVariable("result"));k=f?J.freeVariable("i"):H?p:n||J.freeVariable("i");i=qa="";b=C.wrap([this.body]);if(H){fa=ka.compileVariables(a);g=ka.compile(R(a,{index:k,step:this.step}))}else{ma=J.freeVariable("ref");fa=""+ma+" = "+this.source.compile(a)+";";if(this.pattern)w=(new j(this.name,q(""+ma+"["+k+"]"))).compile(R(a, J=a.scope;p=this.name&&this.name.compile(a)||J.freeVariable("i");n=this.index&&this.index.compile(a);if(p&&!this.pattern&&(H||!f))J.find(p,{immediate:true});n&&J.find(n,{immediate:true});pa||(ba=J.freeVariable("result"));k=f?J.freeVariable("i"):H?p:n||J.freeVariable("i");i=qa="";b=C.wrap([this.body]);if(H){fa=ka.compileVariables(a);g=ka.compile(R(a,{index:k,step:this.step}))}else{ma=J.freeVariable("ref");fa=""+ma+" = "+this.source.compile(a)+";";if(this.pattern)w=(new j(this.name,q(""+ma+"["+k+"]"))).compile(R(a,
{indent:this.idt(1),top:true,keepLevel:true}))+"\n";else if(p)w=""+p+" = "+ma+"["+k+"]";if(!this.object){g=J.freeVariable("len");J=this.step?""+k+" += "+this.step.compile(a):""+k+"++";g=""+k+" = 0, "+g+" = "+ma+".length; "+k+" < "+g+"; "+J}}fa=(fa=(ba?""+ba+" = []; ":"")+fa)?""+this.tab+fa+"\n"+this.tab:this.tab;J=this.compileReturnValue(ba,a);pa||(b=I.wrap(ba,b));if(this.guard)b=C.wrap([new E(this.guard,b)]);if(f){H&&b.unshift(q("var "+p+" = "+k));w&&b.unshift(q("var "+w));n&&b.unshift(q("var "+ {indent:this.idt(1),top:true,keepLevel:true}))+"\n";else if(p)w=""+p+" = "+ma+"["+k+"]";if(!this.object){g=J.freeVariable("len");J=this.step?""+k+" += "+this.step.compile(a):""+k+"++";g=""+k+" = 0, "+g+" = "+ma+".length; "+k+" < "+g+"; "+J}}fa=(fa=(ba?""+ba+" = []; ":"")+fa)?""+this.tab+fa+"\n"+this.tab:this.tab;J=this.compileReturnValue(ba,a);pa||(b=I.wrap(ba,b));if(this.guard)b=C.wrap([new E(this.guard,b)]);if(f){H&&b.unshift(q("var "+p+" = "+k));w&&b.unshift(q("var "+w));n&&b.unshift(q("var "+
n+" = "+k));b=d.wrap(b,true)}else qa=(w||"")&&(this.pattern?w:""+this.idt(1)+w+";\n");if(this.object){g=""+k+" in "+ma;this.raw||(i="\n"+this.idt(1)+"if (!"+ea("hasProp")+".call("+ma+", "+k+")) continue;")}b=b.compile(R(a,{indent:this.idt(1),top:true}));return""+fa+"for ("+g+") {"+i+"\n"+qa+b+"\n"+this.tab+"}"+J};return $}();z.SwitchNode=function(){ia=function(a,b,f){this.otherwise=f;this.cases=b;this.subject=a;ia.__super__.constructor.call(this);this.tags.subjectless=!this.subject;this.subject|| n+" = "+k));b=d.wrap(b,true)}else qa=(w||"")&&(this.pattern?w:""+this.idt(1)+w+";\n");if(this.object){g=""+k+" in "+ma;this.raw||(i="\n"+this.idt(1)+"if (!"+ea("hasProp")+".call("+ma+", "+k+")) continue;")}b=b.compile(R(a,{indent:this.idt(1),top:true}));return""+fa+"for ("+g+") {"+i+"\n"+qa+b+"\n"+this.tab+"}"+J};return $}();z.SwitchNode=function(){ia=function(a,b,f){this.otherwise=f;this.cases=b;this.subject=a;ia.__super__.constructor.call(this);this.tags.subjectless=!this.subject;this.subject||
(this.subject=q("true"));return this};O(ia,h);ia.prototype["class"]="SwitchNode";ia.prototype.children=["subject","cases","otherwise"];ia.prototype.isStatement=function(){return true};ia.prototype.makeReturn=function(){var a,b,f,g;f=this.cases;a=0;for(b=f.length;a<b;a++){g=f[a];g[1].makeReturn()}this.otherwise&&this.otherwise.makeReturn();return this};ia.prototype.compileNode=function(a){var b,f,g,i,n,k,p,w,H,J,ba;ba=a.indent=this.idt(1);a.top=true;w=""+this.tab+"switch ("+this.subject.compile(a)+ (this.subject=q("true"));return this};O(ia,h);ia.prototype["class"]="SwitchNode";ia.prototype.children=["subject","cases","otherwise"];ia.prototype.isStatement=function(){return true};ia.prototype.makeReturn=function(){var a,b,f,g;f=this.cases;a=0;for(b=f.length;a<b;a++){g=f[a];g[1].makeReturn()}this.otherwise&&this.otherwise.makeReturn();return this};ia.prototype.compileNode=function(a){var b,f,g,i,n,k,p,w,H,J,ba;ba=a.indent=this.idt(2);a.top=true;w=""+this.tab+"switch ("+this.subject.compile(a)+
") {";n=this.cases;b=0;for(g=n.length;b<g;b++){k=k=n[b];f=k[0];p=k[1];J=p.expressions;k=s([f]);f=0;for(i=k.length;f<i;f++){H=k[f];if(this.tags.subjectless)H=new m("!!",new u(H));w+="\n"+this.tab+"case "+H.compile(a)+":"}w+="\n"+p.compile(a);J[J.length-1]instanceof y||(w+="\n"+ba+"break;")}if(this.otherwise)w+="\n"+this.tab+"default:\n"+this.otherwise.compile(a);w+="\n"+this.tab+"}";return w};return ia}();z.IfNode=function(){E=function(a,b,f){this.tags=f;this.body=b;this.condition=a;this.tags||(this.tags= ") {";n=this.cases;b=0;for(g=n.length;b<g;b++){k=k=n[b];f=k[0];p=k[1];J=p.expressions;k=s([f]);f=0;for(i=k.length;f<i;f++){H=k[f];if(this.tags.subjectless)H=new m("!!",new u(H));w+="\n"+this.idt(1)+"case "+H.compile(a)+":"}w+="\n"+p.compile(a);J[J.length-1]instanceof y||(w+="\n"+ba+"break;")}if(this.otherwise)w+="\n"+this.idt(1)+"default:\n"+this.otherwise.compile(a);w+="\n"+this.tab+"}";return w};return ia}();z.IfNode=function(){E=function(a,b,f){this.tags=f;this.body=b;this.condition=a;this.tags||
{});if(this.tags.invert)if(this.condition instanceof m&&this.condition.isInvertible())this.condition.invert();else this.condition=new m("!",new u(this.condition));this.elseBody=null;this.isChain=false;return this};O(E,h);E.prototype["class"]="IfNode";E.prototype.children=["condition","body","elseBody","assigner"];E.prototype.topSensitive=function(){return true};E.prototype.bodyNode=function(){return this.body==null?undefined:this.body.unwrap()};E.prototype.elseBodyNode=function(){return this.elseBody== (this.tags={});if(this.tags.invert)if(this.condition instanceof m&&this.condition.isInvertible())this.condition.invert();else this.condition=new m("!",new u(this.condition));this.elseBody=null;this.isChain=false;return this};O(E,h);E.prototype["class"]="IfNode";E.prototype.children=["condition","body","elseBody","assigner"];E.prototype.topSensitive=function(){return true};E.prototype.bodyNode=function(){return this.body==null?undefined:this.body.unwrap()};E.prototype.elseBodyNode=function(){return this.elseBody==
null?undefined:this.elseBody.unwrap()};E.prototype.forceStatement=function(){this.tags.statement=true;return this};E.prototype.addElse=function(a,b){if(this.isChain)this.elseBodyNode().addElse(a,b);else{this.isChain=a instanceof E;this.elseBody=this.ensureExpressions(a)}return this};E.prototype.isStatement=function(a){return this.statement||(this.statement=!!(a&&a.top||this.tags.statement||this.bodyNode().isStatement(a)||this.elseBody&&this.elseBodyNode().isStatement(a)))};E.prototype.compileCondition= null?undefined:this.elseBody.unwrap()};E.prototype.forceStatement=function(){this.tags.statement=true;return this};E.prototype.addElse=function(a,b){if(this.isChain)this.elseBodyNode().addElse(a,b);else{this.isChain=a instanceof E;this.elseBody=this.ensureExpressions(a)}return this};E.prototype.isStatement=function(a){return this.statement||(this.statement=!!(a&&a.top||this.tags.statement||this.bodyNode().isStatement(a)||this.elseBody&&this.elseBodyNode().isStatement(a)))};E.prototype.compileCondition=
function(a){var b,f,g,i,n;n=s([this.condition]);if(n.length===1)n[0].parenthetical=true;g=[];b=0;for(f=n.length;b<f;b++){i=n[b];g.push(i.compile(a))}return g.join(" || ")};E.prototype.compileNode=function(a){return this.isStatement(a)?this.compileStatement(a):this.compileTernary(a)};E.prototype.makeReturn=function(){if(this.isStatement()){this.body&&(this.body=this.ensureExpressions(this.body.makeReturn()));this.elseBody&&(this.elseBody=this.ensureExpressions(this.elseBody.makeReturn()));return this}else return new y(this)}; function(a){var b,f,g,i,n;n=s([this.condition]);if(n.length===1)n[0].parenthetical=true;g=[];b=0;for(f=n.length;b<f;b++){i=n[b];g.push(i.compile(a))}return g.join(" || ")};E.prototype.compileNode=function(a){return this.isStatement(a)?this.compileStatement(a):this.compileTernary(a)};E.prototype.makeReturn=function(){if(this.isStatement()){this.body&&(this.body=this.ensureExpressions(this.body.makeReturn()));this.elseBody&&(this.elseBody=this.ensureExpressions(this.elseBody.makeReturn()));return this}else return new y(this)};
E.prototype.ensureExpressions=function(a){return a instanceof C?a:new C([a])};E.prototype.compileStatement=function(a){var b,f,g;g=Z(a,"top");b=Z(a,"chainChild");f=R(a);a.indent=this.idt(1);a.top=true;g=b||g&&!this.isStatement(a)?"":this.idt();b&&this.idt();b=this.body.compile(a);f=""+g+"if ("+this.compileCondition(f)+") {\n"+b+"\n"+this.tab+"}";if(!this.elseBody)return f;a=this.isChain?" else "+this.elseBodyNode().compile(R(a,{indent:this.idt(),chainChild:true})):" else {\n"+this.elseBody.compile(a)+ E.prototype.ensureExpressions=function(a){return a instanceof C?a:new C([a])};E.prototype.compileStatement=function(a){var b,f,g;g=Z(a,"top");b=Z(a,"chainChild");f=R(a);a.indent=this.idt(1);a.top=true;g=b||g&&!this.isStatement(a)?"":this.idt();b&&this.idt();b=this.body.compile(a);f=""+g+"if ("+this.compileCondition(f)+") {\n"+b+"\n"+this.tab+"}";if(!this.elseBody)return f;a=this.isChain?" else "+this.elseBodyNode().compile(R(a,{indent:this.idt(),chainChild:true})):" else {\n"+this.elseBody.compile(a)+
"\n"+this.tab+"}";return""+f+a};E.prototype.compileTernary=function(a){var b;this.bodyNode().tags.operation=this.condition.tags.operation=true;if(this.elseBody)this.elseBodyNode().tags.operation=true;b=this.condition.compile(a)+" ? "+this.bodyNode().compile(a);a=this.elseBody?this.elseBodyNode().compile(a):"null";b=""+b+" : "+a;return this.tags.operation?"("+b+")":b};return E}();I=z.PushNode={wrap:function(a,b){var f;f=b.unwrap();if(f.isPureStatement()||f.containsPureStatement())return b;return C.wrap([new e(new G(q(a), "\n"+this.tab+"}";return""+f+a};E.prototype.compileTernary=function(a){var b;this.bodyNode().tags.operation=this.condition.tags.operation=true;if(this.elseBody)this.elseBodyNode().tags.operation=true;b=this.condition.compile(a)+" ? "+this.bodyNode().compile(a);a=this.elseBody?this.elseBodyNode().compile(a):"null";b=""+b+" : "+a;return this.tags.operation?"("+b+")":b};return E}();I=z.PushNode={wrap:function(a,b){var f;f=b.unwrap();if(f.isPureStatement()||f.containsPureStatement())return b;return C.wrap([new e(new G(q(a),
[new x(q("push"))]),[f])])}};d=z.ClosureNode={wrap:function(a,b){var f,g,i,n;if(a.containsPureStatement())return a;g=new u(new A([],C.wrap([a])));f=[];i=a.contains(function(k){return k instanceof L&&k.value==="arguments"});n=a.contains(function(k){return k instanceof L&&k.value==="this"||k instanceof A&&k.bound});if(i||n){n=q(i?"apply":"call");f=[q("this")];i&&f.push(q("arguments"));g=new G(g,[new x(n)])}f=new e(g,f);return b?C.wrap([f]):f}};oa={"extends":'function(child, parent) {\n var ctor = function(){};\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n child.prototype.constructor = child;\n if (typeof parent.extended === "function") parent.extended(child);\n child.__super__ = parent.prototype;\n }', [new x(q("push"))]),[f])])}};d=z.ClosureNode={wrap:function(a,b){var f,g,i,n;if(a.containsPureStatement())return a;g=new u(new A([],C.wrap([a])));f=[];i=a.contains(function(k){return k instanceof L&&k.value==="arguments"});n=a.contains(function(k){return k instanceof L&&k.value==="this"||k instanceof A&&k.bound});if(i||n){n=q(i?"apply":"call");f=[q("this")];i&&f.push(q("arguments"));g=new G(g,[new x(n)])}f=new e(g,f);return b?C.wrap([f]):f}};oa={"extends":'function(child, parent) {\n var ctor = function(){};\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n child.prototype.constructor = child;\n if (typeof parent.extended === "function") parent.extended(child);\n child.__super__ = parent.prototype;\n }',
bind:"function(func, context) {\n return function(){ return func.apply(context, arguments); };\n }",hasProp:"Object.prototype.hasOwnProperty",slice:"Array.prototype.slice"};la=" ";na=/[ \t]+$/gm;Y=/^[a-zA-Z\$_](\w|\$)*$/;N=/^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b$/i;Q=/^-?\d+$/;aa=/^['"]/;q=function(a){return new L(a)};ea=function(a){var b;b="__"+a;U.root.assign(b,oa[a]);return b}}).call(this)});T["./coffee-script"]=new (function(){var z=this;(function(){var x, bind:"function(func, context) {\n return function(){ return func.apply(context, arguments); };\n }",hasProp:"Object.prototype.hasOwnProperty",slice:"Array.prototype.slice"};la=" ";na=/[ \t]+$/gm;Y=/^[a-zA-Z\$_](\w|\$)*$/;N=/^(((\b0(x|X)[0-9a-fA-F]+)|((\b[0-9]+(\.[0-9]+)?|\.[0-9]+)(e[+\-]?[0-9]+)?)))\b$/i;Q=/^-?\d+$/;aa=/^['"]/;q=function(a){return new L(a)};ea=function(a){var b;b="__"+a;U.root.assign(b,oa[a]);return b}}).call(this)});T["./coffee-script"]=new (function(){var z=this;(function(){var x,
c,j,h,e,r,d;d=T("path");c=T("./lexer");x=c.Lexer;c=T("./parser");r=c.parser;if(T.extensions){h=T("fs");T.extensions[".coffee"]=function(A,K){var P;P=j(h.readFileSync(K,"utf8"));A.filename=""+K+" (compiled)";return A._compile(P,A.filename)}}else T.registerExtension&&T.registerExtension(".coffee",function(A){return j(A)});z.VERSION="0.9.3";z.compile=j=function(A,K){K||(K={});try{return r.parse(e.tokenize(A)).compile(K)}catch(P){if(K.fileName)P.message="In "+K.fileName+", "+P.message;throw P;}};z.tokens= c,j,h,e,r,d;d=T("path");c=T("./lexer");x=c.Lexer;c=T("./parser");r=c.parser;if(T.extensions){h=T("fs");T.extensions[".coffee"]=function(A,K){var P;P=j(h.readFileSync(K,"utf8"));A.filename=""+K+" (compiled)";return A._compile(P,A.filename)}}else T.registerExtension&&T.registerExtension(".coffee",function(A){return j(A)});z.VERSION="0.9.4";z.compile=j=function(A,K){K||(K={});try{return r.parse(e.tokenize(A)).compile(K)}catch(P){if(K.fileName)P.message="In "+K.fileName+", "+P.message;throw P;}};z.tokens=
function(A){return e.tokenize(A)};z.nodes=function(A){return r.parse(e.tokenize(A))};z.run=function(A,K){var P;for(P=module;P.parent;)P=P.parent;P.filename=""+K.fileName+" (compiled)";if(P.moduleCache)P.moduleCache={};return P._compile(z.compile(A,K),P.filename)};z.eval=function(A,K){d.dirname(K.fileName);return eval(z.compile(A,K))};e=new x;r.lexer={lex:function(){var A;A=this.tokens[this.pos]||[""];this.pos+=1;this.yylineno=A[2];this.yytext=A[1];return A[0]},setInput:function(A){this.tokens=A;return this.pos= function(A){return e.tokenize(A)};z.nodes=function(A){return r.parse(e.tokenize(A))};z.run=function(A,K){var P;for(P=module;P.parent;)P=P.parent;P.filename=""+K.fileName+" (compiled)";if(P.moduleCache)P.moduleCache={};return P._compile(z.compile(A,K),P.filename)};z.eval=function(A,K){d.dirname(K.fileName);return eval(z.compile(A,K))};e=new x;r.lexer={lex:function(){var A;A=this.tokens[this.pos]||[""];this.pos+=1;this.yylineno=A[2];this.yytext=A[1];return A[0]},setInput:function(A){this.tokens=A;return this.pos=
0},upcomingInput:function(){return""}};r.yy=T("./nodes")}).call(this)});T["./browser"]=new (function(){(function(){var z,x;z=T("./coffee-script");z.eval=function(c,j){return eval(z.compile(c,j))};z.run=function(c,j){return Function(z.compile(c,j))()};if(!(typeof window!=="undefined"&&window!==null))return null;z.load=function(c,j){var h;h=new (window.ActiveXObject||XMLHttpRequest)("Microsoft.XMLHTTP");h.open("GET",c,true);"overrideMimeType"in h&&h.overrideMimeType("text/plain");h.onreadystatechange= 0},upcomingInput:function(){return""}};r.yy=T("./nodes")}).call(this)});T["./browser"]=new (function(){(function(){var z,x;z=T("./coffee-script");z.eval=function(c,j){return eval(z.compile(c,j))};z.run=function(c,j){return Function(z.compile(c,j))()};if(!(typeof window!=="undefined"&&window!==null))return null;z.load=function(c,j){var h;h=new (window.ActiveXObject||XMLHttpRequest)("Microsoft.XMLHTTP");h.open("GET",c,true);"overrideMimeType"in h&&h.overrideMimeType("text/plain");h.onreadystatechange=
function(){if(h.readyState===4)return z.run(h.responseText,j)};return h.send(null)};x=function(){var c,j,h;h=document.getElementsByTagName("script");c=0;for(j=h.length;c<j;c++)(function(){var e=h[c];return e.type==="text/coffeescript"?e.src?z.load(e.src):setTimeout(function(){return z.run(e.innerHTML)}):null})();return null};window.addEventListener?addEventListener("DOMContentLoaded",x,false):attachEvent("onload",x)}).call(this)});return T["./coffee-script"]}(); function(){if(h.readyState===4)return z.run(h.responseText,j)};return h.send(null)};x=function(){var c,j,h;h=document.getElementsByTagName("script");c=0;for(j=h.length;c<j;c++)(function(){var e=h[c];return e.type==="text/coffeescript"?e.src?z.load(e.src):setTimeout(function(){return z.run(e.innerHTML)}):null})();return null};window.addEventListener?addEventListener("DOMContentLoaded",x,false):attachEvent("onload",x)}).call(this)});return T["./coffee-script"]}();

View file

@ -111,7 +111,7 @@
<p> <p>
<b>Latest Version:</b> <b>Latest Version:</b>
<a href="http://github.com/jashkenas/coffee-script/tarball/0.9.3">0.9.3</a> <a href="http://github.com/jashkenas/coffee-script/tarball/0.9.4">0.9.4</a>
</p> </p>
<h2> <h2>
@ -136,8 +136,8 @@ list <span class="Keyword">=</span> [<span class="Number">1</span>, <span class=
<span class="Comment"><span class="Comment">#</span> Objects:</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 root: Math.sqrt
square<span class="Keyword">:</span> square square: 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
<span class="Comment"><span class="Comment">#</span> Splats:</span> <span class="Comment"><span class="Comment">#</span> Splats:</span>
@ -149,7 +149,7 @@ alert <span class="String"><span class="String">&quot;</span>I knew it!<span cla
<span class="Comment"><span class="Comment">#</span> Array comprehensions:</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; </pre><pre class="idle"><span class="Storage">var</span> _i, _len, _ref, _result, 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; <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>; number <span class="Keyword">=</span> <span class="Number">42</span>;
opposite <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>; opposite <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>;
@ -176,14 +176,14 @@ math <span class="Keyword">=</span> {
<span class="LibraryFunction">alert</span>(<span class="String"><span class="String">&quot;</span>I knew it!<span class="String">&quot;</span></span>); <span class="LibraryFunction">alert</span>(<span class="String"><span class="String">&quot;</span>I knew it!<span class="String">&quot;</span></span>);
} }
cubes <span class="Keyword">=</span> (<span class="Storage">function</span>() { cubes <span class="Keyword">=</span> (<span class="Storage">function</span>() {
_a <span class="Keyword">=</span> []; _c <span class="Keyword">=</span> list; _result <span class="Keyword">=</span> []; _ref <span class="Keyword">=</span> list;
<span class="Keyword">for</span> (_b <span class="Keyword">=</span> <span class="Number">0</span>, _d <span class="Keyword">=</span> _c.<span class="LibraryConstant">length</span>; _b <span class="Keyword">&lt;</span> _d; _b<span class="Keyword">++</span>) { <span class="Keyword">for</span> (_i <span class="Keyword">=</span> <span class="Number">0</span>, _len <span class="Keyword">=</span> _ref.<span class="LibraryConstant">length</span>; _i <span class="Keyword">&lt;</span> _len; _i<span class="Keyword">++</span>) {
num <span class="Keyword">=</span> _c[_b]; num <span class="Keyword">=</span> _ref[_i];
_a.<span class="LibraryFunction">push</span>(math.cube(num)); _result.<span class="LibraryFunction">push</span>(math.cube(num));
} }
<span class="Keyword">return</span> _a; <span class="Keyword">return</span> _result;
})(); })();
</pre><button onclick='javascript: var _a, _b, _c, _d, cubes, list, math, num, number, opposite, race, square; </pre><button onclick='javascript: var _i, _len, _ref, _result, cubes, list, math, num, number, opposite, race, square;
var __slice = Array.prototype.slice; var __slice = Array.prototype.slice;
number = 42; number = 42;
opposite = true; opposite = true;
@ -210,12 +210,12 @@ if (typeof elvis !== "undefined" && elvis !== null) {
alert("I knew it!"); alert("I knew it!");
} }
cubes = (function() { cubes = (function() {
_a = []; _c = list; _result = []; _ref = list;
for (_b = 0, _d = _c.length; _b < _d; _b++) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
num = _c[_b]; num = _ref[_i];
_a.push(math.cube(num)); _result.push(math.cube(num));
} }
return _a; return _result;
})();;alert(cubes);'>run: cubes</button><br class='clear' /></div> })();;alert(cubes);'>run: cubes</button><br class='clear' /></div>
<p> <p>
@ -251,7 +251,7 @@ cubes = (function() {
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.9.3">0.9.3</a>. release: <a href="http://github.com/jashkenas/coffee-script/tarball/0.9.4">0.9.4</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>
@ -467,7 +467,7 @@ cube = function(x) {
</p> </p>
<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>] <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>]
singers <span class="Keyword">=</span> {Jagger<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Rock<span class="String">&quot;</span></span>, Elvis<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Roll<span class="String">&quot;</span></span>} singers <span class="Keyword">=</span> {Jagger: <span class="String"><span class="String">&quot;</span>Rock<span class="String">&quot;</span></span>, Elvis: <span class="String"><span class="String">&quot;</span>Roll<span class="String">&quot;</span></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">1</span>, <span class="Number">0</span>, <span class="Number">1</span>
@ -476,12 +476,12 @@ matrix <span class="Keyword">=</span> [
] ]
kids <span class="Keyword">=</span> kids <span class="Keyword">=</span>
brother<span class="Keyword">:</span> brother:
name<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Max<span class="String">&quot;</span></span> name: <span class="String"><span class="String">&quot;</span>Max<span class="String">&quot;</span></span>
age<span class="Keyword">:</span> <span class="Number">11</span> age: <span class="Number">11</span>
sister<span class="Keyword">:</span> sister:
name<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Ida<span class="String">&quot;</span></span> name: <span class="String"><span class="String">&quot;</span>Ida<span class="String">&quot;</span></span>
age<span class="Keyword">:</span> <span class="Number">9</span> age: <span class="Number">9</span>
</pre><pre class="idle"><span class="Storage">var</span> kids, matrix, singers, song; </pre><pre class="idle"><span class="Storage">var</span> kids, matrix, singers, song;
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>]; 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>];
singers <span class="Keyword">=</span> { singers <span class="Keyword">=</span> {
@ -521,7 +521,7 @@ kids = {
of an object, without quoting them as strings. CoffeeScript notices and quotes 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). them for you, so you don't have to worry about it (say, when using jQuery).
</p> </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="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({ </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">&quot;</span>class<span class="String">&quot;</span></span>: <span class="String"><span class="String">'</span>active<span class="String">'</span></span> <span class="String"><span class="String">&quot;</span>class<span class="String">&quot;</span></span>: <span class="String"><span class="String">'</span>active<span class="String">'</span></span>
}); });
@ -609,7 +609,7 @@ inner = changeNumbers();;alert(inner);'>run: inner</button><br class='clear' /><
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">or=</span> defaults options or<span class="Keyword">=</span> defaults
</pre><pre class="idle"><span class="Storage">var</span> date, mood, options; </pre><pre class="idle"><span class="Storage">var</span> date, mood, options;
<span class="Keyword">if</span> (singing) { <span class="Keyword">if</span> (singing) {
mood <span class="Keyword">=</span> greatlyImproved; mood <span class="Keyword">=</span> greatlyImproved;
@ -772,7 +772,7 @@ 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> 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> _result, lyrics, num;
<span class="Keyword">if</span> (<span class="Variable">this</span>.studyingEconomics) { <span class="Keyword">if</span> (<span class="Variable">this</span>.studyingEconomics) {
<span class="Keyword">while</span> (supply <span class="Keyword">&gt;</span> demand) { <span class="Keyword">while</span> (supply <span class="Keyword">&gt;</span> demand) {
buy(); buy();
@ -783,14 +783,14 @@ lyrics <span class="Keyword">=</span> <span class="Keyword">while</span> num <sp
} }
num <span class="Keyword">=</span> <span class="Number">6</span>; num <span class="Keyword">=</span> <span class="Number">6</span>;
lyrics <span class="Keyword">=</span> (<span class="Storage">function</span>() { lyrics <span class="Keyword">=</span> (<span class="Storage">function</span>() {
_a <span class="Keyword">=</span> []; _result <span class="Keyword">=</span> [];
<span class="Keyword">while</span> (num <span class="Keyword">-</span><span class="Keyword">=</span> <span class="Number">1</span>) { <span class="Keyword">while</span> (num <span class="Keyword">-</span><span class="Keyword">=</span> <span class="Number">1</span>) {
_a.<span class="LibraryFunction">push</span>(num <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> little monkeys, jumping on the bed.\</span> _result.<span class="LibraryFunction">push</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>);
} }
<span class="Keyword">return</span> _a; <span class="Keyword">return</span> _result;
})(); })();
</pre><button onclick='javascript: var _a, lyrics, num; </pre><button onclick='javascript: var _result, lyrics, num;
if (this.studyingEconomics) { if (this.studyingEconomics) {
while (supply > demand) { while (supply > demand) {
buy(); buy();
@ -801,12 +801,12 @@ if (this.studyingEconomics) {
} }
num = 6; num = 6;
lyrics = (function() { lyrics = (function() {
_a = []; _result = [];
while (num -= 1) { while (num -= 1) {
_a.push(num + " little monkeys, jumping on the bed.\ _result.push(num + " little monkeys, jumping on the bed.\
One fell out and bumped his head."); One fell out and bumped his head.");
} }
return _a; return _result;
})();;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> <p>
For readability, the <b>until</b> keyword is equivalent to <tt>while not</tt>, For readability, the <b>until</b> keyword is equivalent to <tt>while not</tt>,
@ -834,21 +834,21 @@ lunch <span class="Keyword">=</span> eat food <span class="Keyword">for</span> f
<span class="Keyword">for</span> roid <span class="Keyword">in</span> asteroids <span class="Keyword">for</span> roid <span class="Keyword">in</span> asteroids
<span class="Keyword">for</span> roid2 <span class="Keyword">in</span> asteroids <span class="Keyword">when</span> roid <span class="Keyword">isnt</span> roid2 <span class="Keyword">for</span> roid2 <span class="Keyword">in</span> asteroids <span class="Keyword">when</span> roid <span class="Keyword">isnt</span> roid2
roid.explode() <span class="Keyword">if</span> roid.overlaps roid2 roid.explode() <span class="Keyword">if</span> roid.overlaps roid2
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, food, lunch, roid, roid2; </pre><pre class="idle"><span class="Storage">var</span> _i, _j, _len, _len2, _ref, _ref2, _result, food, lunch, roid, roid2;
lunch <span class="Keyword">=</span> (<span class="Storage">function</span>() { lunch <span class="Keyword">=</span> (<span class="Storage">function</span>() {
_a <span class="Keyword">=</span> []; _c <span class="Keyword">=</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>]; _result <span class="Keyword">=</span> []; _ref <span class="Keyword">=</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="Keyword">for</span> (_b <span class="Keyword">=</span> <span class="Number">0</span>, _d <span class="Keyword">=</span> _c.<span class="LibraryConstant">length</span>; _b <span class="Keyword">&lt;</span> _d; _b<span class="Keyword">++</span>) { <span class="Keyword">for</span> (_i <span class="Keyword">=</span> <span class="Number">0</span>, _len <span class="Keyword">=</span> _ref.<span class="LibraryConstant">length</span>; _i <span class="Keyword">&lt;</span> _len; _i<span class="Keyword">++</span>) {
food <span class="Keyword">=</span> _c[_b]; food <span class="Keyword">=</span> _ref[_i];
_a.<span class="LibraryFunction">push</span>(eat(food)); _result.<span class="LibraryFunction">push</span>(eat(food));
} }
<span class="Keyword">return</span> _a; <span class="Keyword">return</span> _result;
})(); })();
_f <span class="Keyword">=</span> asteroids; _ref <span class="Keyword">=</span> asteroids;
<span class="Keyword">for</span> (_e <span class="Keyword">=</span> <span class="Number">0</span>, _g <span class="Keyword">=</span> _f.<span class="LibraryConstant">length</span>; _e <span class="Keyword">&lt;</span> _g; _e<span class="Keyword">++</span>) { <span class="Keyword">for</span> (_i <span class="Keyword">=</span> <span class="Number">0</span>, _len <span class="Keyword">=</span> _ref.<span class="LibraryConstant">length</span>; _i <span class="Keyword">&lt;</span> _len; _i<span class="Keyword">++</span>) {
roid <span class="Keyword">=</span> _f[_e]; roid <span class="Keyword">=</span> _ref[_i];
_i <span class="Keyword">=</span> asteroids; _ref2 <span class="Keyword">=</span> asteroids;
<span class="Keyword">for</span> (_h <span class="Keyword">=</span> <span class="Number">0</span>, _j <span class="Keyword">=</span> _i.<span class="LibraryConstant">length</span>; _h <span class="Keyword">&lt;</span> _j; _h<span class="Keyword">++</span>) { <span class="Keyword">for</span> (_j <span class="Keyword">=</span> <span class="Number">0</span>, _len2 <span class="Keyword">=</span> _ref2.<span class="LibraryConstant">length</span>; _j <span class="Keyword">&lt;</span> _len2; _j<span class="Keyword">++</span>) {
roid2 <span class="Keyword">=</span> _i[_h]; roid2 <span class="Keyword">=</span> _ref2[_j];
<span class="Keyword">if</span> (roid <span class="Keyword">!</span><span class="Keyword">==</span> roid2) { <span class="Keyword">if</span> (roid <span class="Keyword">!</span><span class="Keyword">==</span> roid2) {
<span class="Keyword">if</span> (roid.overlaps(roid2)) { <span class="Keyword">if</span> (roid.overlaps(roid2)) {
roid.explode(); roid.explode();
@ -868,54 +868,54 @@ _f <span class="Keyword">=</span> asteroids;
<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>
dozen <span class="Keyword">=</span> eggs[i...i<span class="Keyword">+</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 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; </pre><pre class="idle"><span class="Storage">var</span> _result, countdown, deliverEggs, num;
countdown <span class="Keyword">=</span> (<span class="Storage">function</span>() { countdown <span class="Keyword">=</span> (<span class="Storage">function</span>() {
_a <span class="Keyword">=</span> []; _result <span class="Keyword">=</span> [];
<span class="Keyword">for</span> (num <span class="Keyword">=</span> <span class="Number">10</span>; num <span class="Keyword">&gt;=</span> <span class="Number">1</span>; num<span class="Keyword">--</span>) { <span class="Keyword">for</span> (num <span class="Keyword">=</span> <span class="Number">10</span>; num <span class="Keyword">&gt;=</span> <span class="Number">1</span>; num<span class="Keyword">--</span>) {
_a.<span class="LibraryFunction">push</span>(num); _result.<span class="LibraryFunction">push</span>(num);
} }
<span class="Keyword">return</span> _a; <span class="Keyword">return</span> _result;
})(); })();
<span class="FunctionName">deliverEggs</span> = <span class="Storage">function</span>() { <span class="FunctionName">deliverEggs</span> = <span class="Storage">function</span>() {
<span class="Storage">var</span> _b, _c, dozen, i; <span class="Storage">var</span> _ref, _result2, dozen, i;
_b <span class="Keyword">=</span> []; _c <span class="Keyword">=</span> eggs.<span class="LibraryConstant">length</span>; _result2 <span class="Keyword">=</span> []; _ref <span class="Keyword">=</span> eggs.<span class="LibraryConstant">length</span>;
<span class="Keyword">for</span> (i <span class="Keyword">=</span> <span class="Number">0</span>; (<span class="Number">0</span> <span class="Keyword">&lt;=</span> _c ? i <span class="Keyword">&lt;</span> _c : i <span class="Keyword">&gt;</span> _c); i <span class="Keyword">+</span><span class="Keyword">=</span> <span class="Number">12</span>) { <span class="Keyword">for</span> (i <span class="Keyword">=</span> <span class="Number">0</span>; (<span class="Number">0</span> <span class="Keyword">&lt;=</span> _ref ? i <span class="Keyword">&lt;</span> _ref : i <span class="Keyword">&gt;</span> _ref); i <span class="Keyword">+</span><span class="Keyword">=</span> <span class="Number">12</span>) {
_b.<span class="LibraryFunction">push</span>((<span class="Storage">function</span>() { _result2.<span class="LibraryFunction">push</span>((<span class="Storage">function</span>() {
dozen <span class="Keyword">=</span> eggs.<span class="LibraryFunction">slice</span>(i, i <span class="Keyword">+</span> <span class="Number">12</span>); dozen <span class="Keyword">=</span> eggs.<span class="LibraryFunction">slice</span>(i, i <span class="Keyword">+</span> <span class="Number">12</span>);
<span class="Keyword">return</span> deliver(<span class="Keyword">new</span> <span class="TypeName">eggCarton</span>(dozen)); <span class="Keyword">return</span> deliver(<span class="Keyword">new</span> <span class="TypeName">eggCarton</span>(dozen));
})()); })());
} }
<span class="Keyword">return</span> _b; <span class="Keyword">return</span> _result2;
}; };
</pre><button onclick='javascript: var _a, countdown, deliverEggs, num; </pre><button onclick='javascript: var _result, countdown, deliverEggs, num;
countdown = (function() { countdown = (function() {
_a = []; _result = [];
for (num = 10; num >= 1; num--) { for (num = 10; num >= 1; num--) {
_a.push(num); _result.push(num);
} }
return _a; return _result;
})(); })();
deliverEggs = function() { deliverEggs = function() {
var _b, _c, dozen, i; var _ref, _result2, dozen, i;
_b = []; _c = eggs.length; _result2 = []; _ref = eggs.length;
for (i = 0; (0 <= _c ? i < _c : i > _c); i += 12) { for (i = 0; (0 <= _ref ? i < _ref : i > _ref); i += 12) {
_b.push((function() { _result2.push((function() {
dozen = eggs.slice(i, i + 12); dozen = eggs.slice(i, i + 12);
return deliver(new eggCarton(dozen)); return deliver(new eggCarton(dozen));
})()); })());
} }
return _b; return _result2;
};;alert(countdown);'>run: countdown</button><br class='clear' /></div> };;alert(countdown);'>run: countdown</button><br class='clear' /></div>
<p> <p>
Comprehensions can also be used to iterate over the keys and values in 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. 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">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="Number">10</span>, ida: <span class="Number">9</span>, tim: <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">&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, yearsOld; </pre><pre class="idle"><span class="Storage">var</span> _ref, _result, 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; <span class="Storage">var</span> __hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty;
yearsOld <span class="Keyword">=</span> { yearsOld <span class="Keyword">=</span> {
max: <span class="Number">10</span>, max: <span class="Number">10</span>,
@ -923,15 +923,15 @@ yearsOld <span class="Keyword">=</span> {
tim: <span class="Number">11</span> tim: <span class="Number">11</span>
}; };
ages <span class="Keyword">=</span> (<span class="Storage">function</span>() { ages <span class="Keyword">=</span> (<span class="Storage">function</span>() {
_a <span class="Keyword">=</span> []; _b <span class="Keyword">=</span> yearsOld; _result <span class="Keyword">=</span> []; _ref <span class="Keyword">=</span> yearsOld;
<span class="Keyword">for</span> (child <span class="Keyword">in</span> _b) { <span class="Keyword">for</span> (child <span class="Keyword">in</span> _ref) {
<span class="Keyword">if</span> (<span class="Keyword">!</span>__hasProp.<span class="LibraryFunction">call</span>(_b, child)) <span class="Keyword">continue</span>; <span class="Keyword">if</span> (<span class="Keyword">!</span>__hasProp.<span class="LibraryFunction">call</span>(_ref, child)) <span class="Keyword">continue</span>;
age <span class="Keyword">=</span> _b[child]; age <span class="Keyword">=</span> _ref[child];
_a.<span class="LibraryFunction">push</span>(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); _result.<span class="LibraryFunction">push</span>(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);
} }
<span class="Keyword">return</span> _a; <span class="Keyword">return</span> _result;
})(); })();
</pre><button onclick='javascript: var _a, _b, age, ages, child, yearsOld; </pre><button onclick='javascript: var _ref, _result, age, ages, child, yearsOld;
var __hasProp = Object.prototype.hasOwnProperty; var __hasProp = Object.prototype.hasOwnProperty;
yearsOld = { yearsOld = {
max: 10, max: 10,
@ -939,13 +939,13 @@ yearsOld = {
tim: 11 tim: 11
}; };
ages = (function() { ages = (function() {
_a = []; _b = yearsOld; _result = []; _ref = yearsOld;
for (child in _b) { for (child in _ref) {
if (!__hasProp.call(_b, child)) continue; if (!__hasProp.call(_ref, child)) continue;
age = _b[child]; age = _ref[child];
_a.push(child + " is " + age); _result.push(child + " is " + age);
} }
return _a; return _result;
})();;alert(ages.join(", "));'>run: ages.join(", ")</button><br class='clear' /></div> })();;alert(ages.join(", "));'>run: ages.join(", ")</button><br class='clear' /></div>
<p> <p>
By default, object comprehensions are safe, and use a <tt>hasOwnProperty</tt> By default, object comprehensions are safe, and use a <tt>hasOwnProperty</tt>
@ -1059,27 +1059,27 @@ six = (one = 1) + (two = 2) + (three = 3);;alert(six);'>run: six</button><br cla
<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>
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>] 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; </pre><pre class="idle"><span class="Storage">var</span> _i, _ref, _result, 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;
globals <span class="Keyword">=</span> (<span class="Storage">function</span>() { globals <span class="Keyword">=</span> (<span class="Storage">function</span>() {
_b <span class="Keyword">=</span> []; _c <span class="Keyword">=</span> <span class="LibraryClassType">window</span>; _result <span class="Keyword">=</span> []; _ref <span class="Keyword">=</span> <span class="LibraryClassType">window</span>;
<span class="Keyword">for</span> (name <span class="Keyword">in</span> _c) { <span class="Keyword">for</span> (name <span class="Keyword">in</span> _ref) {
<span class="Keyword">if</span> (<span class="Keyword">!</span>__hasProp.<span class="LibraryFunction">call</span>(_c, name)) <span class="Keyword">continue</span>; <span class="Keyword">if</span> (<span class="Keyword">!</span>__hasProp.<span class="LibraryFunction">call</span>(_ref, name)) <span class="Keyword">continue</span>;
_a <span class="Keyword">=</span> _c[name]; _i <span class="Keyword">=</span> _ref[name];
_b.<span class="LibraryFunction">push</span>(name); _result.<span class="LibraryFunction">push</span>(name);
} }
<span class="Keyword">return</span> _b; <span class="Keyword">return</span> _result;
})().<span class="LibraryFunction">slice</span>(<span class="Number">0</span>, <span class="Number">10</span>); })().<span class="LibraryFunction">slice</span>(<span class="Number">0</span>, <span class="Number">10</span>);
</pre><button onclick='javascript: var _a, _b, _c, globals, name; </pre><button onclick='javascript: var _i, _ref, _result, globals, name;
var __hasProp = Object.prototype.hasOwnProperty; var __hasProp = Object.prototype.hasOwnProperty;
globals = (function() { globals = (function() {
_b = []; _c = window; _result = []; _ref = window;
for (name in _c) { for (name in _ref) {
if (!__hasProp.call(_c, name)) continue; if (!__hasProp.call(_ref, name)) continue;
_a = _c[name]; _i = _ref[name];
_b.push(name); _result.push(name);
} }
return _b; return _result;
})().slice(0, 10);;alert(globals);'>run: globals</button><br class='clear' /></div> })().slice(0, 10);;alert(globals);'>run: globals</button><br class='clear' /></div>
<p> <p>
As well as silly things, like passing a <b>try/catch</b> statement directly As well as silly things, like passing a <b>try/catch</b> statement directly
@ -1152,8 +1152,8 @@ speed = (typeof speed !== "undefined" && speed !== null) ? speed : 140;;alert(sp
the <b>TypeError</b> that would be raised otherwise. the <b>TypeError</b> that would be raised otherwise.
</p> </p>
<div class='code'><pre class="idle">lottery.drawWinner()<span class="Keyword">?</span>.address<span class="Keyword">?</span>.zipcode <div class='code'><pre class="idle">lottery.drawWinner()<span class="Keyword">?</span>.address<span class="Keyword">?</span>.zipcode
</pre><pre class="idle"><span class="Storage">var</span> _a, _b; </pre><pre class="idle"><span class="Storage">var</span> _ref, _ref2;
(<span class="Keyword">typeof</span> (_b <span class="Keyword">=</span> ((_a <span class="Keyword">=</span> lottery.drawWinner()))) <span class="Keyword">===</span> <span class="String"><span class="String">&quot;</span>undefined<span class="String">&quot;</span></span> <span class="Keyword">||</span> _b <span class="Keyword">===</span> <span class="BuiltInConstant">null</span>) ? undefined : _b.address <span class="Keyword">==</span> <span class="BuiltInConstant">null</span> ? undefined : _b.address.zipcode; (<span class="Keyword">typeof</span> (_ref2 <span class="Keyword">=</span> ((_ref <span class="Keyword">=</span> lottery.drawWinner()))) <span class="Keyword">===</span> <span class="String"><span class="String">&quot;</span>undefined<span class="String">&quot;</span></span> <span class="Keyword">||</span> _ref2 <span class="Keyword">===</span> <span class="BuiltInConstant">null</span>) ? undefined : _ref2.address <span class="Keyword">==</span> <span class="BuiltInConstant">null</span> ? undefined : _ref2.address.zipcode;
</pre><br class='clear' /></div> </pre><br class='clear' /></div>
<p> <p>
Soaking up nulls is similar to Ruby's Soaking up nulls is similar to Ruby's
@ -1217,8 +1217,8 @@ tom.move()
<span class="Keyword">if</span> (<span class="Keyword">typeof</span> parent.extended <span class="Keyword">===</span> <span class="String"><span class="String">&quot;</span>function<span class="String">&quot;</span></span>) parent.extended(child); <span class="Keyword">if</span> (<span class="Keyword">typeof</span> parent.extended <span class="Keyword">===</span> <span class="String"><span class="String">&quot;</span>function<span class="String">&quot;</span></span>) parent.extended(child);
child.__super__ <span class="Keyword">=</span> parent.<span class="LibraryConstant">prototype</span>; child.__super__ <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="FunctionName">Animal</span> = <span class="Storage">function</span>(<span class="FunctionArgument">_arg</span>) {
<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> _a; <span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> _arg;
<span class="Keyword">return</span> <span class="Variable">this</span>; <span class="Keyword">return</span> <span class="Variable">this</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="LibraryClassType">Animal</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>(<span class="FunctionArgument">meters</span>) {
@ -1253,8 +1253,8 @@ var __extends = function(child, parent) {
if (typeof parent.extended === "function") parent.extended(child); if (typeof parent.extended === "function") parent.extended(child);
child.__super__ = parent.prototype; child.__super__ = parent.prototype;
}; };
Animal = function(_a) { Animal = function(_arg) {
this.name = _a; this.name = _arg;
return this; return this;
}; };
Animal.prototype.move = function(meters) { Animal.prototype.move = function(meters) {
@ -1315,18 +1315,18 @@ tom.move();;'>run</button><br class='clear' /></div>
theSwitch <span class="Keyword">=</span> <span class="Number">0</span> theSwitch <span class="Keyword">=</span> <span class="Number">0</span>
<span class="Keyword">[</span>theBait, theSwitch<span class="Keyword">] =</span> [theSwitch, theBait] <span class="Keyword">[</span>theBait, theSwitch<span class="Keyword">] =</span> [theSwitch, theBait]
</pre><pre class="idle"><span class="Storage">var</span> _a, theBait, theSwitch; </pre><pre class="idle"><span class="Storage">var</span> _ref, theBait, theSwitch;
theBait <span class="Keyword">=</span> <span class="Number">1000</span>; theBait <span class="Keyword">=</span> <span class="Number">1000</span>;
theSwitch <span class="Keyword">=</span> <span class="Number">0</span>; theSwitch <span class="Keyword">=</span> <span class="Number">0</span>;
_a <span class="Keyword">=</span> [theSwitch, theBait]; _ref <span class="Keyword">=</span> [theSwitch, theBait];
theBait <span class="Keyword">=</span> _a[<span class="Number">0</span>]; theBait <span class="Keyword">=</span> _ref[<span class="Number">0</span>];
theSwitch <span class="Keyword">=</span> _a[<span class="Number">1</span>]; theSwitch <span class="Keyword">=</span> _ref[<span class="Number">1</span>];
</pre><button onclick='javascript: var _a, theBait, theSwitch; </pre><button onclick='javascript: var _ref, theBait, theSwitch;
theBait = 1000; theBait = 1000;
theSwitch = 0; theSwitch = 0;
_a = [theSwitch, theBait]; _ref = [theSwitch, theBait];
theBait = _a[0]; theBait = _ref[0];
theSwitch = _a[1];;alert(theBait);'>run: theBait</button><br class='clear' /></div> theSwitch = _ref[1];;alert(theBait);'>run: theBait</button><br class='clear' /></div>
<p> <p>
But it's also helpful for dealing with functions that return multiple But it's also helpful for dealing with functions that return multiple
values. values.
@ -1336,38 +1336,38 @@ theSwitch = _a[1];;alert(theBait);'>run: theBait</button><br class='clear' /></d
[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>]
<span class="Keyword">[</span>city, temp, forecast<span class="Keyword">] =</span> weatherReport <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> weatherReport <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, weatherReport; </pre><pre class="idle"><span class="Storage">var</span> _ref, city, forecast, temp, weatherReport;
<span class="FunctionName">weatherReport</span> = <span class="Storage">function</span>(<span class="FunctionArgument">location</span>) { <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">&quot;</span>Mostly Sunny<span class="String">&quot;</span></span>]; <span class="Keyword">return</span> [location, <span class="Number">72</span>, <span class="String"><span class="String">&quot;</span>Mostly Sunny<span class="String">&quot;</span></span>];
}; };
_a <span class="Keyword">=</span> weatherReport(<span class="String"><span class="String">&quot;</span>Berkeley, CA<span class="String">&quot;</span></span>); _ref <span class="Keyword">=</span> weatherReport(<span class="String"><span class="String">&quot;</span>Berkeley, CA<span class="String">&quot;</span></span>);
city <span class="Keyword">=</span> _a[<span class="Number">0</span>]; city <span class="Keyword">=</span> _ref[<span class="Number">0</span>];
temp <span class="Keyword">=</span> _a[<span class="Number">1</span>]; temp <span class="Keyword">=</span> _ref[<span class="Number">1</span>];
forecast <span class="Keyword">=</span> _a[<span class="Number">2</span>]; forecast <span class="Keyword">=</span> _ref[<span class="Number">2</span>];
</pre><button onclick='javascript: var _a, city, forecast, temp, weatherReport; </pre><button onclick='javascript: var _ref, city, forecast, temp, weatherReport;
weatherReport = function(location) { weatherReport = function(location) {
return [location, 72, "Mostly Sunny"]; return [location, 72, "Mostly Sunny"];
}; };
_a = weatherReport("Berkeley, CA"); _ref = weatherReport("Berkeley, CA");
city = _a[0]; city = _ref[0];
temp = _a[1]; temp = _ref[1];
forecast = _a[2];;alert(forecast);'>run: forecast</button><br class='clear' /></div> forecast = _ref[2];;alert(forecast);'>run: forecast</button><br class='clear' /></div>
<p> <p>
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">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">&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>
painter<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>Vladimir Burliuk<span class="String">&quot;</span></span> painter: <span class="String"><span class="String">&quot;</span>Vladimir Burliuk<span class="String">&quot;</span></span>
poet<span class="Keyword">:</span> poet:
name<span class="Keyword">:</span> <span class="String"><span class="String">&quot;</span>F.T. Marinetti<span class="String">&quot;</span></span> name: <span class="String"><span class="String">&quot;</span>F.T. Marinetti<span class="String">&quot;</span></span>
address<span class="Keyword">:</span> [ address: [
<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>
] ]
{poet<span class="Keyword">:</span> {name, address<span class="Keyword">:</span> [street, city]}} <span class="Keyword">=</span> futurists {poet: {name, address: [street, city]}} <span class="Keyword">=</span> futurists
</pre><pre class="idle"><span class="Storage">var</span> _a, _b, _c, city, futurists, name, street; </pre><pre class="idle"><span class="Storage">var</span> _ref, _ref2, _ref3, city, futurists, name, 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>,
painter: <span class="String"><span class="String">&quot;</span>Vladimir Burliuk<span class="String">&quot;</span></span>, painter: <span class="String"><span class="String">&quot;</span>Vladimir Burliuk<span class="String">&quot;</span></span>,
@ -1376,13 +1376,13 @@ futurists <span class="Keyword">=</span> {
address: [<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>] address: [<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>]
} }
}; };
_a <span class="Keyword">=</span> futurists; _ref <span class="Keyword">=</span> futurists;
_b <span class="Keyword">=</span> _a.poet; _ref2 <span class="Keyword">=</span> _ref.poet;
name <span class="Keyword">=</span> _b.<span class="LibraryConstant">name</span>; name <span class="Keyword">=</span> _ref2.<span class="LibraryConstant">name</span>;
_c <span class="Keyword">=</span> _b.address; _ref3 <span class="Keyword">=</span> _ref2.address;
street <span class="Keyword">=</span> _c[<span class="Number">0</span>]; street <span class="Keyword">=</span> _ref3[<span class="Number">0</span>];
city <span class="Keyword">=</span> _c[<span class="Number">1</span>]; city <span class="Keyword">=</span> _ref3[<span class="Number">1</span>];
</pre><button onclick='javascript: var _a, _b, _c, city, futurists, name, street; </pre><button onclick='javascript: var _ref, _ref2, _ref3, city, futurists, name, street;
futurists = { futurists = {
sculptor: "Umberto Boccioni", sculptor: "Umberto Boccioni",
painter: "Vladimir Burliuk", painter: "Vladimir Burliuk",
@ -1391,12 +1391,12 @@ futurists = {
address: ["Via Roma 42R", "Bellagio, Italy 22021"] address: ["Via Roma 42R", "Bellagio, Italy 22021"]
} }
}; };
_a = futurists; _ref = futurists;
_b = _a.poet; _ref2 = _ref.poet;
name = _b.name; name = _ref2.name;
_c = _b.address; _ref3 = _ref2.address;
street = _c[0]; street = _ref3[0];
city = _c[1];;alert(name + " — " + street);'>run: name + " — " + street</button><br class='clear' /></div> city = _ref3[1];;alert(name + " — " + street);'>run: name + " — " + street</button><br class='clear' /></div>
<p> <p>
Pattern matching can even be combined with splats. Pattern matching can even be combined with splats.
</p> </p>
@ -1407,20 +1407,20 @@ city = _c[1];;alert(name + " — " + street);'>run: name + " — " + street</but
</pre><pre class="idle"><span class="Storage">var</span> _a, close, contents, open, tag; </pre><pre class="idle"><span class="Storage">var</span> _ref, close, contents, open, tag;
<span class="Storage">var</span> __slice <span class="Keyword">=</span> <span class="LibraryClassType">Array</span>.<span class="LibraryConstant">prototype</span>.slice; <span class="Storage">var</span> __slice <span class="Keyword">=</span> <span class="LibraryClassType">Array</span>.<span class="LibraryConstant">prototype</span>.slice;
tag <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>&lt;impossible&gt;<span class="String">&quot;</span></span>; tag <span class="Keyword">=</span> <span class="String"><span class="String">&quot;</span>&lt;impossible&gt;<span class="String">&quot;</span></span>;
_a <span class="Keyword">=</span> tag.<span class="LibraryFunction">split</span>(<span class="String"><span class="String">&quot;</span><span class="String">&quot;</span></span>); _ref <span class="Keyword">=</span> tag.<span class="LibraryFunction">split</span>(<span class="String"><span class="String">&quot;</span><span class="String">&quot;</span></span>);
open <span class="Keyword">=</span> _a[<span class="Number">0</span>]; open <span class="Keyword">=</span> _ref[<span class="Number">0</span>];
contents <span class="Keyword">=</span> __slice.<span class="LibraryFunction">call</span>(_a, <span class="Number">1</span>, _a.<span class="LibraryConstant">length</span> <span class="Keyword">-</span> <span class="Number">1</span>); contents <span class="Keyword">=</span> __slice.<span class="LibraryFunction">call</span>(_ref, <span class="Number">1</span>, _ref.<span class="LibraryConstant">length</span> <span class="Keyword">-</span> <span class="Number">1</span>);
close <span class="Keyword">=</span> _a[_a.<span class="LibraryConstant">length</span> <span class="Keyword">-</span> <span class="Number">1</span>]; close <span class="Keyword">=</span> _ref[_ref.<span class="LibraryConstant">length</span> <span class="Keyword">-</span> <span class="Number">1</span>];
</pre><button onclick='javascript: var _a, close, contents, open, tag; </pre><button onclick='javascript: var _ref, close, contents, open, tag;
var __slice = Array.prototype.slice; var __slice = Array.prototype.slice;
tag = "<impossible>"; tag = "<impossible>";
_a = tag.split(""); _ref = tag.split("");
open = _a[0]; open = _ref[0];
contents = __slice.call(_a, 1, _a.length - 1); contents = __slice.call(_ref, 1, _ref.length - 1);
close = _a[_a.length - 1];;alert(contents.join(""));'>run: contents.join("")</button><br class='clear' /></div> close = _ref[_ref.length - 1];;alert(contents.join(""));'>run: contents.join("")</button><br class='clear' /></div>
<p> <p>
<span id="fat_arrow" class="bookmark"></span> <span id="fat_arrow" class="bookmark"></span>
@ -1511,27 +1511,27 @@ hi = function() {
<span class="Keyword">when</span> <span class="String"><span class="String">&quot;</span>Sun<span class="String">&quot;</span></span> <span class="Keyword">then</span> go church <span class="Keyword">when</span> <span class="String"><span class="String">&quot;</span>Sun<span class="String">&quot;</span></span> <span class="Keyword">then</span> go church
<span class="Keyword">else</span> go work <span class="Keyword">else</span> go work
</pre><pre class="idle"><span class="Keyword">switch</span> (day) { </pre><pre class="idle"><span class="Keyword">switch</span> (day) {
<span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Mon<span class="String">&quot;</span></span>: <span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Mon<span class="String">&quot;</span></span>:
<span class="LibraryFunction">go</span>(work); <span class="LibraryFunction">go</span>(work);
<span class="Keyword">break</span>; <span class="Keyword">break</span>;
<span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Tue<span class="String">&quot;</span></span>: <span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Tue<span class="String">&quot;</span></span>:
<span class="LibraryFunction">go</span>(relax); <span class="LibraryFunction">go</span>(relax);
<span class="Keyword">break</span>; <span class="Keyword">break</span>;
<span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Thu<span class="String">&quot;</span></span>: <span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Thu<span class="String">&quot;</span></span>:
<span class="LibraryFunction">go</span>(iceFishing); <span class="LibraryFunction">go</span>(iceFishing);
<span class="Keyword">break</span>; <span class="Keyword">break</span>;
<span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Fri<span class="String">&quot;</span></span>: <span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Fri<span class="String">&quot;</span></span>:
<span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Sat<span class="String">&quot;</span></span>: <span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Sat<span class="String">&quot;</span></span>:
<span class="Keyword">if</span> (day <span class="Keyword">===</span> bingoDay) { <span class="Keyword">if</span> (day <span class="Keyword">===</span> bingoDay) {
<span class="LibraryFunction">go</span>(bingo); <span class="LibraryFunction">go</span>(bingo);
<span class="LibraryFunction">go</span>(dancing); <span class="LibraryFunction">go</span>(dancing);
} }
<span class="Keyword">break</span>; <span class="Keyword">break</span>;
<span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Sun<span class="String">&quot;</span></span>: <span class="Keyword">case</span> <span class="String"><span class="String">&quot;</span>Sun<span class="String">&quot;</span></span>:
<span class="LibraryFunction">go</span>(church); <span class="LibraryFunction">go</span>(church);
<span class="Keyword">break</span>; <span class="Keyword">break</span>;
<span class="Keyword">default</span>: <span class="Keyword">default</span>:
<span class="LibraryFunction">go</span>(work); <span class="LibraryFunction">go</span>(work);
} }
</pre><br class='clear' /></div> </pre><br class='clear' /></div>
@ -1662,10 +1662,11 @@ html <span class="Keyword">=</span> <span class="String"><span class="String">'<
are preserved in the generated code. are preserved in the generated code.
</p> </p>
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">###</span></span> <div class='code'><pre class="idle"><span class="Comment"><span class="Comment">###</span></span>
<span class="Comment">CoffeeScript Compiler v0.9.3</span> <span class="Comment">CoffeeScript Compiler v0.9.4</span>
<span class="Comment">Released under the MIT License</span> <span class="Comment">Released under the MIT License</span>
<span class="Comment">###</span> <span class="Comment">###</span>
</pre><pre class="idle"><span class="Comment"><span class="Comment">/*</span>CoffeeScript Compiler v0.9.3</span> </pre><pre class="idle"><span class="Comment"><span class="Comment">/*</span></span>
<span class="Comment">CoffeeScript Compiler v0.9.4</span>
<span class="Comment">Released under the MIT License</span> <span class="Comment">Released under the MIT License</span>
<span class="Comment"><span class="Comment">*/</span></span> <span class="Comment"><span class="Comment">*/</span></span>
</pre><br class='clear' /></div> </pre><br class='clear' /></div>
@ -1832,6 +1833,11 @@ task(<span class="String"><span class="String">'</span>build:parser<span class="
&mdash; a CoffeeScript compiler plug-in that allows you to include external &mdash; a CoffeeScript compiler plug-in that allows you to include external
source files. source files.
</li> </li>
<li>
<b>mauricemach</b>'s <a href="http://github.com/mauricemach/coffeekup">CoffeeKup</a>
&mdash; Markup as CoffeeScript. After _why's
<a href="http://markaby.github.com/">Markaby</a>.
</li>
<li> <li>
<b>jashkenas</b>'s <a href="http://jashkenas.github.com/docco/">Docco</a> <b>jashkenas</b>'s <a href="http://jashkenas.github.com/docco/">Docco</a>
&mdash; a quick-and-dirty literate-programming-style documentation generator &mdash; a quick-and-dirty literate-programming-style documentation generator
@ -1859,6 +1865,15 @@ task(<span class="String"><span class="String">'</span>build:parser<span class="
Change Log Change Log
</h2> </h2>
<p>
<b class="header" style="margin-top: 20px;">0.9.4</b>
CoffeeScript now uses appropriately-named temporary variables, and recycles
their references after use. Added <tt>require.extensions</tt> support for
<b>Node.js 0.3</b>. Loading CoffeeScript in the browser now adds just a
single <tt>CoffeeScript</tt> object to global scope.
Fixes for implicit object and block comment edge cases.
</p>
<p> <p>
<b class="header" style="margin-top: 20px;">0.9.3</b> <b class="header" style="margin-top: 20px;">0.9.3</b>
CoffeeScript <tt>switch</tt> statements now compile into JS <tt>switch</tt> CoffeeScript <tt>switch</tt> statements now compile into JS <tt>switch</tt>

View file

@ -18,7 +18,7 @@
return compile(content); return compile(content);
}); });
} }
exports.VERSION = '0.9.3'; exports.VERSION = '0.9.4';
exports.compile = (compile = function(code, options) { exports.compile = (compile = function(code, options) {
options || (options = {}); options || (options = {});
try { try {

View file

@ -421,15 +421,15 @@
return null; return null;
} }
switch (tok[0]) { switch (tok[0]) {
case 'IDENTIFIER': case 'IDENTIFIER':
tok[0] = 'PARAM'; tok[0] = 'PARAM';
break; break;
case ')': case ')':
tok[0] = 'PARAM_END'; tok[0] = 'PARAM_END';
break; break;
case '(': case '(':
case 'CALL_START': case 'CALL_START':
return (tok[0] = 'PARAM_START'); return (tok[0] = 'PARAM_START');
} }
} }
return true; return true;

View file

@ -1769,7 +1769,7 @@
}; };
SwitchNode.prototype.compileNode = function(o) { SwitchNode.prototype.compileNode = function(o) {
var _i, _j, _len, _len2, _ref2, _ref3, block, code, condition, conditions, exprs, idt, pair; var _i, _j, _len, _len2, _ref2, _ref3, block, code, condition, conditions, exprs, idt, pair;
idt = (o.indent = this.idt(1)); idt = (o.indent = this.idt(2));
o.top = true; o.top = true;
code = ("" + (this.tab) + "switch (" + (this.subject.compile(o)) + ") {"); code = ("" + (this.tab) + "switch (" + (this.subject.compile(o)) + ") {");
_ref2 = this.cases; _ref2 = this.cases;
@ -1785,7 +1785,7 @@
if (this.tags.subjectless) { if (this.tags.subjectless) {
condition = new OpNode('!!', new ParentheticalNode(condition)); condition = new OpNode('!!', new ParentheticalNode(condition));
} }
code += ("\n" + (this.tab) + "case " + (condition.compile(o)) + ":"); code += ("\n" + (this.idt(1)) + "case " + (condition.compile(o)) + ":");
} }
code += ("\n" + (block.compile(o))); code += ("\n" + (block.compile(o)));
if (!(exprs[exprs.length - 1] instanceof ReturnNode)) { if (!(exprs[exprs.length - 1] instanceof ReturnNode)) {
@ -1793,7 +1793,7 @@
} }
} }
if (this.otherwise) { if (this.otherwise) {
code += ("\n" + (this.tab) + "default:\n" + (this.otherwise.compile(o))); code += ("\n" + (this.idt(1)) + "default:\n" + (this.otherwise.compile(o)));
} }
code += ("\n" + (this.tab) + "}"); code += ("\n" + (this.tab) + "}");
return code; return code;

View file

@ -3,7 +3,7 @@
"description": "Unfancy JavaScript", "description": "Unfancy JavaScript",
"keywords": ["javascript", "language", "coffeescript", "compiler"], "keywords": ["javascript", "language", "coffeescript", "compiler"],
"author": "Jeremy Ashkenas", "author": "Jeremy Ashkenas",
"version": "0.9.3", "version": "0.9.4",
"licenses": [{ "licenses": [{
"type": "MIT", "type": "MIT",
"url": "http://github.com/jashkenas/coffee-script/raw/master/LICENSE" "url": "http://github.com/jashkenas/coffee-script/raw/master/LICENSE"

View file

@ -21,7 +21,7 @@ else if require.registerExtension
require.registerExtension '.coffee', (content) -> compile content require.registerExtension '.coffee', (content) -> compile content
# The current CoffeeScript version number. # The current CoffeeScript version number.
exports.VERSION = '0.9.3' exports.VERSION = '0.9.4'
# 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.

View file

@ -1445,7 +1445,7 @@ exports.SwitchNode = class SwitchNode extends BaseNode
this this
compileNode: (o) -> compileNode: (o) ->
idt = o.indent = @idt 1 idt = o.indent = @idt 2
o.top = yes o.top = yes
code = "#{ @tab }switch (#{ @subject.compile o }) {" code = "#{ @tab }switch (#{ @subject.compile o }) {"
for pair in @cases for pair in @cases
@ -1453,11 +1453,11 @@ exports.SwitchNode = class SwitchNode extends BaseNode
exprs = block.expressions exprs = block.expressions
for condition in flatten [conditions] for condition in flatten [conditions]
condition = new OpNode '!!', new ParentheticalNode condition if @tags.subjectless condition = new OpNode '!!', new ParentheticalNode condition if @tags.subjectless
code += "\n#{ @tab }case #{ condition.compile o }:" code += "\n#{ @idt(1) }case #{ condition.compile o }:"
code += "\n#{ block.compile o }" code += "\n#{ block.compile o }"
code += "\n#{ idt }break;" unless exprs[exprs.length - 1] instanceof ReturnNode code += "\n#{ idt }break;" unless exprs[exprs.length - 1] instanceof ReturnNode
if @otherwise if @otherwise
code += "\n#{ @tab }default:\n#{ @otherwise.compile o }" code += "\n#{ @idt(1) }default:\n#{ @otherwise.compile o }"
code += "\n#{ @tab }}" code += "\n#{ @tab }}"
code code