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