2014年5月28日水曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.5(汎用演算のシステム)、2.5.2(異なる方のデータの統合)、強制型変換、型の階層構造、階層構造の不適切さ、問題 2.86.を解いてみる。

その他参考書籍

問題 2.86.

コード(BBEdit, Emacs)

sample.scm

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

(define (add x y) (apply-generic 'add x y))
(define (sub x y) (apply-generic 'sub x y))
(define (mul x y) (apply-generic 'mul x y))
(define (div x y) (apply-generic 'div x y))
(define (square-root x) (apply-generic 'square-root x))
(define (square x) (apply-generic 'square x))
(define (arctangent x) (apply-generic 'arctangent x))
(define (sine x) (apply-generic 'sine x))
(define (cosine x) (apply-generic 'cosine x))

(define (install-rectangular-package)
  (define (real-part z) (car z))
  (define (imag-part z) (cdr z))
  (define (make-from-real-imag x y) (cons x y))
  (define (magnitude z)
    (square-root (add (square (real-part z)))))
  (define (angle z)
    (arctangent (imag-part z) (real-part z)))
  (define (make-from-mag-ang r a)
    (cons (mul r (cosine a)) (mul r (sine a))))

  (define (tag x) (attach-tag 'rectangular x))
  (put 'real-part '(rectangular) real-part)
  (put 'imag-part '(rectangular) imag-part)
  (put 'magnitude '(rectangular) magnitude)
  (put 'angle '(rectangular) angle)
  (put 'make-from-real-imag 'rectangular
       (lambda (x y) (tag (make-from-real-imag x y))))
  (put 'make-from-mag-ang 'rectangular
       (lambda (r a) (tag (make-from-mag-ang r a))))
  'done)

(define (install-polar-package)
  (define (magnitude z) (car z))
  (define (angle z) (cdr z))
  (define (make-from-mag-ang r a) (cons r a))
  (define (real-part z)
    (mul (magnitude z) (cosine (angle z))))
  (define (imag-part z)
    (mul (magnitude z) (sine (angle z))))
  (define (make-from-real-imag x y)
    (cons (square-root (add (square x)
                            (square y)))
          (arctangent y x)))

  (define (tag x) (attach-tag 'polar x))
  (put 'real-part '(polar) real-part)
  (put 'imag-part '(polar) imag-part)
  (put 'magnitude '(polar) magnitude)
  (put 'angle '(polar) angle)
  (put 'make-from-real-imag 'polar
       (lambda (x y) (tag (make-from-real-imag x y))))
  (put 'make-from-mag-ang 'polar
       (lambda (r a) (tag (make-from-mag-ang r a))))
  'done)

(define (install-scheme-number)
  ;; 追加
  (define (square-root x) (sqrt x))
  (define (square x) (* x x))
  (define (arctangent x) (atan x))
  (define (sine x) (sin x))
  (define (cosine x) (cos x))

  ;; 追加
  (define (tag x) (attach-tag 'scheme-number x))
  (put 'square-root '(scheme-number)
       (lambda (x)
         (tag (square-root x))))
  (put 'square '(scheme-number)
       (lambda (x)
         (tag (square x))))
  (put 'arctangent '(scheme-number)
       (lambda (x)
         (tag (arctangent x))))
  (put 'sine '(scheme-number)
       (lambda (x)
         (tag (sine x))))
  (put 'cosine '(scheme-number)
       (lambda (x)
         (tag (cosine x))))
  'done)

(define (install-rational-number)
  ;; 追加
  (define (square-root x)
    (make-rat (sqrt (* (numer x) (numuer x)))
              (sqrt ((* (denom x) (denom x))))))
  (define (square x) (mul-rat x x))
  (define (arctangent x y)
    (make-rat
     (atan (/ (numuer x) (denom x))
           (/ (numuer y) (denom y)))
     1))
  (define (sine x)
    (make-rat (/ (numuer x) (denom x)) 1))
  (define (cosine x)
    (make-rat (/ (numuer x) (denom x)) 1))
  
  ;; 追加
  (define (tag x) (attach-tag 'rational))
  (put 'square-root '(rational)
       (lambda (x)
         (tag (square-root x))))
  (put 'square '(rational)
       (lambda (x)
         (tag (square x))))
  (put 'arctangent '(rational rational)
       (lambda (x y)
         (tag (arctangent x y))))
  (put 'sine '(rational)
       (lambda (x)
         (tag (sine x))))
  (put 'cosine '(rational)
       (lambda (x)
         (tag (cosine x))))
  'done)

(define (install-complex-number)
  (define (add-complex z1 z2)
    (make-from-real-imag (add (real-part z1)
                              (real-part z2))
                         (add (imag-part z1)
                              (imag-part z2))))
  (define (sub-complex z1 z2)
    (make-from-real-imag (sub (real-part z1)
                              (real-part z2))
                         (sub (imag-part z1)
                              (imag-part z2))))
  (define (mul-complex z1 z2)
    (make-from-real-imag (mul (real-part z1)
                              (real-part z2))
                         (mul (imag-part z1)
                              (imag-part z2))))
  (define (div-complex z1 z2)
    (make-from-real-imag (div (real-part z1)
                              (real-part z2))
                         (div (imag-part z1)
                              (imag-part z2))))

  (define (tag z) (attach-tag 'complex z))
  (put 'add '(complex 'complex)
       (lambda (z1 z2)
         (tag (add-complex z1 z2))))
  (put 'sub '(complex 'complex)
       (lambda (z1 z2)
         (tag (sub-complex z1 z2))))
  (put 'mul '(complex 'complex)
       (lambda (z1 z2)
         (tag (mul-complex z1 z2))))
  (put 'div '(complex 'complex)
       (lambda (z1 z2)
         (tag (div-complex z1 z2))))
  'done)

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

$ ./sample.scm
$

0 コメント:

コメントを投稿