3

SICP中的练习3.8被描述为blow:

当我们在 1.1.3 节定义评估模型时,我们说过评估表达式的第一步是评估其子表达式。但是我们从未指定子表达式的求值顺序(例如,从左到右或从右到左)。当我们引入赋值时,评估过程参数的顺序会对结果产生影响。定义一个简单的过程 f,如果 + (+ (f 0) (f 1)) 的参数从左到右计算,则计算 (+ (f 0) (f 1)) 将返回 0,但如果参数从右到左计算,则返回 1。

我编写了这个过程f,这样如果我(f x)先调用,它就会x在我f再次调用时返回。但我不知道它为什么起作用。我写的程序是:

(define f
  (let ((s -1))
    (lambda (x)
      (if (= s -1)
          (begin (set! s x)
                 s)
           s))))
4

2 回答 2

2

s其视为仅与您的过程相关联的特殊变量,在其调用之间保持其值。由于您正在通过 SICP,因此应该清楚它是附加程序所在环境的一部分f

第一次用一些 X 调用它时,它会设置sx返回它。下一次,因为sis no longer -1,它总是会 return s,这是x第一次调用时 saved 的值。

> (f 42)  ; s is -1, so 42 is saved into it and returned
42
> (f 10)  ; is is 42, so the 'else' branch of the 'if' is taken
          ; and s is returned without looking at x
42
> (f 20)
42
> 
于 2011-11-28T03:31:01.437 回答
0

有一件重要的事情,当你使用 (define f ....) 而不用括号括住 f 时,你定义了一个value,它的“body”只被评估一次。因此,可变值只初始化一次。它也被生成的 lambda 函数捕获,它可以用它做任何事情,但在其他任何地方都不可见,因为它在我们定义的范围内。

于 2012-08-10T01:38:45.377 回答