2014年7月5日土曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力、オブジェクトおよび状態)、3.3(可変データでのモデル化)、3.3.3(表の表現)、二次元の表、局所表の作り方、問題 3.26.を解いてみる。

その他参考書籍

問題 3.26.

コード(BBEdit, Emacs)

sample3_26.scm

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

(define (make-table)
  (define key-= =)
  (define key-< <)
  (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 (adjoin-set x set)
    (if (null? set)
        (make-tree x '() '())
        (let ((e (entry set)))
          (if (key-< (car x) (car e))
              (make-tree e
                         (adjoin-set x (left-branch set))
                         (right-branch set))
              (make-tree e
                         (left-branch set)
                         (adjoin-set x (right-branch set)))))))
  (let ((local-table '()))
    (define (lookup-record key table)
      (if (null? table)
          #f
          (let ((record (entry table)))
            (let ((k (car record)))
              (cond ((key-= key k) record)
                    ((key-< key k)
                     (lookup-record key (left-branch table)))
                    (else
                     (lookup-record key (right-branch table))))))))
    (define (lookup key)
      (let ((record (lookup-record key local-table)))
        (if record
            (cdr record)
            #f)))
    (define (insert! key value)
      (let ((record (lookup-record key local-table)))
        (if record
            (set-cdr! record value)
            (set! local-table (adjoin-set (cons key value)
                                          local-table))))
      'ok)
    (define (print-tree tree)
      (define (display-indent n)
        (if (= n 0)
            (display "")
            (begin (display "        ")
                   (display-indent (- n 1)))))
      (define (inner tree indent)
        (if (null? tree)
            (begin (display-indent indent)
                   (print "()"))
            (begin (inner (left-branch tree)
                          (+ indent 1))
                   (begin (display-indent indent)
                          (print (entry tree)))
                   (inner (right-branch tree)
                          (+ indent 1)))))
      (inner tree 0))

    (define (dispatch m)
      (cond ((eq? m 'lookup-proc) lookup)
            ((eq? m 'insert-proc!) insert!)
            ((eq? m 'p) (print-tree local-table))
            (else (error "Unknown operation -- TABLE" m))))
    dispatch))

test_sample3_26.scm

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

(load "./sample3_26.scm")

(define t (make-table))

(for-each (lambda (pair)
            (print ((t 'insert-proc!) (car pair) (cdr pair)))
            (t 'p))
          (list (cons 5 'a)
                (cons 7 'b)
                (cons 9 'c)
                (cons 6 'd)
                (cons 8 'e)
                (cons 10 'f)
                (cons 1 'g)
                (cons 2 'h)
                (cons 3 'i)
                (cons 4 'j)))

(for-each (lambda (key)
            (print key ": " ((t 'lookup-proc) key)))
          (list 1 2 3 4 5
                11 12 13 14 15))

(for-each (lambda (pair)
            (print ((t 'insert-proc!) (car pair) (cdr pair)))
            (t 'p))
          (list (cons 5 'j)
                (cons 7 'i)
                (cons 9 'h)
                (cons 6 'g)
                (cons 8 'f)
                (cons 10 'e)
                (cons 1 'd)
                (cons 2 'c)
                (cons 3 'b)
                (cons 4 'a)))

(for-each (lambda (key)
            (print key ": " ((t 'lookup-proc) key)))
          (list 1 2 3 4 5
                11 12 13 14 15))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./test_sample3_26.scm 
ok
        ()
(5 . a)
        ()
ok
        ()
(5 . a)
                ()
        (7 . b)
                ()
ok
        ()
(5 . a)
                ()
        (7 . b)
                        ()
                (9 . c)
                        ()
ok
        ()
(5 . a)
                        ()
                (6 . d)
                        ()
        (7 . b)
                        ()
                (9 . c)
                        ()
ok
        ()
(5 . a)
                        ()
                (6 . d)
                        ()
        (7 . b)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                        ()
ok
        ()
(5 . a)
                        ()
                (6 . d)
                        ()
        (7 . b)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                ()
(5 . a)
                        ()
                (6 . d)
                        ()
        (7 . b)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                        ()
(5 . a)
                        ()
                (6 . d)
                        ()
        (7 . b)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                ()
(5 . a)
                        ()
                (6 . d)
                        ()
        (7 . b)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . a)
                        ()
                (6 . d)
                        ()
        (7 . b)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                                ()
                        (10 . f)
                                ()
1: g
2: h
3: i
4: j
5: a
11: #f
12: #f
13: #f
14: #f
15: #f
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . d)
                        ()
        (7 . b)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . d)
                        ()
        (7 . i)
                                ()
                        (8 . e)
                                ()
                (9 . c)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . d)
                        ()
        (7 . i)
                                ()
                        (8 . e)
                                ()
                (9 . h)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . g)
                        ()
        (7 . i)
                                ()
                        (8 . e)
                                ()
                (9 . h)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . g)
                        ()
        (7 . i)
                                ()
                        (8 . f)
                                ()
                (9 . h)
                                ()
                        (10 . f)
                                ()
ok
                ()
        (1 . g)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . g)
                        ()
        (7 . i)
                                ()
                        (8 . f)
                                ()
                (9 . h)
                                ()
                        (10 . e)
                                ()
ok
                ()
        (1 . d)
                        ()
                (2 . h)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . g)
                        ()
        (7 . i)
                                ()
                        (8 . f)
                                ()
                (9 . h)
                                ()
                        (10 . e)
                                ()
ok
                ()
        (1 . d)
                        ()
                (2 . c)
                                ()
                        (3 . i)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . g)
                        ()
        (7 . i)
                                ()
                        (8 . f)
                                ()
                (9 . h)
                                ()
                        (10 . e)
                                ()
ok
                ()
        (1 . d)
                        ()
                (2 . c)
                                ()
                        (3 . b)
                                        ()
                                (4 . j)
                                        ()
(5 . j)
                        ()
                (6 . g)
                        ()
        (7 . i)
                                ()
                        (8 . f)
                                ()
                (9 . h)
                                ()
                        (10 . e)
                                ()
ok
                ()
        (1 . d)
                        ()
                (2 . c)
                                ()
                        (3 . b)
                                        ()
                                (4 . a)
                                        ()
(5 . j)
                        ()
                (6 . g)
                        ()
        (7 . i)
                                ()
                        (8 . f)
                                ()
                (9 . h)
                                ()
                        (10 . e)
                                ()
1: d
2: c
3: b
4: a
5: j
11: #f
12: #f
13: #f
14: #f
15: #f
$

0 コメント:

コメントを投稿