【发布时间】:2014-08-03 11:14:22
【问题描述】:
我有一个学校项目,我应该为它优化一个 Scheme 的编译器/评估器。 任务是尽可能实现尾调用优化。
我知道已知的尾调用优化如下所示:
(define (f x)
<send some rockets into space>
(f (+ x 1)))
但是,我也在考虑评估尾部位置的操作数。假设如下:
; The function
(define (f a b c)
<send some monkeys into space>
1)
; Call the function with (f 3 4 5)
(f (+ 1 2) (begin (define x 4) x) 5))
评估操作数(+ 1 2)、(begin (define x 4)) 和5 可以在尾部位置完成,对吧?
每个操作数都在它们自己的环境中进行评估。我尝试使用 DrRacket 中的常规 R5RS 并使用以下表达式:
(+ (begin (define x 5) x) x)
如果在相同的环境中计算操作数,我将能够将第一个操作数中定义的x 作为第二个操作数传递。然而这是不可能的。
那么,我假设每个操作数都可以在尾部位置进行评估是否正确?
【问题讨论】:
标签: scheme evaluation tail-recursion