lambdaspeech
::
javascript
1
[
pages
][
login
][
load
]
_h1 javascript _p Following the λ-calculus style, we build data and control structures, for instance pairs, lists and recursion, exclusively using {b lambda}s and {b def}s without any {b '{if bool then one else two}} structure. We begin with {b speech} and translate code into the {b JS} syntax. _h2 1) using speech {prewrap °° 1) words {def pair {lambda {:x :y :z} {:z :x :y}}} {def left {lambda {:z} {:z {lambda {:x :y} :x}}}} {def right {lambda {:z} {:z {lambda {:x :y} :y}}}} {def HI {pair hello world}} {left {HI}} -> hello {right {HI}} -> world {def nil {lambda {:f :x} :x}} {def isnil {lambda {:z} {:z {lambda {:x} right} left}}} {isnil nil} -> left {isnil {HI}} -> right {def list.disp {lambda {:list} {{{isnil :list} {pair {lambda {:list} .} {lambda {:list} {left :list} {list.disp {right :list}} }}} :list}}} {def fruits {pair apple {pair banana {pair lemon {pair grapes {pair orange nil}}}}}} {list.disp {fruits}} -> apple banana lemon grapes orange . 2) numbers as lists {def succ {lambda {:n} {pair | :n}}} {def pred {lambda {:n} {{{isnil :n} {pair {lambda {:n} :n} {lambda {:n} {right :n}} }} :n}}} {def zero nil} {def one {succ {zero}}} {def two {succ {one}}} {def three {succ {two}}} {def four {succ {three}}} {def five {succ {four}}} {def six {succ {five}}} {def add {lambda {:a :b} {{{isnil :b} {pair {lambda {:a :b} :a} {lambda {:a :b} {add {succ :a} {pred :b}}} }} :a :b}}} {def mul {def mul.rec {lambda {:a :b :c} {{{isnil :b} {pair {lambda {:a :b :c} :a} {lambda {:a :b :c} {mul.rec {add :a :c} {pred :b} :c}} }} :a :b :c}}} {lambda {:a :b} {mul.rec :a {pred :b} :a}}} {def fac {lambda {:n} {{{isnil :n} {pair {lambda {:n} {one}} {lambda {:n} {mul :n {fac {pred :n}}}} }} :n}}} {def tfac {lambda {:a :b} {{{< :b 1} {pair {lambda {:a :b} :a} {lambda {:a :b} {tfac {* :a :b} {- :b 1}} }}} :a :b}}} {list.disp {tfac {one six}}} -> | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | . °°} _p Stack overflow after 8 or 9. _h2 2) using javascript _p The translation must follow these points: _ul Javascript has closures but no native partial application, we have to modify slightly the speech {b pair} function. _ul words must be protected between quotes. _ul everything else is identical. {pre °° // 1) words var pair = function(x,y) { return function(z) { return z(x,y) } }; var left = function(z) { return z( function(x,y) { return x }) }; var right = function(z) { return z( function(x,y) { return y }) }; var nil = function(s,z) { return z }; var isnil = function(n) { return n( function(x) { return right }, left ) }; var list_disp = function(list) { return isnil(list)( pair( function(list) { return '.' }, function(list) { return left(list) + ' ' + list_disp(right(list)) } ))(list) }; var fruits = pair( 'apple', pair( 'banana', pair( 'lemon', pair( 'grapes', pair( 'orange', nil))))); list_disp( fruits ); // -> apple banana lemon grapes orange . // 2) numbers as lists var succ = function(n) { return pair( '|', n ) }; var pred = function(n) { return isnil(n)( pair( function(n) { return n }, function(n) { return right(n) } ))(n) }; var zero = nil; var one = succ(zero); var two = succ(one); var three = succ(two); var four = succ(three); var five = succ(four); var six = succ(five); var add = function(a,b) { return isnil(b)( pair( function(a,b) { return a }, function(a,b) { return add( succ(a), pred(b) ) } ))(a,b) }; var mul = function(a,b) { var mul_rec = function(a,b,c) { return isnil(b)( pair( function(a,b,c) { return a }, function(a,b,c) { return mul_rec( add(a,c), pred(b), c ) } ))(a,b,c) }; return mul_rec( a, pred(b), a ) }; var fac = function(n) { return isnil(n)( pair( function(n) { return one }, function(n) { return mul( n, fac( pred(n) )) } ))(n) }; var tfac = function(a,b) { return isnil(b)( pair( function(a,b) { return a }, function(a,b) { return tfac( mul(a,b), pred(b) ) } ))(a,b) }; var display = function() { document.getElementById('output').innerHTML = tfac( one, six ); }; // setTimeout( display, 1 ); °°} _p Output from javascript {prewrap | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | . } _p Much more faster than speech but stack overflow after 8 or 9, asame. Syntaxes are similar, but the speech's syntax looks more uniform, more simple. {script ;; var pair = function(x,y) { return function(z) { return z(x,y) } }; var left = function(z) { return z( function(x,y) { return x }) }; var right = function(z) { return z( function(x,y) { return y }) }; var nil = function(s,z) { return z }; var isnil = function(n) { return n( function(x) { return right }, left ) }; var list_disp = function(list) { return isnil(list)( pair( function(list) { return '.' }, function(list) { return left(list) + ' ' + list_disp(right(list)) } ))(list) }; var fruits = pair( 'apple', pair( 'banana', pair( 'lemon', pair( 'grapes', pair( 'orange', nil))))); // numbers var succ = function(n) { return pair( '|', n ) }; var pred = function(n) { return isnil(n)( pair( function(n) { return n }, function(n) { return right(n) } ))(n) }; var zero = nil; var one = succ(zero); var two = succ(one); var three = succ(two); var four = succ(three); var five = succ(four); var six = succ(five); var add = function(a,b) { return isnil(b)( pair( function(a,b) { return a }, function(a,b) { return add( succ(a), pred(b) ) } ))(a,b) }; var mul = function(a,b) { var mul_rec = function(a,b,c) { return isnil(b)( pair( function(a,b,c) { return a }, function(a,b,c) { return mul_rec( add(a,c), pred(b), c ) } ))(a,b,c) }; return mul_rec( a, pred(b), a ) }; var fac = function(n) { return isnil(n)( pair( function(n) { return one }, function(n) { return mul( n, fac( pred(n) )) } ))(n) }; var tfac = function(a,b) { return isnil(b)( pair( function(a,b) { return a }, function(a,b) { return tfac( mul(a,b), pred(b) ) } ))(a,b) }; var display = function() { document.getElementById('output').innerHTML = list_disp( tfac( one,six ) ); }; // setTimeout( display, 1 ); }
lambdaspeech v.20180812