4

你会怎么用set!在一个简单的过程 f 中,如果 (+ (f 0) (f 1)) 的参数是从左到右计算的,那么计算 (+ (f 0) (f 1)) 将返回 0,但如果参数是从右到左计算的,则返回 1?

4

2 回答 2

5

最简单的方法可能是存储一些外部状态并让 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。

于 2008-11-19T00:40:36.197 回答
-1

call/cc

(define (f)
  (call/cc
    (lambda (c) (+ (c 0) (c 1)))))

(write (f))

在任一参数中调用 c+会导致f立即返回,产生 0 或 1,具体取决于首先评估哪个参数。

但我怀疑它总是会从左到右评估并因此返回 0。

于 2009-04-22T08:16:04.953 回答