2014年6月12日木曜日

開発環境

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

その他参考書籍

問題 3.3.

コード(BBEdit, Emacs)

sample3_3.scm

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

(define (make-account balance password)
  (define (withdraw amount passwd)
    (cond ((not (eq? passwd password))
           "Incorrect password")
          ((>= balance amount)
           (set! balance (- balance amount))
           balance)
          (else "Insufficient funds")))
  (define (deposit amount passwd)
    (if (not (eq? passwd password))
        "Incorrect password"
        (begin (set! balance (+ balance amount))
               balance)))
  (define (dispatch password m)
    (cond ((eq? m 'withdraw)
           (lambda (amount)
             (withdraw amount password)))
          ((eq? m 'deposit)
           (lambda (amount)
             (deposit amount password)))
          (else (error "Unknown request -- MAKE-ACCOUNT"
                       m))))
  dispatch)

;; テスト
(define acc (make-account 100 'secret-password))

(print ((acc 'secret-password 'withdraw) 40))      ; 60
(print ((acc 'some-other-password 'deposit) 50)) ; "Incorret password"
(print ((acc 'secret-password 'deposit) 100))    ; 160
(print ((acc 'some-other-password 'withdraw) 1000)) ; "Incorret password"
(print ((acc 'secret-password 'withdraw) 1000))     ; "Insufficient funds"

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

$ ./sample3_3.scm 
60
Incorrect password
160
Incorrect password
Insufficient funds
$

0 コメント:

コメントを投稿