2014年5月11日日曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.4(抽象データの多重表現)、2.4.3(データ主導プログラミングと加法性)、問題 2.73-b.を解いてみる。

その他参考書籍

問題 2.73-b.

コード(BBEdit, Emacs)

sample.scm

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

;; 和の微分手続きとそれをを設定するのに必要な補助プログラム
(define (install-sum-package)
  (define (deriv exp var)
    (make-sum (deriv (addend exp)
                     var)
              (deriv (augend exp)
                     var)))
  (define (make-sum a1 a2)
    (cond ((=number? a1 0) a2)
          ((=number? a2 0) a1)
          ((and (number? a1)
                (number? a2))
           (+ a1 a2))
          (else (list '+ a1 a2))))
  (define (addend e)
    (cadr e))
  (define (augend e)
    (caddr e))
  (define (=number? exp num)
    (and (number? exp)
         (= exp num)))

  ;; システムの他の部分とのインターフェース
  (put 'deriv '+ deriv)
  (put 'make-sum '+ make-sum)
  (put '=number? '+ =number?)
  'done)

(define (make-sum a1 a2)
  ((get 'make-sum '+) a1 a2))

(define (=number? exp num)
  ((get 'number? '+) exp num))

;; 積の微分手続きとそれをを設定するのに必要な補助プログラム
(define (install-product-package)
  (define (deriv exp var)
    (make-sum
     (make-product (multiplier exp)
                   (deriv (multiplicand exp)
                          var))
     (make-product (deriv (multiplier exp)
                          var)
                   (multiplicand exp))))
  (define (make-product m1 m2)
    (cond ((or (=number? m1 0)
               (=number? m2 0))
           0)
          ((=number? m1 1) 1)
          ((=number? m2 1) 1)
          ((and (number? m1)
                (number? m2))
           (* m1 m2))
          (else (list '* m1 m2))))
  (define (multiplier p)
    (cadr p))
  (define (multiplicand p)
    (caddr p))
  
  ;; システムの他の部分とのインターフェース
  (put 'deriv '* deriv)
  (put 'make-product '* make-product)
  'done)

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

$ ./sample.scm
$

0 コメント:

コメントを投稿