計算機プログラムの構造と解釈[第2版]
(翔泳社)
ハロルド エイブルソン (著) ジュリー サスマン (著)
ジェラルド・ジェイ サスマン (著)
Harold Abelson (原著) Julie Sussman (原著)
Gerald Jay Sussman (原著) 和田 英一 (翻訳)
開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力、オブジェクトおよび状態)、3.4(並列性: 時が本質的)、3.4.1(並列システムでの時)、並列プログラムの正しい振舞い、問題 3.38-a, b.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
問題 3.38-a, b.
a.
- Peter, Paul, MaryとPaul, Peter, Maryの順序の時: 45
- Peter, Mary, Paulの順序の時: 35
- Paul, Mary, Peterの順序の時: 50
- Mary, Peter, PaulとMary, Paul, Peterの時: 40
コード(BBEdit, Emacs)
constraint_system.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- (define balance 100) (define (init) (set! balance 100)) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds")) (define (peter) (set! balance (+ balance 10))) (define (paul) (set! balance (- balance 20))) (define (mary) (set! balance (- balance (/ balance 2)))) (peter) (paul) (mary) (print balance) (init) (paul) (peter) (mary) (print balance) (init) (peter) (mary) (paul) (print balance) (init) (paul) (mary) (peter) (print balance) (init) (mary) (peter) (paul) (print balance) (init) (mary) (paul) (peter) (print balance)
sample3_38.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- (load "./constraint_system.scm") (define (c+ x y) (let ((z (make-connector))) (adder x y z) z)) (define (c- x y) (let ((z (make-connector))) (adder y z x) z)) (define (c* x y) (let ((z (make-connector))) (multiplier x y z) z)) (define (c/ x y) (let ((z (make-connector))) (multiplier y z x) z)) (define (cv value) (let ((x (make-connector))) (constant value x) x)) (define (celsius-fahrenheit-converter x) (c+ (c* (c/ (cv 9) (cv 5)) x) (cv 32))) (define celsius (make-connector)) (define fahrenheit (celsius-fahrenheit-converter celsius)) (probe 'celsius celsius) (probe 'fahrenheit fahrenheit) (set-value! celsius 0 'kamimura) (forget-value! celsius 'kamimura) (set-value! fahrenheit 32 'kamimura) (forget-value! fahrenheit 'kamimura) (set-value! celsius 20.0 'kamimura) (forget-value! celsius 'kamimura) (set-value! fahrenheit 0 'kamimura) (forget-value! fahrenheit 'kamimura) (set-value! fahrenheit 0.0 'kamimura)
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
$ ./sample3_38.scm 45 45 35 50 40 40 $
b.
それぞれの最終残高。
-
PeterとPaulが同時に残高100ドルにアクセスした場合。
- 途中残高が110ドルでそれにMaryがアクセスした場合: 55ドル
- 途中残高が80ドルでそれにMaryがアクセスした場合: 40ドル
-
PeterとMaryが同時に残高100ドルにアクセスした場合。
- 途中残高が110ドルでそれにPaulがアクセスした場合: 90ドル
- 途中残高が50ドルでそれにPaulがアクセスした場合: 30ドル
- 途中残高が80ドルでそれにPetterがアクセスした場合: 90ドル
- 途中残高が50ドルでそれにPetterがアクセスした場合: 60ドル
- 110ドル
- 80ドル
- 50ドル
- 90ドル
- 55ドル
- 90ドル
- 40ドル
- 60ドル
- 30ドル
よって、生じる可能性のある値は、
- 55
- 40
- 90
- 30
- 60
- 110
- 80
- 50
- 55
0 コメント:
コメントを投稿