aboutsummaryrefslogtreecommitdiff
path: root/languages/j/javascript/lambda-core.js
diff options
context:
space:
mode:
Diffstat (limited to 'languages/j/javascript/lambda-core.js')
-rw-r--r--languages/j/javascript/lambda-core.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/languages/j/javascript/lambda-core.js b/languages/j/javascript/lambda-core.js
new file mode 100644
index 0000000..5b4d7c9
--- /dev/null
+++ b/languages/j/javascript/lambda-core.js
@@ -0,0 +1,55 @@
+// LOGIC
+const _true = x => y => x;
+const _false = x => y => y;
+const _not = b => b(_false)(_true)
+const _and = b1 => b2 => b1(b2)(_false)
+const _or = b1 => b2 => b1(_true)(b2)
+
+// CHURCH NUMERALS
+const _zero = f => x => x;
+const _succ = n => f => x => f(n(f)(x))
+const _pred = n => f => x => n(g => h => h(g(f)))(u => x)(a => a)
+const _one = _succ(_zero)
+
+// HELPERS - not pure lambda calculus
+const readBool = b => console.log(b("t")("f"))
+const readChurch = n => console.log(n(x => x+1)(0))
+
+// -------------------------------------------------
+
+// EXAMPLES
+console.log("LOGIC")
+console.log("---------------")
+console.log("TRUE/FALSE")
+readBool(_true) // t
+readBool(_false) // f
+
+console.log("NOT")
+readBool(_not(_true)) // f
+readBool(_not(_false)) // t
+
+console.log("AND")
+readBool(_and(_true)(_true)) // t
+readBool(_and(_true)(_false)) // f
+readBool(_and(_false)(_true)) // f
+readBool(_and(_false)(_false)) // f
+
+console.log("OR")
+readBool(_or(_true)(_true)) // t
+readBool(_or(_true)(_false)) // t
+readBool(_or(_false)(_true)) // t
+readBool(_or(_false)(_false)) // f
+
+console.log("\nCHURCH NUMERALS")
+console.log("---------------")
+console.log("ZERO/SUCC")
+readChurch(_zero) // 0
+readChurch(_one) // 1
+readChurch(_succ(_one)) // 2
+readChurch(_succ(_succ(_one))) // 3
+
+console.log("PRED")
+readChurch(_pred(_one)) // 0
+readChurch(_pred(_succ(_one))) // 1
+readChurch(_pred(_succ(_succ(_one)))) // 2
+