問題3.41、問題3.42 – SICP(計算機プログラムの構造と解釈)その139
問題3.41 変更した部分は、アクセス時点での balance を返すだけで、書き換えによる変化がないために直列化は必要ない。 ((eq? m ‘balance) balance) ; ↓ 直列化 ((eq? m ‘balance) ((protected (lambda () balance)))) 問題3.42 安全な変更。 並列性に違いはない。 計算機プログラムの構造と解釈 posted w…続きを読む
問題3.41 変更した部分は、アクセス時点での balance を返すだけで、書き換えによる変化がないために直列化は必要ない。 ((eq? m ‘balance) balance) ; ↓ 直列化 ((eq? m ‘balance) ((protected (lambda () balance)))) 問題3.42 安全な変更。 並列性に違いはない。 計算機プログラムの構造と解釈 posted w…続きを読む
問題3.40 P1 : (lambda () (set! x (* x x))) P2 : (lambda () (set! x (* x x x))) プロセスを次のように分割する。 X1-1 : P1 の1番目の x へのアクセス X1-2 : P1 の2番目の x へのアクセス Xe1 : P1 の x への設定 X2-1 : P2 の 1番目の x へのアクセス X2-2 : P2 の 2…続きを読む
問題3.39 P1 : (lambda () (set! x ((s (lambda () (* x x)))))) P2 : (s (lambda () (set! x (+ x 1)))) 以下の3つの結果が残る。 101 : P1 が x を 100 にセットし、P2 が x を 101 にセットする。 121 : P2 が x を 11 にセットし、P1 が x を 121 にセットする。…続きを読む
問題3.38 問題a. 6通りある。 Peter -> Paul -> Mary => 110 -> 90 -> 45 Peter -> Mary -> Paul => 110 -> 55 -> 35 Paul -> Peter -> Mary => 80 -> 90 -> 45 Paul -> Mar…続きを読む
問題3.37 除算については、 x / y = z は x = y * z として multiplier で演算する。 (define (c+ x y) (let ((z (make-connector))) (adder x y z) z)) (define (c* x y) (let ((z (make-connector))) (multiplier x y z) z)) (define (…続きを読む
JavaScript の構文チェックプログラム JSLint を vim で実行してスクラッチバッファに結果を表示させてみた。 以下は、その手順。 "scratch utility : 自由に開閉できる作業用バッファ管理プラグイン — 名無しのvim使い" からスクラッチバッファ・プラグインをダウンロードしてインストールする。 SpiderMonkey をインストールする。 $…続きを読む
問題3.36 (define a (make-connector)) (define b (make-connector)) (set-value! a 10 ‘user) gosh> done a と b のコネクタを定義すると、手続き make-connector が実行されて、それぞれのコネクタの環境 E1 と E2 が作られる。 コネクタ a に値を設定すると、環境 E1 に val…続きを読む
問題3.35 (define (squarer a b) (define (process-new-value) (if (has-value? b) (if (< (get-value b) 0) (error "square less than 0 — SQUARER" (get-value b)) (set-value! a (sqrt (get-value b)…続きを読む
問題3.34 multiplier の process-new-value 手続きに、いずれの条件式にも一致しなかった場合にメッセージを印字するように修正する。 (define (multiplier m1 m2 product) (define (process-new-value) (cond ((or (and (has-value? m1) (= (get-value m1) 0)) (a…続きを読む
問題3.33 制約ネットワークで表した、a + b = 2 * c の図。 (define (averager a b c) (let ((u (make-connector)) (x (make-connector))) (adder a b u) (multiplier c x u) (constant 2 x) ‘ok)) (define A (make-connector)) (defin…続きを読む