最左边和lm在经验丰富的Schemer

时间:2013-11-13 11:04:41

标签: scheme let seasoned-schemer

第78页的经验丰富的阴谋家具有以下leftmostlm的定义。

(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 ...)在其值部分中有两个表达式时,我们必须首先确定第一个表达式的值。如果它有一个,我们忽略它并确定第二个表达式的值。“

1 个答案:

答案 0 :(得分:1)

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

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