Python
29 Dec 2010
 
 
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Z = lambda worker: (lambda x: worker(lambda *args: x(x)(*args)))(lambda x: worker(lambda *args: x(x)(*args)))
fact = lambda f: lambda x: 1 if x == 0 else x * f(x-1)
def fix1(worker):
return (lambda x: worker(lambda *args: x(x)(*args)))(lambda x: worker(lambda *args: x(x)(*args)))
def fix2(worker):
def left(x):
return worker(lambda *args: x(x)(*args))
def right(x):
return worker(lambda *args: x(x)(*args))
return left(right)
def fix3(worker):
def step(x):
return worker(lambda *args: x(x)(*args))
return step(step)
def fix4(worker):
def step():
def recursor(*args):
return step()(*args)
return worker(recursor)
return step()
def defact(recursor):
def worker(x):
return 1 if x == 0 else x * recursor(x-1)
return worker
print '!', fix4(defact)(5)
#for fp_combinator in reversed((Z, fix1, fix2, fix3, fix4)):
# print fp_combinator.__name__, fp_combinator(defact)(5) == 120