2014年6月20日金曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力、オブジェクトおよび状態)、3.2(評価の環境モデル)、3.2.4(内部定義)、問題 3.11.を解いてみる。

その他参考書籍

問題 3.11.

環境構造。

;; 大域環境
make-account
;; (共有部分)
;; パラメーター
balance
;; 本体
(define (withdraw amount)
  (if (>= balance amount)
      (begin (set! balance (- balance amount))
             balance)
      "Insufficient funds"))
(define (deposit amount)
  (set! balance (+ balance amount))
  balance)
(define (dispatch m)
  (cond ((eq? m 'withdraw) withdraw)
        ((eq? m 'deposit) deposit)
        (else (error "Unknown request -- MAKE-ACCOUNT"
                     m))))
dispatch
;; -> 大域環境
;; (共有部分)

(define acc (make-account 50))

;; E1 -> 大域環境
balance: 50
;; 手続き
withdraw
;; パラメーター
amount
;; 本体
(if (>= balance amount)
    (begin (set! balance (- balance amount))
           balance)
    "Insufficient funds")
;; -> E1
;; 手続き
deposit
;; パラメーター
amount
;; 本体
(set! balance (+ balance amount))
balance
;; -> E1
;; 手続き
dispatch
;; パラメーター
m
;; 本体
(cond ((eq? m 'withdraw) withdraw)
      ((eq? m 'deposit) deposit)
      (else (error "Unknown request -- MAKE-ACCOUNT"
                   m)))
;; -> E1

;; 大域環境
;; 手続き
acc
;; パラメーター
m
;; 本体
(cond ((eq? m 'withdraw) withdraw)
      ((eq? m 'deposit) deposit)
      (else (error "Unkown request -- MAKE-ACCOUNT"
                   m)))
;; -> E1

;; E2 -> E1
m: 'deposit

deposit

;; -> E1

(deposit 40)

;; E3 -> E1
amount: 40

(set! balance (+ balance amount))

(set! balance (+ balance 40))

;; E1
balance: 90

90

;; 大域環境
((acc 'withdraw) 60)

;; E4 -> E1
m: 'withdraw

withdraw

;; -> E1

(withdraw 60)

;; E5 -> E1
amount: 60

(if (>= balance amount)
    (begin (set! balance (- balance amount))
           balance)
    "Insufficient funds")

(if (>= balance 60)
    (begin (set! balance (- balance 60))
           balance)
    "Insufficient funds")

;; E1
balance: 30

(define acc2 (make-account 100))

;; E6
balance: 100

;; 大域環境
;; 手続き
acc2

;; 手続き
withdraw
;; パラメーター
amount
;; 本体
(if (>= balance amount)
    (begin (set! balance (- balance amount))
           balance)
    "Insufficient funds")
;; -> E6
;; 手続き
deposit
;; パラメーター
amount
;; 本体
(set! balance (+ balance amount))
balance
;; -> E6
;; 手続き
dispatch
;; パラメーター
m
;; 本体
(cond ((eq? m 'withdraw) withdraw)
      ((eq? m 'deposit) deposit)
      (else (error "Unknown request -- MAKE-ACCOUNT"
                   m)))
;; -> E6

;; acc2
dispatch

;; 共有する部分は、make-acount手続きのパラメーター、本体

0 コメント:

コメントを投稿