2014年7月3日木曜日

開発環境

計算機プログラムの構造と解釈[第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.24.を解いてみる。

その他参考書籍

問題 3.24.

コード(BBEdit, Emacs)

table2.scm

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

(define (make-table)
  (define (assoc key records)
    (cond ((null? records) #f)
          ((same-key? key (caar records)) (car records))
          (else (assoc key (cdr records)))))
  (let ((local-table (list '*table*)))
    (define (lookup key-1 key-2)
      (let ((subtable (assoc key-1 (cdr local-table))))
        (if subtable
            (let ((record (assoc key-2 (cdr subtable))))
              (if record
                  (cdr record)
                  #f))
            #f)))
    (define (insert! key-1 key-2 value)
      (let ((subtable (assoc key-1 (cdr local-table))))
        (if subtable
            (let ((record (assoc key-2 (cdr subtable))))
              (if record
                  (set-cdr! record value)
                  (set-cdr! subtable
                            (cons (cons key-2 value)
                                  (cdr subtable)))))
            (set-cdr! local-table
                      (cons (list key-1
                                  (cons key-2 value))
                            (cdr local-table)))))
      'ok)
    (define (dispatch m)
      (cond ((eq? m 'lookup-proc) lookup)
            ((eq? m 'insert-proc!) insert!)
            (else (error "Unknown operation -- TABLE" m))))
    dispatch))

sample3_24.scm

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

(load "./table2.scm")

(define (same-key? key-1 key-2)
  (< (abs (- key-1 key-2)) 10))

(define t (make-table))

(print ((t 'insert-proc!) 1 2 'a))      ; ok

(print ((t 'lookup-proc) 5 6))          ; a
(print ((t 'lookup-proc) 11 2))         ; #f
(print ((t 'lookup-proc) 5 12))         ; #f
(print ((t 'lookup-proc) 11 12))        ; #f

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

$ ./sample3_24.scm 
ok
a
#f
#f
#f
$

0 コメント:

コメントを投稿