Y combinator: Difference between revisions

Content deleted Content added
M2000 (talk | contribs)
Line 3,742: Line 3,742:
<lang M2000 Interpreter>
<lang M2000 Interpreter>
Module Ycombinator {
Module Ycombinator {
\\ y() return value. no use of closure
\\ y() return value. no use of closure
y=lambda (g, x)->g(g, x)
y=lambda (g, x)->g(g, x)
Print y(lambda (g, n)->if(n=0->1, n*g(g, n-1)), 10)
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)
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
\\ Using closure in y, y() return function
y=lambda (g)->lambda g (x) -> g(g, x)
y=lambda (g)->lambda g (x) -> g(g, x)
fact=y((lambda (g, n)-> if(n=0->1, n*g(g, n-1))))
fact=y((lambda (g, n as decimal)-> if(n=0->1, n*g(g, n-1))))
Print fact(6), fact(24)
Print fact(6)=720, fact(24)=620448401733239439360000@
fib=y(lambda (g, n)->if(n<=1->n,g(g, n-1)+g(g, n-2)))
fib=y(lambda (g, n)->if(n<=1->n, g(g, n-1)+g(g, n-2)))
Print fib(10)
Print fib(10)=55
}
}
Ycombinator
Ycombinator
</lang>
</lang>
Line 3,759: Line 3,759:
<lang M2000 Interpreter>
<lang M2000 Interpreter>
Module Checkit {
Module Checkit {
Rem {
\\ all lambda arguments passed by value in this example
all lambda arguments passed by value in this example
\\ There is no recursion in these lambdas
There is no recursion in these lambdas
\\ Y combinator make argument f as closure, as a copy of f
\\ m(m, argument) pass as first argument a copy of m
Y combinator make argument f as closure, as a copy of f
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.
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 (m, n)-> {
=lambda f (x)->f(f,x)
}
if n<2 then {
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_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
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 {
Module CheckRecursion {
fac=lambda (n) -> {
fac=lambda (n) -> {
if n<2 then {
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
CheckRecursion