문제

The seasoned schemer on page 78 has the below definition of leftmost and 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))))))

On the next page it has the following explanation of having multiple expressions in the value part. I don't understand the explanation of how it makes leftmost work on, for example (() a).

When a (let ...) has two expressions in its value part, we must first determine the value of the first expression. If it has one, we ignore it and determine the value of the second expression."

도움이 되었습니까?

해결책

The key to this is that out in this case is a continuation. Continuations, unlike procedures, do not return once invoked.

So, the two expressions in let are executed sequentially: first, (lm (car l) out), then (lm (cdr l) out). Because out is a continuation, and it's invoked when an atom is encountered, the (lm (car l) out) will not return if an atom is encountered in the (car l). So the (lm (cdr l) out) will only happen if there are no atoms in (car l)---which is the case for your example of (() a).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top