Крайний левый и лм в закаленного Schemer
Опытный интриган на стр. 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)
,
Когда a (let...) имеет два выражения в своей части значения, мы должны сначала определить значение первого выражения. Если он есть, мы его игнорируем и определяем значение второго выражения."
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)
,