Крайний левый и лм в закаленного 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),

Другие вопросы по тегам