<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dvanhorn @ λ-calcul.us &#187; JavaScript</title>
	<atom:link href="http://dvanhorn.lambda-calcul.us/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://dvanhorn.lambda-calcul.us</link>
	<description>Research weblog for David Van Horn</description>
	<lastBuildDate>Sat, 28 Aug 2010 13:39:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Doctor JS</title>
		<link>http://dvanhorn.lambda-calcul.us/2010/08/26/doctor-js/</link>
		<comments>http://dvanhorn.lambda-calcul.us/2010/08/26/doctor-js/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 20:38:43 +0000</pubDate>
		<dc:creator>dvanhorn</dc:creator>
				<category><![CDATA[CFA]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://dvanhorn.lambda-calcul.us/?p=301</guid>
		<description><![CDATA[Tell the Doctor about it. 
Doctor JS is a genius. He&#8217;ll analyze your JavaScript code, complete with: polymorphism, prototypes, exceptions, and callbacks.
DoctorJS is a static analysis tool developed by my PRL lab neighbor, Dimitris Vardoulakis.  It&#8217;s an implementation of Vardoulakis and Olin Shivers&#8216; CFA2&#8212;a context-free approach to control flow analysis. 
Brendan Eich, CTO of [...]]]></description>
			<content:encoded><![CDATA[<p>Tell <a href="http://doctorjs.org/">the Doctor</a> about it. <img style="float: right;" src="http://doctorjs.org/couch.gif" /></p>
<blockquote><p>Doctor JS is a genius. He&#8217;ll analyze your JavaScript code, complete with: polymorphism, prototypes, exceptions, and callbacks.</p></blockquote>
<p>DoctorJS is a static analysis tool developed by my <a href="http://www.ccs.neu.edu/research/prl/">PRL</a> lab neighbor, <a href="http://www.ccs.neu.edu/home/dimvar/info.html">Dimitris Vardoulakis</a>.  It&#8217;s an implementation of Vardoulakis and <a href="http://www.ccs.neu.edu/home/shivers/">Olin Shivers</a>&#8216; <a href="http://www.ccs.neu.edu/home/dimvar/papers/cfa2-NU-CCIS-10-01.pdf">CFA2</a>&#8212;a context-free approach to control flow analysis. </p>
<p>Brendan Eich, CTO of Mozilla and creator of JS, recently blogged about DoctorJS (<a href="http://brendaneich.com/2010/08/static-analysis-ftw/">Static Analysis FTW</a>) and called static analysis one of the best &#8220;researchy&#8221; investments Mozilla has made over the past few years.</p>
]]></content:encoded>
			<wfw:commentRss>http://dvanhorn.lambda-calcul.us/2010/08/26/doctor-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interpretation in Scheme and JavaScript</title>
		<link>http://dvanhorn.lambda-calcul.us/2008/04/22/interpretation-in-scheme-and-javascript/</link>
		<comments>http://dvanhorn.lambda-calcul.us/2008/04/22/interpretation-in-scheme-and-javascript/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 23:40:25 +0000</pubDate>
		<dc:creator>dvanhorn</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Scheme]]></category>

		<guid isPermaLink="false">http://dvanhorn.lambda-calcul.us/2008/04/22/interpretation-in-scheme-and-javascript/</guid>
		<description><![CDATA[We implement an evaluator for a core functional language.  This core language is both a subset of Scheme and JavaScript.  Moreover, we implement the evaluator twice, side-by-side, in both Scheme and JavaScript.  The two are remarkably similar.
This exercise is a continuation of me throwing some of my favorite functional programs at JavaScript [...]]]></description>
			<content:encoded><![CDATA[<p>We implement an evaluator for a core functional language.  This core language is both a subset of Scheme and JavaScript.  Moreover, we implement the evaluator twice, side-by-side, in both Scheme and JavaScript.  The two are remarkably similar.</p>
<p>This exercise is a <a href="http://dvanhorn.lambda-calcul.us/2008/04/21/functional-programming-with-javascript/">continuation</a> of me throwing some of my favorite functional programs at JavaScript to see what they look like.  This one is the meta-circular evaluator, a staple of PL textbooks and classrooms.  (These evaluators aren&#8217;t quite meta-circular since they can&#8217;t evaluate themselves, but maybe we&#8217;ll get there someday.)</p>
<p>Writing programs always starts with designing data definitions, so let&#8217;s start with data definitions for the abstract syntax trees of our language.  Our core language is expression based and an expression is either a variable, a number, a function constructor, or an application.  We represent each variant of an expression as a record.  Records in Scheme vary among dialects.  SRFI 9 Records are widely supported and simple, and although R6RS has a sophisticated record facility, we rely on a very simple subset of PLT Scheme&#8217;s <code>define-struct</code> syntax:</p>
<blockquote>
<pre>;; An Exp is one of
;; - (make-var Symbol)
;; - (make-num Number)
;; - (make-lam Name Exp)
;; - (make-app Exp Exp)
;; And Name = Symbol.

(define-struct var (name))
(define-struct num (val))
(define-struct lam (var body))
(define-struct app (left right))</pre>
</blockquote>
<p>This defines constructor functions, e.g. a variable is represented by a <code>(make-var 'x)</code>, accessors (<code>var-name</code>, <code>lam-body</code>, etc.), and predicates (<code>var?</code>, <code>lam?</code>, etc.).</p>
<p>In JavaScript, functions (invoked with the keyword <code>new</code>) are used to construct records:</p>
<blockquote>
<pre>// An Exp is one of
// - new Var(Name)
// - new Num(Number)
// - new Lam(String, Exp)
// - new App(Exp, Exp)
// And Name = String.

function Var(name) { this.name = name }
function Num(val)  { this.val = val }

function Lam(variable, body) {
  this.variable = variable;
  this.body = body }

function App(left, right) {
  this.left = left;
  this.right = right }</pre>
</blockquote>
<p>Notice we had to do the field initialization by hand above.  Also, record definitions won&#8217;t provide predicates by default, unlike in Scheme, so we build these by hand, too:</p>
<blockquote>
<pre>function isVar(exp) { return exp instanceof Var }
function isNum(exp) { return exp instanceof Num }
function isLam(exp) { return exp instanceof Lam }
function isApp(exp) { return exp instanceof App }</pre>
</blockquote>
<p>(If JavaScript included a hygienic macro facility, we could have baked in all this syntactic sugar easily.)</p>
<p>Now let&#8217;s sketch data definitions for the values (denotations) of our language.  These are the results of evaluation.  Since our language is functional, we have function values (closures), and since we have number expressions, we&#8217;ll include number values.  So we have:</p>
<blockquote>
<pre>;; A Val is one of
;; - (make-closure Lam Env) [Scheme]
;; | makeClosure(Lam, Env)  [JavaScript]
;; - Number</pre>
</blockquote>
<p>More will be said about the representation of closures later.  With data definitions in place, we can now give the heart of the evaluator.  First, in Scheme:</p>
<blockquote>
<pre>;; evaluate : Exp Env -&gt; Val
;; Evaluate the given expression in the given environment,
;; which must close the expression.
(define (evaluate exp env)
  (cond ((var? exp) (lookup exp env))
        ((num? exp) (num-val exp))
        ((lam? exp) (make-closure exp env))
        ((app? exp) (let ((fun (evaluate (app-left exp) env))
                          (arg (evaluate (app-right exp) env)))
                      (fun arg)))))</pre>
</blockquote>
<p>And now in JavaScript:</p>
<blockquote>
<pre>// evaluate : Exp Env -&gt; Val
// Evaluate the given expression in the given environment,
// which must close the expression.
function evaluate(exp, env) {
  return isVar(exp) ? lookup(exp, env) :
         isNum(exp) ? exp.val :
         isLam(exp) ? makeClosure(exp, env) :
         isApp(exp) ? (function () {
                        var fun = evaluate(exp.left, env);
                        var arg = evaluate(exp.right, env);
                        return fun(arg) })() :
         undefined }</pre>
</blockquote>
<p>Evaluation is defined by structural recursion on expressions. A variable evaluates to the value it is bound to in the environment. (We have not chosen a representation for environments, or defined <code>lookup</code>, yet.  These things are on the proverbial <em>wish list</em>.)  A number evaluates to the number it represents.  A lambda expression evaluates to a closure: the term closed by the current environment.  An application evaluates its operator and operand, then evaluates to the application of the operator value to the operand value.  You can see here that a closure is being applied (note <code>(fun arg)</code> in the Scheme, and <code>fun(arg)</code> in the JavaScript), so we&#8217;ve committed to representing closures with functions in the implementing language (seems just as natural as representing number values with numbers, after all).</p>
<p>One thing you might notice in the JavaScript is the <code>(function () {...})()</code>.  This is an idiom to create block scope in a language without <code>let</code>.  This is done by creating a function of no arguments, which creates a block of scope in which <code>fun</code> and <code>arg</code> are bound.  The function is then immediately applied, so its body is evaluated.  Thus we can &#8220;fake&#8221; <code>let (x = y) e</code> as <code>(function () {var x = y; e})()</code>. (Again, macros would alleviate the syntactic tax here. It seems embarrassing that JavaScript doesn&#8217;t have <code>let</code>; maybe more modern dialects do? and maybe the next <a href="http://www.ecmascript.org/">revision</a> of the language will include it?)</p>
<p>Returning to closures, we know that a closure is a <code>(make-closure Lam Env)</code>.  Since the evaluator applies closure values, we are committed to a functional representation of closures.  Closures are applied to single arguments, so they will be represented a functions expecting one argument.  When applied, a closure should evaluate the body of the lambda expression in the environment in which it was created, extended with the formal parameter of the lambda expression being bound to the given argument.  So we arrive at the following:</p>
<blockquote>
<pre>;; make-closure : Lam Env -&gt; (Val -&gt; Val)
(define (make-closure lam env)
  (lambda (v)
    (evaluate (lam-body lam) (extend env (lam-var lam) v))))</pre>
</blockquote>
<p>The analogous JavaScript is:</p>
<blockquote>
<pre>// makeClosure : Lam Env -&gt; (Val -&gt; Val)
function makeClosure(lam, env) {
  return function (v) {
    return evaluate(lam.body, extend(env, lam.variable, v))}}</pre>
</blockquote>
<p>All that is left is dismissing our wish list items: we need to choose a representation for environments and implement <code>lookup</code> and <code>extend</code>.  We just to use association lists, which are lists of pairs.</p>
<blockquote>
<pre>;; A [Listof T] is one of
;; - '(), the empty list
;; - (cons T [Listof T])
;; And Env = [Listof (cons Name Val)]</pre>
</blockquote>
<p>In JavaScript, we use arrays with two elements to represent pairs, arriving at the following data definitions.  Type parameterization is written in curly braces so as not to be confused with the array notation:</p>
<blockquote>
<pre>// A {Listof T} is one of
// - [], the empty array
// - [T, {Listof T}]
// And Env = {Listof [Name, Val]}</pre>
</blockquote>
<p>The operations <code>lookup</code> and <code>extend</code> are straightforward:</p>
<blockquote>
<pre>;; lookup : Var Env -&gt; Val
;; Produces the binding of the given variable
;; in the given environment.
(define (lookup var env)
  (cond ((eq? (first (first env)) (var-name var))
         (rest (first env)))
        (else (lookup var (rest env)))))

;; extend : Env Name Val -&gt; Env
;; Produces an extended environment
;; with the given name bound to the given value.
(define (extend env name val)
  (cons (cons name val) env))</pre>
</blockquote>
<p>JavaScript:</p>
<blockquote>
<pre>// lookup : Var Env -&gt; Val
// Produces the binding of the given variable
// in the given environment.
function lookup(variable, env) {
  return variable.name === first(first(env))
       ? rest(first(env))
       : lookup(variable, rest(env))}

// extend : Env Name Val -&gt; Env
// Produces an extended environment
// with the given name bound to the given value.
function extend(env, name, value) {
  return [[name, value], env]}</pre>
</blockquote>
<p>This relies on the obvious definitions of <code>first</code> and <code>rest</code> to emphasize the correspondence:</p>
<blockquote>
<pre>function first(p) { return p[0] }
function rest(p)  { return p[1] }</pre>
</blockquote>
<p>The evaluator is complete now, but we still don&#8217;t have a concise notation for writing programs in the implemented language.  A cheap and traditional solution is to use S-Expressions:</p>
<blockquote>
<pre>;; An S-Exp is one of
;; - Name
;; - Number
;; - (list 'fun Name S-Exp) [Scheme]
;; | ["fun", Name, S-Exp]   [JavaScript]
;; - (list S-Exp S-Exp) [Scheme]
;; | [S-Exp, S-Exp]     [JavaScript]</pre>
</blockquote>
<p>Some examples in Scheme:</p>
<ul>
<li><code>'(fun x x)</code>,</li>
<li><code>'(add1 4)</code>,</li>
<li><code>'(((fun x (fun y x)) 3) 7)</code>.</li>
</ul>
<p>Some examples in JavaScript:</p>
<ul>
<li><code>["fun", "x", "x"]</code>,</li>
<li><code>["add1", 4]</code>,</li>
<li><code>[[["fun", "x", ["fun", "y", "x"]], 3], 7]</code>.</li>
</ul>
<p>S-Expressions are parsed into abstract syntax trees as follows.  This is a brain-dead application of the <a href="http://htdp.org/2003-09-26/Book/curriculum-Z-H-13.html#node_sec_9.4">design recipe for functions that consume self-referential data</a> (in this case S-Exps), where the template for such functions is:</p>
<blockquote>
<pre>;; template : S-Exp -&gt; ?
(define (template sexp)
  (cond ((number? sexp) ...)
        ((symbol? sexp) ...)
        (else
          (cond ((eq? 'fun (first sexp))
                 ...(second sexp)...
                 ...(template (third sexp))...)
                (else
                 ...(template (first sexp))...
                 ...(template (second sexp)...))))))</pre>
</blockquote>
<p>And the following examples guide filling in the dots for our particular function, <code>parse</code>:</p>
<ul>
<li><code>(parse 5)</code> =&gt; <code>(make-num 5)</code></li>
<li><code>(parse 'x)</code> =&gt; <code>(make-var 'x)</code></li>
<li><code>(parse '(fun x x))</code> =&gt; <code>(make-lam 'x (parse 'x))</code></li>
<li><code>(parse '(add1 4))</code> =&gt; <code>(make-app (parse 'add1) (parse 4))</code></li>
</ul>
<p>In Scheme:</p>
<blockquote>
<pre>;; parse : S-Exp -&gt; Exp
(define (parse sexp)
  (cond ((number? sexp) (make-num sexp))
        ((symbol? sexp) (make-var sexp))
        (else
         (cond ((eq? 'fun (first sexp))
                (make-lam (second sexp)
                          (parse (third sexp))))
               (else
                (make-app (parse (first sexp))
                          (parse (second sexp))))))))</pre>
</blockquote>
<p>And JavaScript:</p>
<blockquote>
<pre>// parse : S-Exp -&gt; Exp
function parse(sexp) {
  return isString(sexp) ? new Var(sexp) :
         isNumber(sexp) ? new Num(sexp) :
         sexp[0] === "fun" ? new Lam(sexp[1], parse(sexp[2])) :
         new App(parse(sexp[0]), parse(sexp[1]))}</pre>
</blockquote>
<p>Where,</p>
<blockquote>
<pre>function isString(sexp) { return typeof sexp === "string" }
function isNumber(sexp) { return typeof sexp === "number" }</pre>
</blockquote>
<p>Finally, we can evaluate some example programs in Scheme:</p>
<ul>
<li><code>(evaluate (parse 3) '())</code><br />
=&gt; <code>3</code></li>
<li><code>(evaluate (parse '(fun x x)) '())</code><br />
=&gt; <code>(make-closure (parse '(fun x x)) '())</code></li>
<li><code>(evaluate (parse '(((fun x (fun y x)) 3) 7)) '())</code><br />
=&gt; <code>3</code></li>
</ul>
<p>Or in JavaScript:</p>
<ul>
<li><code>evaluate(parse(3), [])</code><br />
=&gt; <code>3</code></li>
<li><code>evaluate(parse(["fun", "x", "x"]), [])</code><br />
=&gt; <code>makeClosure(parse(["fun", "x", "x"]),[])</code></li>
<li><code>evaluate(parse([[["fun", "x", ["fun", "y", "x"]], 3], 7]), [])</code><br />
=&gt; <code>3</code></li>
</ul>
<p>We can also embed values from the implementing language into the implemented language via the initial environment, in Scheme:</p>
<blockquote>
<pre>(define initial-env (cons (cons 'add1 add1) '()))</pre>
</blockquote>
<p>In JavaScript:</p>
<blockquote>
<pre>var initial_env = ["add1", (function (n) {return n+1}), []]</pre>
</blockquote>
<p>This brings us back to <a href="http://dvanhorn.lambda-calcul.us/2008/04/21/functional-programming-with-javascript/">yesterday&#8217;s functional program</a>, iterative doubling, which we can evaluate in Scheme:</p>
<blockquote>
<pre>(evaluate
 (parse '((fun double (((((double double) double) double) add1) 0))
          (fun f (fun x (f (f x))))))
 initial-env)</pre>
<p>=&gt; <code>65536</code></p></blockquote>
<p>Or in JavaScript:</p>
<blockquote>
<pre>evaluate(
  parse([["fun", "d", [[[[["d", "d"], "d"], "d"], "add1"], 0]],
         ["fun", "f", ["fun", "x", ["f", ["f", "x"]]]]]),
  initial_env)</pre>
<p>=&gt; <code>65536</code></p></blockquote>
<p>And we are done.  Complete code is available here [<a href="http://dvanhorn.lambda-calcul.us/wp-content/uploads/2008/04/evaluation.scm">Scheme</a>] and here [<a href="http://dvanhorn.lambda-calcul.us/wp-content/uploads/2008/04/evaluation.js">JavaScript</a>].</p>
]]></content:encoded>
			<wfw:commentRss>http://dvanhorn.lambda-calcul.us/2008/04/22/interpretation-in-scheme-and-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Functional programming with JavaScript</title>
		<link>http://dvanhorn.lambda-calcul.us/2008/04/21/functional-programming-with-javascript/</link>
		<comments>http://dvanhorn.lambda-calcul.us/2008/04/21/functional-programming-with-javascript/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 18:44:40 +0000</pubDate>
		<dc:creator>dvanhorn</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Scheme]]></category>

		<guid isPermaLink="false">http://dvanhorn.lambda-calcul.us/2008/04/21/functional-programming-with-javascript/</guid>
		<description><![CDATA[Last week, Brendan Eich, CTO of the Mozilla Corporation and the original designer of the JavaScript programming language, was hanging out at Northeastern, talking about JavaScript and writing reliable software for the web.  Let&#8217;s just say there are plenty of opportunities to apply well-developed PL technology to the huge JavaScript code base (one in [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, <a href="http://en.wikipedia.org/wiki/Brendan_Eich">Brendan Eich</a>, CTO of the Mozilla Corporation and the original designer of the JavaScript programming language, was hanging out at Northeastern, talking about JavaScript and writing reliable software for the web.  Let&#8217;s just say there are plenty of opportunities to apply well-developed PL technology to the huge JavaScript code base (one in two pages in the Google index contain JavaScript code).  Eich&#8217;s talk was, in my opinion, the most interesting to come through the NEU halls over the past year.  The content could&#8217;ve motivated half a dozen PhD dissertations.</p>
<p>I&#8217;ve always had a strong respect for Mozilla.  Their commitment to openness and support for standards and free software makes the world a better place to live in.  Literally.  And Eich&#8217;s candor and fluency in research really impressed me.  The fact that they fund fundamental research in the theory of hygienic macros speaks to their seriousness in academic work.  (And if they had a research lab, I&#8217;d take half as much money to get a job there.)</p>
<p>I had known for a long time that JavaScript was the Schemer&#8217;s hidden gem in the overwhelmingly turdish world of real-world technologies.  But I didn&#8217;t realize the extent to which Scheme itself had influenced its design.  Eich describes his days at Netscape building the first JavaScript implementation as the &#8220;Scheme in the Browser&#8221; project. You might go so far as to say JavaScript is the world&#8217;s most ubiquitous dialect of Scheme.</p>
<p>So today, I thought I&#8217;d give JavaScript a test run and throw some of my favorite functional programs at it to see how far the Scheme in the Browser analogy went.  Here&#8217;s the transcript of one of my favorites: iterative doubling.</p>
<blockquote>
<pre>&gt;&gt;&gt; function add1(n) {return n+1;}
&gt;&gt;&gt; add1(0);
1
&gt;&gt;&gt; function double(f) {return function (x) {return f(f(x));}}
&gt;&gt;&gt; double(add1);
function()
&gt;&gt;&gt; double(add1)(0);
2
&gt;&gt;&gt; double(double)(add1)(0);
4
&gt;&gt;&gt; double(double)(double)(add1)(0);
16
&gt;&gt;&gt; double(double)(double)(double)(add1)(0);
65536
&gt;&gt;&gt; double(double)(double)(double)(double)(add1)(0);
error: too much recursion</pre>
</blockquote>
<p>OK, so there&#8217;s really no &#8220;recursion&#8221; going on here, but that&#8217;s forgiveable.  The point is, if you&#8217;re used to programming in a dynamically typed, higher-order programming language with a REPL (I&#8217;m using <a href="http://www.getfirebug.com/">Firebug</a>), this little exercise should make you feel right at home.</p>
<p>(You might miss having big numbers.  This isn&#8217;t all that satisfying:</p>
<blockquote>
<pre>&gt;&gt;&gt; Math.pow(2,Math.pow(2,2));
16
&gt;&gt;&gt; Math.pow(2,Math.pow(2,Math.pow(2,2)));
65536
&gt;&gt;&gt; Math.pow(2,Math.pow(2,Math.pow(2,Math.pow(2,2))));
Infinity</pre>
</blockquote>
<p>The correct answer to that last one is much, much smaller than infinity:</p>
<blockquote><p>200352993040684646497907235156025575044782547556975141926501<br />
697371089405955631145308950613088093334810103823434290726318<br />
182294938211881266886950636476154702916504187191635158796634<br />
721944293092798208430910485599057015931895963952486337236720<br />
300291696959215610876494888925409080591145703767520850020667<br />
156370236612635974714480711177481588091413574272096719015183<br />
628256061809145885269982614142503012339110827360384376787644<br />
904320596037912449090570756031403507616256247603186379312648<br />
470374378295497561377098160461441330869211810248595915238019<br />
533103029216280016056867010565164675056803874152946384224484<br />
529253736144253361437372908830379460127472495841486491593064<br />
725201515569392262818069165079638106413227530726714399815850<br />
881129262890113423778270556742108007006528396332215507783121<br />
428855167555407334510721311242739956298271976915005488390522<br />
380435704584819795639315785351001899200002414196370681355984<br />
046403947219401606951769015611972698233789001764151719005113<br />
346630689814021938348143542638730653955296969138802415816185<br />
956110064036211979610185953480278716720012260464249238511139<br />
340046435162386756707874525946467090388654774348321789701276<br />
445552940909202195958575162297333357615955239488529757995402<br />
847194352991354376370598692891375715374000198639433246489005<br />
254310662966916524341917469138963247656028941519977547770313<br />
806478134230959619096065459130089018888758808473362595606544<br />
488850144733570605881709016210849971452956834406197969056546<br />
981363116205357936979140323632849623304642106613620022017578<br />
785185740916205048971178182040018728293994344618622432800983<br />
732376493181478984811945271300744022076568091037620399920349<br />
202390662626449190916798546151577883906039772075927937885224<br />
129430101745808686226336928472585140303961555856433038545068<br />
865221311481363840838477826379045960718687672850976347127198<br />
889068047824323039471865052566097815072986114143030581692792<br />
497140916105941718535227588750447759221830115878070197553572<br />
224140001954810200566177358978149953232520858975346354700778<br />
669040642901676380816174055040511767009367320280454933902799<br />
249186730653993164072049223847481528061916690093380573212081<br />
635070763435166986962502096902316285935007187419057916124153<br />
689751480826190484794657173660100589247665544584083833479054<br />
414481768425532720731558634934760513741977952519036503219802<br />
010876473836868253102518337753390886142618480037400808223810<br />
407646887847164755294532694766170042446106331123802113458869<br />
453220011656407632702307429242605158281107038701834532456763<br />
562595143003203743274078087905628366340696503084422585596703<br />
927186946115851379338647569974856867007982396060439347885086<br />
164926030494506174341236582835214480672667684180708375486221<br />
140823657980296120002744132443843240233125740354501935242877<br />
643088023285085588608996277445816468085787511580701474376386<br />
797695504999164399828435729041537814343884730348426190338884<br />
149403136613985425763557710533558020662218557706008255128889<br />
333222643628198483861323957067619140963853383237434375883085<br />
923372228464428799624560547693242899843265267737837317328806<br />
321075321123868060467470842805116648870908477029120816110491<br />
255559832236624486855665140268464120969498259056551921618810<br />
434122683899628307165486852553691485029953967550395493837185<br />
340590009618748947399288043249637316575380367358671017578399<br />
481847179849824694806053208199606618343401247609663951977802<br />
144119975254670408060849934417825628509272652370989865153946<br />
219300460736450792621297591769829389236701517099209153156781<br />
443979124847570623780460000991829332130688057004659145838720<br />
808801688744583555792625846512476308714856631352893416611749<br />
061752667149267217612833084527393646924458289257138887783905<br />
630048248379983969202922221548614590237347822268252163995744<br />
080172714414617955922617508388902007416992623830028228624928<br />
418267124340575142418856999427233160699871298688277182061721<br />
445314257494401506613946316919762918150657974552623619122484<br />
806389003366907436598922634956411466550306296596019972063620<br />
260352191777674066877746354937531889958786628212546979710206<br />
574723272137291814466665942187200347450894283091153518927111<br />
428710837615922238027660532782335166155514936937577846667014<br />
571797190122711781278045024002638475878833939681796295069079<br />
881712169068692953824852983002347606845411417813911064856023<br />
654975422749723100761513187002405391051091381784372179142252<br />
858743209852495787803468370333781842144401713868812424998441<br />
861812927119853331538256732187042153063119774853521467095533<br />
462633661086466733229240987984925669110951614361860154890974<br />
024191350962304361219612816595051866602203071561368473236466<br />
086890501426391390651506390819937885231836505989729912540447<br />
944342516677429965981184923315155527288327402835268844240875<br />
281128328998062591267369954624734154333350014723143061275039<br />
030739713525206933817384332295070104906186753943313078479801<br />
565513038475815568523621801041965025559618193498631591323303<br />
609646190599023611268119602344184336333459492763194610171665<br />
291382371718239429921627253846177606569454229787707138319881<br />
703696458868981186321097690035573588462446483570629145305275<br />
710127887202796536447972402540544813274839179412882642383517<br />
194919720979714593688753719872913083173803391101612854741537<br />
737771595172808411162759718638492422280237344192546999198367<br />
219213128703558530796694271341639103388275431861364349010094<br />
319740904733101447629986172542442335561223743571582593338280<br />
498624389249822278071595176275784710947511903348224141202518<br />
268871372819310425347819612844017647953150505711072297431456<br />
991522345164312184865757578652819756484350895838472292353455<br />
946452121583165775147129870822590929265563883665112068194383<br />
690411625266871004456024370420066370900194118555716047204464<br />
369693285006004692814050711906926139399390273553454556747031<br />
490388602202463994826050176243196930564066636662609020704888<br />
743889890749815286544438186291738290105182086993638266186830<br />
391527326458128678280660133750009659336462514609172318031293<br />
034787742123467911845479131110989779464821692250562939995679<br />
348380169915743970053754213448587458685604728675106542334189<br />
383909911058646559511364606105515683854121745980180713316361<br />
257307961116834386376766730735458349478978831633012924080083<br />
635682593915711313097803051644171668251834657367593419808495<br />
894794098329250008638977856349469321247342610306271374507728<br />
615692259662857385790553324064184901845132828463270926975383<br />
086730840914224765947443997334813081098639941737978965701068<br />
702673416196719659159958853783482298827012560584236558953969<br />
030647496558414798131099715754204325639577607048510088157829<br />
140825077773855979012912940730946278594450585941227319481275<br />
322515232480150346651904822896140664689030510251091623777044<br />
848623022948896671138055560795662073244937337402783676730020<br />
301161522700892184351565212137921574820685935692079021450227<br />
713309998772945959695281704458218195608096581170279806266989<br />
120506156074232568684227130629500986442185347081040712891764<br />
690655083612991669477802382250278966784348919940965736170458<br />
678624255400694251669397929262471452494540885842272615375526<br />
007190433632919637577750217600519580069384763578958687848953<br />
687212289855780682651819270363209948015587445557517531273647<br />
142129553649408438558661520801211507907506855334448925869328<br />
385965301327204697069457154695935365857178889486233329246520<br />
273585318853337094845540333656535698817258252891805663548836<br />
374379334841184558016833182767683464629199560551347003914787<br />
680864032262961664156066750815371064672310846196424753749055<br />
374480531822600271021640098058449752602303564003808347205314<br />
994117296573678506642140084269649710324191918212121320693976<br />
914392336837470922826773870813223668008692470349158684099115<br />
309831541206356612318750430546753698323082796645741762080659<br />
317726568584168183796610614496343254411170694170022265781735<br />
835125982108076910196105222926387974504901925431190062056190<br />
657745241619191318753398404934397682331029846589331837301580<br />
959252282920682086223033258528011926649631444131644277300323<br />
779227471233069641714994553226103547514563129066885434542686<br />
978844774298177749371011761465162418361668025481529633530849<br />
084994300676365480610294009469375060984558855804397048591444<br />
958444507997849704558355068540874516331646411808312307970438<br />
984919050658758642581073842242059119194167418249045270028826<br />
398305795005734171148703118714283418449915345670291528010448<br />
514517605530697144176136858238410278765932466268997841831962<br />
031226242117739147720800488357833356920453393595325456489702<br />
855858973550575123512953654050284208102278524877660357424636<br />
667314868027948605244578267362623085297826505711462484659591<br />
421027812278894144816399497388188462276824485162205181707672<br />
216986326570165431691974265123004175732990447353767253684579<br />
275436541282655358185804684006936771860502007054724754840080<br />
553042495185449526724726134731817474218007857469346544713603<br />
697588411802940803961674694628854067917213860122541950381970<br />
453841726800639882065632879283958270851091995883944829777564<br />
715202613287108952616341770715164289948795356485455355314875<br />
497813400996485449863582484769059003311696130376612792346432<br />
312970662841130742704620203201336835038542536031363676357521<br />
260470742531120923340283748294945310472741896928727557202761<br />
527226828337674139342565265328306846999759709775000556088993<br />
268502504921288406827413988163154045649035077587168007405568<br />
572402175868543905322813377070741583075626962831695568742406<br />
052772648585305061135638485196591896864959633556821697543762<br />
143077866593473045016482243296489127070989807667662567151726<br />
906205881554966638257382927418208227896068448822298339481667<br />
098403902428351430681376725346012600726926296946867275079434<br />
619043999661897961192875051944235640264430327173734159128149<br />
605616835398818856948404534231142461355992527233006488162746<br />
672352375123431189344211888508507935816384899448754475633168<br />
921386967557430273795378526254232902488104718193903722066689<br />
470220425883689584093999845356094886994683385257967516188215<br />
941098162491874181336472696512398067756194791255795744647142<br />
786862405375057610420426714936608498023827468057598259133100<br />
691994190465190653117190892607794911921794640735512963386452<br />
303567334558803331319708036545718479155043265489955970586288<br />
828686660661802188224860214499997312216413817065348017551043<br />
840662441282280361664890425737764095632648282525840766904560<br />
843949032529052633753231650908768133661424239830953080654966<br />
187938194912003391948949406513239881664208008839555494223709<br />
673484007264270570116508907519615537018626479745638118785617<br />
545711340047381076276301495330973517418065547911266093803431<br />
137853253288353335202493436597912934128485497094682632907583<br />
019307266533778255931433111096384805394085928398890779621047<br />
984791968687653998747709591278872747587443980677982496827827<br />
220092644994455938041460877064194181044075826980568803894965<br />
461658798390466058764534181028990719429302177451997610449504<br />
319684150345551404482092893337865736305283061999007774872692<br />
299860827905317169187657886090894181705799340489021844155979<br />
109267686279659758395248392673488363474565168701616624064242<br />
424122896111801061568234253939218005248345472377921991122859<br />
591419187749179382334001007812832650671028178139602912091472<br />
010094787875255126337288422235386949006792766451163475810119<br />
387531965724212147603828477477457170457861041738574791130190<br />
858387789015233434301300528279703858035981518292960030568261<br />
209195094373732545417105638388704752895056396102984364136093<br />
564163258940813798151169333861979733982167076100460798009601<br />
602482309694304380695662012321365014054958625061528258803302<br />
290838581247846931572032323360189946943764772672187937682643<br />
182838260356452069946863021604887452842436359355862233350623<br />
594500289055858161127534178375045593612613085264082805121387<br />
317749020024955273873458595640516083058305377073253397155262<br />
044470542957353836111367752316997274029294167420442324811387<br />
507563131907827218886405337469421384216992886294047963530515<br />
056078812636620649723125757901959887304119562622734372890051<br />
656111109411174527796548279047125058199907749806382155937688<br />
554649882293898540829132512907647838632249478101675349169348<br />
928810420301561028338614382737816094634133538357834076531432<br />
141715065587754782025245478065730134227747061674424196895261<br />
316427410469547462148375628829977180418678508454696561915090<br />
869587425118443583730659095146098045124740941137389992782249<br />
298336779601101538709612974970556630163730720275073475992294<br />
379239382442742118615823616131788639255309511718842129850830<br />
723825972914414225157940388301135908333165185823496722125962<br />
181250705811375949552502274727467436988713192667076929919908<br />
446716122873885845758462272657333075373557282395161696417519<br />
867501268174542932373829414382481437713986190671665757294580<br />
780482055951188168718807521297183263644215533678775127476694<br />
079011705750981957508456356521738954417987507452385445520013<br />
357203333237989507439390531291821225525983379090946363020218<br />
535384885482506289771561696386071238277172562131346054940177<br />
041358173193176337013633225281912754719144345092071184883836<br />
681817426334294961187009150304916533946476371776643912079834<br />
749462739782217150209067019030246976215127852195614207080646<br />
163137323651785397629209202550028896201297014137964003805573<br />
494926907353514596120867479654773369295877362863566014376796<br />
403843079686413856344780132826128458918489852804804884418082<br />
163942397401436290348166545811445436646003249061876303950235<br />
640204453074821024136689519664422133920075747912868380517515<br />
063466256939193774028351207566626082989049187728783385217852<br />
279204577184696585527879044756219266399200840930207567392536<br />
373562839082981757790215320210640961737328359849406665214119<br />
818381088451545977289516457213189779790749194101314836854463<br />
961690460703010759681893374121757598816512700076126278916951<br />
040631585763753478742007022205107089125761236165802680681585<br />
849985263146587808661680073326467683020639169720306489440562<br />
819540619068524200305346315662189132730906968735318164109451<br />
428803660599522024824888671155442910472192913424834643870536<br />
850864874909917881267056566538719104972182004237149274016446<br />
094345984539253670613221061653308566202118896823400575267548<br />
610147699368873820958455221157192347968688816085363161586288<br />
015039594941852948922707441082820716930338781808493620401825<br />
522227101098565344481720747075601924591559943107294957819787<br />
859057894005254012286751714251118435643718405356302418122547<br />
326609330271039796809106493927272268303541046763259135527968<br />
383770501985523462122285841055711992173171796980433931770775<br />
075562705604783177984444763756025463703336924711422081551997<br />
369137197516324130274871219986340454824852457011855334267526<br />
471597831073124566342980522145549415625272402891533335434934<br />
121786203700726031527987077187249123449447714790952073476138<br />
542548531155277330103034247683586549609372232400715451812973<br />
269208105842409055772564580368146223449318970813889714329983<br />
134761779967971245378231070373915147387869211918756670031932<br />
128189680332269659445928621060743882741691946516226763254066<br />
507088107103039417886056489376981673415902592519461182364294<br />
565266937220315550470021359884629275801252771542201662995486<br />
313032491231102962792372389976641680349714122652793190763632<br />
613681414551637665655983978848938173308266877990196288693229<br />
659737995193162118721545528739417024366988559388879331674453<br />
336311954151840408828381519342123412282003095031334105070476<br />
015998798547252919066522247931971544033179483683737322082188<br />
577334162385644138070054191353024594391350255453188645479625<br />
226025176292837433046510236105758351455073944333961021622967<br />
546141578112719700173861149427950141125328062125477581051297<br />
208846526315809480663368767014731073354071771087661593585681<br />
409821296773075919738297344144525668877085532457088895832099<br />
382343210271822411476373279135756861542125284965790333509315<br />
277692550584564401055219264450531207375628774499816364633283<br />
581614033017581396735942732769044892036188038675495575180689<br />
005853292720149392350052584514670698262854825788326739873522<br />
045722823929020714482221988558710289699193587307427781515975<br />
762076402395124386020203259659625021257834995771008562638611<br />
823381331850901468657706401067627861758377277289589274603940<br />
393033727187385053691295712671506689668849388088514294360996<br />
201296675907922508227531381284985152690293170026313632894209<br />
579757795932763553116206675348865131732387243874806351331451<br />
264488996758982881292548007642518658649024111112730135719718<br />
138160258317850693224400799865663537154408845486639318170839<br />
573578079905973083909488180406093595919090747396090441015051<br />
632174968141210076571917748376735575100073361692238653742907<br />
945780320004233745280756615304292901449578062963413838355178<br />
359976470885134900485697369796523869584599459559209070905895<br />
689145114141268450546211794502661175016692826025095077077821<br />
195043261738322356243760177679936279609936897519139496503335<br />
850715541843645685261667424368892037103749532842592713161053<br />
783498074073915863381796765842525803673720646935124865223848<br />
134166380806150570482905989069645193644001859712042572300731<br />
641000991698752426037736217776343062161674488493081092990100<br />
951797454156425120482208671458684925513244426677712786372821<br />
133153622430109182439124338021404624222334915355951689081628<br />
848798998827363044537243217428021575577796702166631704796972<br />
817248339284101564227450727177926939992974030807277039501358<br />
154514249404902653610582540937311465310494338248437971860693<br />
721444460082679800247122948940576185389220342560830269705287<br />
662137737359439422411470707407290272546130735854174569141944<br />
648762435768239706570318416846754073346634629367398362000404<br />
140071405427763248013274220268539369886978760700959004868465<br />
062677136307097982100655728510130660101078063374334477307347<br />
865388174268123074376606664331277535646657860371519292276844<br />
045827328324380821284121877613204246046490080105473142674926<br />
082692215563740548624171703102791999694264562095561981645454<br />
766204502241144940474934983220680719135276798674781345820385<br />
957041346617793722853494003163159954409368408957253343870298<br />
671782977037333280680176463950209002394193149911500910527682<br />
111951099906316615031158558283558260717941005252858361136996<br />
130344279017381178741206128818206202326384986151565645123004<br />
779296756361834576810504334176954306753804111392855379252924<br />
134733948105053202570872818630729115891133594201476187266429<br />
156403637192760230628384065042544174233546454998705531872688<br />
792642410214736369862546374715974435494344389973005174252511<br />
087735788639094681209667342815258591992485764048805507132981<br />
429935991146323991911395992675257635900744657281019180584180<br />
734222773472139772321823177171691640010882611254909336118678<br />
057572239101818616854910850088527227437421208652485237245624<br />
869766224538481929867112945294551549703058591930719849710541<br />
418163696897613112674402700964866754593456705993699546450055<br />
892162804797636568613331656390739570327203438917541526750091<br />
501119885687270884819553167693168127289214303137681801644547<br />
736751835349785792427646335416243360112596025210950161226411<br />
034608346564823559793427405686884922445874549377675212032470<br />
380303549115754483129527589193989368087632768543876955769488<br />
142284431199859570072752139317683783177033913042306095899913<br />
731468456901042209516196707050642025673387344611565527617599<br />
272715187766001023894476053978951694570880272873622512107622<br />
409181006670088347473760515628553394356584375627124124445765<br />
166306408593950794755092046393224520253546363444479175566172<br />
596218719927918657549085785295001284022903506151493731010700<br />
944615101161371242376142672254173205595920278212932572594714<br />
641722497732131638184532655527960427054187149623658525245864<br />
893325414506264233788565146467060429856478196846159366328895<br />
429978072254226479040061601975197500746054515006029180663827<br />
149701611098795133663377137843441619405312144529185518013657<br />
555866761501937302969193207612000925506508158327550849934076<br />
879725236998702356793102680413674571895664143185267905471716<br />
996299036301554564509004480278905570196832831363071899769915<br />
316667920895876857229060091547291963638167359667395997571032<br />
601557192023734858052112811745861006515259888384311451189488<br />
055212914577569914657753004138471712457796504817585639507289<br />
5337539755822087777506072339445587895905719156736</p></blockquote>
<p>Oh well.)</p>
]]></content:encoded>
			<wfw:commentRss>http://dvanhorn.lambda-calcul.us/2008/04/21/functional-programming-with-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
