+
1
|
list
|
skin
|
login
|
editor
α-wwwiki
::
jslambda
user:none
(3274 bytes)
_h1 jslambda _p Since (?:ECMA|Java)script supports closures, it is λ-calculus ready. OK, OK, but it's still a little bit hard to understand the bridge between javascript expressions and s-expressions. Don't you ? {input {@ type="submit" value="compute" onclick="°° // 1) defining core functions : function zero(f){ return function(x){ return x} } function succ(n){ return function(f){ return function(x){ return f(n(f)(x))} } } function add(m){ return function(n){ return function(f){ return function(x){ return m(f)(n(f)(x))} } } } function mul(m){ return function(n){ return function(f){ return m(n(f))} } } function pow(m){ return function(n){ return n(m)} } function end(n) { return 1+n; } // 2) composing and calling : var foo = (zero ) (end )(0); // 0 var foo = (succ (zero )) (end )(0); // 1 var foo = (succ (succ (zero ))) (end )(0); // 2 var foo = (succ (succ (succ (zero )))) (end )(0); // 3 var foo = (add (succ (succ (succ (zero )))) (succ (succ (zero ))) (end )(0)); // 3+2 = 5 var foo = (mul (succ (succ (succ (zero )))) (succ (succ (zero ))) (end )(0)); // 3*2 = 6 var foo = (pow (succ (succ (succ (zero )))) (succ (succ (zero ))) (end )(0)); // 3^2 = 9 getId('result').innerHTML = foo; °°"}} {pre {@ id="result"} ... } _h3 code {pre °° Source : http://dankogai.typepad.com/blog/2006 // 1) defining core functions : function zero(f){ return function(x){ return x } } function succ(n){ return function(f){ return function(x){ return f(n(f)(x)) } } } function add(m){ return function(n){ return function(f){ return function(x){ return m(f)(n(f)(x)) } } } } function mul(m){ return function(n){ return function(f){ return m(n(f)) } } } function pow(m){ return function(n){ return n(m) } } function end(n) { return 1+n; } // 2) composing and calling : var foo = (zero ) (end )(0); // 0 var foo = (succ (zero )) (end )(0); // 1 var foo = (succ (succ (zero ))) (end )(0); // 2 var foo = (succ (succ (succ (zero )))) (end )(0); // 3 var foo = (add (succ (succ (succ (zero )))) (succ (succ (zero ))) (end )(0)); // 3+2 = 5 var foo = (mul (succ (succ (succ (zero )))) (succ (succ (zero ))) (end )(0)); // 3*2 = 6 var foo = (pow (succ (succ (succ (zero )))) (succ (succ (zero ))) (end )(0)); // 3^2 = 9 getId('result').innerHTML = foo; °°} _p Don't you see a strange resemblance between the last previous lines and a code LISP ? {p Sources : {a {@ href="http://dankogai.typepad.com/blog/2006/03/lambda_calculus.html"} lambda_calculus }, {a {@ href="http://matt.might.net/articles/implementation-of-recursive-fixed-point-y-combinator-in-javascript-for-memoization/"} memoization }, {a {@ href="http://pspace.org/articles/68-the-untyped-lambda-calculus"} pspace.org } ,...}