Lambda calculus in JavaScript syntax

Syntax

LambdaJavaScriptJavaScript 1.8
variablexxx
abstractionλx.M or \x.Mfunction(x){ return M }function(x) M
application((M) N)(M)(N)(M)(N)
declaration-var a = M;let a = M;
syntactic sugar
λx…yz.M
for λx…y.λz.M
λx.M N
for λx.(M N)
(x M)
for ((x) M)
(L M N)
for ((L M) N)
function(x,…,y,z){ return M }
for function(x,…,y){ return function(z){ return M } }
x(M)
for (x)(M)
L(M)(N)
for (L(M))(N)
function(x,…,y,z) M
for function(x,…,y) function(z) M
x(M)
for (x)(M)
L(M)(N)
for (L(M))(N)

Example

Exercise 1
          var I = function(t){ return t };
var C_I = function(s,t) { return t };
var C_r = function(s) {return r};
var K = function(r,s){ return r };
        

run Exercise 1

Exercise 2
          var T = function (a, b) {return a};
var F = function(a, b) {return b};
        

run Exercise 2

Exercise 3
          var _0 = function(s,z){ return z };
var _1 = function(s,z){ return s(z) };
var _2 = function(s,z){ return s(s(z)) };
var _3 = function(s,z){ return s(s(s(z))) };

var successor = function(n,s,z) {return s(n(s)(z))};
var add = function(m,n,s,z){ return m(s)(n(s)(z)) };
var multiply = function(m,n,s) { return m(n(s)) };
        

run Exercise 3

Exercise 4
          var Y = function(f){ return (function(x){ return f((x)(x)) })(function(x){ return f((x)(x)) }) };

var _0 = function(s,z){ return z };
var _1 = function(s,z){ return s(z) };
var _2 = function(s,z){ return s(s(z)) };
var _3 = function(s,z){ return s(s(s(z))) };

var t = function(x,y){ return x }; // true
var f = function(x,y){ return y }; // false
var if0 = function(n){ return n(function(x){ return f })(t) }; // if n equals to _0

var mul = function(m,n,s,z){ return n(m(s))(z) };
var pred = function(n,s,z){ return n(function(f,g){ return g(f(s)) })(function(x){ return z })(function(x){ return x }) };

var F = function(r,n){ return if0(n)(_1)(mul(n)(r(pred(n)))) };
var fact = Y(F);
        

run Exercise 4

Source code

See: http://github.com/tarao/LambdaJS