計算機プログラムの構造と解釈 第二版 P226 問題4.11

フレームの構造を変える問題。
ということで、いじる部分は

  • make-frame
  • frame-variables
  • frame-values
  • add-binding-to-frame!

今は変数のリストと、値のリストが対になっているモノだ。
こいつを、名前と値の対にしたい。

((a b c d) 1 2 3 4)

これからこうしたい。

((a . 1) (b . 2) (c .3) (d . 4))


実装

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

;;;実装
(load "./modules/4th.scm")
(load "./modules/let.scm")


(define (make-frame variables values)
  (define (make-frame-iter variables values)
    (if (null? variables)
        '()
        (cons (cons (car variables)
                    (car values))
              (make-frame-iter (cdr variables)
                               (cdr values)))))
  (make-frame-iter variables values))

(define (frame-variables frame)
  (if (null? frame)
      '()
      (cons (caar frame)
            (frame-variables (cdr frame)))))

(define (frame-values frame)
  (if (null? frame)
      '()
      (cons (cdar frame)
            (frame-values (cdr frame)))))

(define (add-binding-to-frame! var val frame)
  (define (frame-end frame)
    (if (null? (cdr frame)) frame
      (frame-end (cdr frame))))
  (set-cdr! (frame-end frame) (cons (cons var val) '())))

;;test
(define frame (make-frame '(a b c d) '(1 2 3 4)))

(display "frame:")
(print frame)

(display "(frame-variables frame):")
(print (frame-variables frame))

(display "(frame-values frame):")
(print (frame-values frame))

(add-binding-to-frame! 'e 5 frame)

(display "frame:")
(print frame)

(define the-global-environment (setup-environment))
(driver-loop)


実行

frame:((a . 1) (b . 2) (c . 3) (d . 4))
(frame-variables frame):(a b c d)
(frame-values frame):(1 2 3 4)
frame:((a . 1) (b . 2) (c . 3) (d . 4) (e . 5))


;;; M-Eval input:
(define (hoge x)
(let ((y 100) (z 2))
(+ y (* x z))))

;;; M-Eval value:
ok

;;; M-Eval input:
(hoge 1)

;;; M-Eval value:
102

始めの方は環境のテスト。
letを実行してちゃんと動作してるから、大丈夫っぽい。