計算機プログラムの構造と解釈[第2版]
(翔泳社)
ハロルド エイブルソン (著) ジュリー サスマン (著)
ジェラルド・ジェイ サスマン (著)
Harold Abelson (原著) Julie Sussman (原著)
Gerald Jay Sussman (原著) 和田 英一 (翻訳)
開発環境
- OS X Yosemite - 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.1(代入と局所状態)、3.1.1(局所状態変数)、問題3.4.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
- Scheme手習い
問題3.4.
コード(Emacs)
(begin
(define print (lambda (x) (display x) (newline)))
(define (make-account balance password)
(let ((wrong 0))
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (call-the-cops) (quote call-the-cops))
(define (dispatch pwd m)
(if (eq? pwd password)
(begin (set! wrong 0)
(cond ((eq? m (quote withdraw)) withdraw)
((eq? m (quote deposit)) deposit)
(else (lambda ()
(display "Unknown request -- MAKE-ACCOUNT ")
(print m)))))
(lambda (x)
(set! wrong (+ wrong 1))
(if (>= wrong 7)
(call-the-cops)
"Incorrect password"))))
dispatch))
(define acc1 (make-account 100 (quote secret-password1)))
(define acc2 (make-account 100 (quote secret-password2)))
(print "acc1")
(print ((acc1 (quote secret-password1) (quote withdraw)) 40))
(print ((acc1 (quote some-other-password) (quote deposit)) 50))
(print "acc2")
(print ((acc2 (quote secret-password2) (quote withdraw)) 40))
(print ((acc2 (quote secret-password2) (quote deposit)) 50))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote secret-password2) (quote deposit)) 50))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1))
(print ((acc2 (quote wrong-password) (quote withdraw)) 1)))
入出力結果(Terminal(kscheme), REPL(Read, Eval, Print, Loop))
$ ./kscheme sample4.scm acc1 60 Incorrect password acc2 60 110 Incorrect password Incorrect password Incorrect password Incorrect password Incorrect password 160 Incorrect password Incorrect password Incorrect password Incorrect password Incorrect password Incorrect password call-the-cops call-the-cops call-the-cops $
0 コメント:
コメントを投稿