[Back]

4.2 Scheme的变形——惰性求值

4.25

在应用序的语言中,由于严格求值的存在,即使是到达1也不会停止,而会继续求求值第一个表达式。

而在正则序语言中则可以工作的良好。

4.26

unless实际上就是个调换了执行顺序的if,实现如下

(define (eval-unless exp env)
    (if (false? (eval (if-predicate exp) env))
        (eval (if-consequent exp) env)
        (eval (if-alternative exp) env)))

例子:将其作为map等高阶函数的参数时。

4.27

第一次调用count,得到值0

调用w得到10

调用count得到1,因为外面的赋值结果会被里面的覆盖,槽中的count传入都为0

4.28

如果我们不将运算符求值,传入高阶函数的过程会被打入槽标记,再进一步进入apply的时候就会出错。

4.29

典型的运用记忆优势的就是斐波那契了。

不带记忆的话,id会被求值两次,因此也就count变为2,否则为1

4.30

因为这个问题决定于归纳到基本过程的方式,我们的槽结构并没有丢失函数的处理,而仅仅是推迟了。

(1 2) 1

(1 2) (1 2)

显然不会有影响

我觉得一个纯的惰性求值语言应该有更有效地处理副作用的方法,或者根本就是抛弃它,而不是破坏语言的纯粹性。(更好的方法寻找?)

4.31

搁置

4.32

比如说,我们现在需要整数立方序列的第114514项,那么前114513项都不需要求值。

4.33

搁置

4.34

搁置