開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力, オブジェクトおよび状態)、3.3(可変データでのモデル化)、3.3.3(表の表現)、二次元の表、局所表の作り方の問題 3.26を解いてみる。
その他参考書籍
問題3.26
コード(BBEdit)
sample.scm
(define (entry tree) (car tree))
(define (left-branch tree) (cadr tree))
(define (right-branch tree) (caddr tree))
(define (make-tree entry left right)
(list entry left right))
(define (make-table)
(let ((local-table '()))
(define (lookup keys)
(define (inner keys table)
(if (null? table)
false
(let ((x (entry table))
(key (car keys)))
(let ((entry-key (car x)))
(cond ((= key entry-key)
(if (null? (cdr keys))
(let ((value (caddr x)))
(if (null? value)
false
value))
(inner (cdr keys) (cadr x))))
((< key entry-key)
(inner keys (left-branch table)))
((> key entry-key)
(inner keys (right-branch table))))))))
(inner keys local-table))
(define (insert! keys value)
(define (inner keys value table)
(let ((key (car keys))
(subkeys (cdr keys)))
(if (null? table)
(if (null? subkeys)
(make-tree (list key
'()
value)
'()
'())
(make-tree (list key
(inner subkeys value '())
'())
'()
'()))
(let ((x (entry table)))
(cond ((= key (car x))
(if (null? subkeys)
(begin (set-car! (cddr x) value)
(make-tree x
(left-branch table)
(right-branch table)))
(make-tree (list key
(inner subkeys value (cadr x))
(caddr x))
(left-branch table)
(right-branch table))))
((< key (car x))
(make-tree x
(inner keys
value
(left-branch table))
(right-branch table)))
((> key (car x))
(make-tree x
(left-branch table)
(inner keys
value
(right-branch table)))))))))
(set! local-table (inner keys value local-table))
'ok)
(define (dispatch m)
(cond ((eq? m 'lookup-proc) lookup)
((eq? m 'insert-proc!) insert!)
(else (error "Unknown operation -- TABLE" m))))
dispatch))
(define operation-table (make-table))
(define get (operation-table 'lookup-proc))
(define put (operation-table 'insert-proc!))
入出力結果(Terminal, REPL(Read, Eval, Print, Loop))
1 ]=> (put (list 1) 'a) ;Value: ok 1 ]=> (put (list 1 2) 'b) ;Value: ok 1 ]=> (put (list 1 2 3) 'c) ;Value: ok 1 ]=> (put (list 2 3 4) 'd) ;Value: ok 1 ]=> (get (list 1)) ;Value: a 1 ]=> (get (list 1 2)) ;Value: b 1 ]=> (get (list 1 2 3)) ;Value: c 1 ]=> (get (list 2 3 4)) ;Value: d 1 ]=> (put (list 1 2 3) 'z) ;Value: ok 1 ]=> (get (list 1 2 3)) ;Value: z
前問での問題を解決しつつコードを書けた。
0 コメント:
コメントを投稿