2015年11月1日日曜日

開発環境

  • OS X El Capitan - Apple (OS)
  • Emacs(Text Editor)
  • Scheme (プログラミング言語)
  • kscheme (github) (処理系)

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

その他参考書籍

問題3.25.

コード(Emacs)

(begin
  (define (print obj)
    (display obj)
    (newline))

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

  ;; 剰余類分解 (同値関係)
  (define operation-table (make-table (lambda (a b)
                                        (= (floor-remainder a 2)
                                           (floor-remainder b 2)))))
  (define get (operation-table 'lookup-proc))
  (define put (operation-table 'insert-proc!))

  (print (put '(1 2) 'a))
  (print (put '(4 3) 'b))
  (print (get '(3 4)))                     ; a
  (print (get '(2 1)))                     ; b
  (print (get '(1 3)))                     ; #f
  (print (get '(4 4)))                     ; #f
  (print (put '(2 4 6 8 10) 'c))
  (print (get '(0 10 100 1000 10000)))     ; c
  )

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

$ ./kscheme sample25.scm # kscheme の修正後回し
ok
error: unbound variable -- a$ 
$ gosh sample25.scm
ok
ok
a
b
#f
#f
ok
c
$ guile < sample25.scm
GNU Guile 2.0.11
Copyright (C) 1995-2014 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
ok
ok
a
b
#f
#f
ok
c
scheme@(guile-user)> 
$ 

0 コメント:

コメントを投稿