Y combinator: Difference between revisions

m
Line 3,742:
<lang M2000 Interpreter>
Module Ycombinator {
\\ y() return value. no use of closure
y=lambda (g, x)->g(g, x)
Print y(lambda (g, n as decimal)->if(n=0->1, n*g(g, n-1)), 10)=3628800 ' true
Print y(lambda (g, n)->if(n<=1->n,g(g, n-1)+g(g, n-2)), 10)=55 ' true
\\ Using closure in y, y() return function
y=lambda (g)->lambda g (x) -> g(g, x)
fact=y((lambda (g, n as decimal)-> if(n=0->1, n*g(g, n-1))))
Print fact(6)=720, fact(24)=620448401733239439360000@
fib=y(lambda (g, n)->if(n<=1->n, g(g, n-1)+g(g, n-2)))
Print fib(10)=55
}
Ycombinator
</lang>
Line 3,759:
<lang M2000 Interpreter>
Module Checkit {
Rem {
\\ all lambda arguments passed by value in this example
\\ There is no recursion in these lambdas
\\ Y combinator make argument f as closure, as a copy of f
Y combinator make argument f \\as m(mclosure, argument) pass as first argument a copy of mf
m(m, argument) pass as first argument a copy of m
\\ so never a function, here, call itself, only call a copy who get it as argument before the call.
Y=lambda (f)-> {
}
=lambda f (x)->f(f,x)
Y=lambda (f)-> {
}
fac_step =lambda f (m, nx)-> {f(f,x)
}
if n<2 then {
fib_step fac_step=lambda (m, n)-> {
=1
if n<2 then =1 else =n*m(m, n-1)
} else {
}
=n*m(m, n-1)
fac=Y(fac_step)
}
fib fib_step=lambda (m, n) -> {
}
if n<=1 then =n else =m(m, n-1)+m(m, n-2)
fac=Y(fac_step)
}
fib_step=lambda (m, n)-> {
fib=Y(fib_step)
if n<=1 then {
For i=1 to 10 {
=n
Print fib(i), fac(i)
} else {
}
=m(m, n-1)+m(m, n-2)
}
}
fib=Y(fib_step)
For i=1 to 10
Print fib(i), fac(i)
Next i
}
Checkit
// same but more compact
Module Checkit {
fac=lambda (f)->{=lambda f (x)->f(f,x)}(lambda (m, n)->{=if(n<2->1,n*m(m, n-1))})
fib=lambda (f)->{=lambda f (x)->f(f,x)}(lambda (m, n)->{=if(n<=1->n,m(m, n-1)+m(m, n-2))})
For i=1 to 10
Print fib(i), fac(i)
Next i
Checkit
 
Module CheckRecursion {
fac=lambda (n) -> {
if n<2 then {=1 else =n*Lambda(n-1)
}
=1
fib=lambda (n) -> {
} else {
if n<=1 then =n else =lambda(n-1)+lambda(n-2)
=n*Lambda(n-1)
}
}
For i=1 to 10:Print fib(i), fac(i):Next
}
fib=lambda (n) -> {
if n<=1 then {
=n
} else {
=lambda(n-1)+lambda(n-2)
}
}
For i=1 to 10
Print fib(i), fac(i)
Next i
}
CheckRecursion
404

edits