你会如何使用套装!在一个简单的过程中,如果从左到右计算+的参数,如果从右到左计算参数,则评估(+(f 0)(f 1))将返回0?
答案 0 :(得分:6)
最简单的方法可能是存储一些外部状态,并且f的实现会影响它的内容。
(define x 0)
(define (f n) (let ((tmp x)) (set! x n) tmp))
因此,x最初为0,每次调用f都将返回x的当前值,并将参数保存为x的新值。因此,(f 0)后跟(f 1)将返回0,最终x值为1.而评估(f 1)后跟(f 0)将产生0然后是1,最终x为0。 / p>
答案 1 :(得分:-1)
使用call/cc。
(define (f)
(call/cc
(lambda (c) (+ (c 0) (c 1)))))
(write (f))
在+
的任一参数中调用c会导致f
立即返回,产生0或1,具体取决于首先评估哪个参数。
但我怀疑它总是从左到右评估,因此返回0。