0

第 78 页的经验丰富的计划者对leftmost和的定义如下lm

(define leftmost
  (lambda (l)
    (letcc skip
      (lm l skip))))

(define lm
  (lambda (l out)
    (cond
      ((null? l) (quote ()))
      ((atom? (car l)) (out (car l)))
      (else (let ()
              (lm (car l) out)
              (lm (cdr l) out))))))

在下一页上,它对值部分中有多个表达式进行了以下说明。例如,我不明白它如何leftmost工作的解释(() a)

当 (let ...) 在其值部分有两个表达式时,我们必须首先确定第一个表达式的值。如果它有一个,我们忽略它并确定第二个表达式的值。”

4

1 回答 1

1

关键是out在这种情况下是一个延续。与过程不同,延续一旦被调用就不会返回。

因此, 中的两个表达式let按顺序执行:首先,(lm (car l) out),然后(lm (cdr l) out)。因为out是一个延续,并且在遇到原子时调用它,所以(lm (car l) out)如果在(car l). 所以(lm (cdr l) out)只有在没有原子的情况下才会发生(car l)---你的例子就是这种情况(() a)

于 2013-11-13T14:04:17.600 回答