eopl 第五、六两章谈的就是这个问题。
我写了一个 python 版本的程序,先挖个坑,然后等彻底看完再补上。
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 # the cps version 5 def s(n, f): 6 if n < 1: 7 return f(n) 8 return s(n-1, 9 lambda x: f(x + n)) 10 11 # the trampoline version 12 def t_s(n, f): 13 if n < 1: 14 return lambda :f(n) 15 return lambda : t_s(n-1, lambda x: f(x + n)) 16 17 def trampoline(f): 18 while hasattr(f, '__call__'): 19 f = f() 20 return f 21 22 if __name__ == '__main__': 23 print s(10, lambda x: x) 24 print trampoline(t_s(10, lambda x: x))
下面是一个稍微复杂的例子,计算 fibonacci
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 def trampoline(f): 5 while hasattr(f, '__call__'): 6 f = f() 7 return f 8 9 # the fibonacci 10 def fib_cps(n, f): 11 """ 12 13 Arguments: 14 - `n`: the number of fibonacci 15 - `f`: the contiunation 16 """ 17 if n < 2: 18 return f(1) 19 return fib_cps((n-1), 20 lambda x: fib_cps((n-2), 21 lambda y: f(x + y))) 22 23 def fib_tramp(n, f): 24 if n < 2: 25 return lambda : f(1) 26 return lambda : fib_tramp(n-1, 27 lambda x: lambda : fib_tramp(n-2, 28 lambda y: lambda: f(x + y))) 29 30 31 32 if __name__ == '__main__': 33 print fib_cps(10, lambda x: x) 34 print trampoline(fib_tramp(10, lambda x: x))