Lambda calculus in JavaScript syntax
Syntax
| Lambda | JavaScript | JavaScript 1.8 |
variable | x | x | x |
abstraction | λx.M or \x.M | function(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