計算機プログラムの構造と解釈 第二版 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を実行してちゃんと動作してるから、大丈夫っぽい。