さかもとのブログ

つらつらと

SICP演習問題5.41

(define (first-frame env)
  (car env))
(define (first-variable frame)
  (car frame))
(define (find-variable variable env)
  (let ((frame-num 0)
        (variable-num 0))
    (define (scan-frame env)
      (if (null? env)
          '()
          (let ((frame (first-frame env)))
            (if (member variable frame)
                frame
                (begin
                  (set! frame-num (+ frame-num 1))
                  (scan-frame (cdr env)))))))
    (define (scan-variable frame)
      (if (null? frame)
          'not-found
          (let ((var (first-variable frame)))
            (if (eq? variable var)
                'done
                (begin
                  (set! variable-num (+ variable-num 1))
                  (scan-variable (cdr frame)))))))
    (let ((frame (scan-frame env)))
      (let ((variable (scan-variable frame)))
        (if (eq? variable 'not-found)
            variable
            (list frame-num variable-num))))))
実行
(find-variable 'y '((y z) (a b c d e) (x y)))
;=> (0 0)