ex3.28
こんな時間だが、前のエントリにもある通りこのまま寝てしまうのは悔しいので(まぁ寝た方が効率はいいんだろうが)少しぐらいは問題を解いてから寝よう、うん。
以下、適当な回答
(define (or-gate a1 a2 output) (define (or-action-procedure) (let ((new-value (logical-or (get-signal a1) (get-signal a2)))) (after-delay or-gate-delay (lambda () (set-signal! output new-value))))) (add-action! a1 or-action-procedure) (add-action! a2 or-action-procedure) 'ok) (define (logical-or a b) (if (and (or (= a 1) (= a 0)) (or (= b 1) (= b 0))) (if (or (= a 1) (= b 1)) 1 0) (error "Invalid signal" (list a b))))
とりあえずor-gateはいいとして、logical-orは少しだけ迷った。
aとbがおかしな値の場合のエラー処理がいるっぽいので。
ということで適当にandとかorをifでつないだが、ちょっと汚い。
気になったので某所の解答を見てみると
(define (logical-or a b) (cond ((and (= a 0) (= b 0)) 0) ((or (= a 1) (= b 1)) 1) (else "Invalid signal OR" (list a b))))
見たいな感じらしい。なるほどー。それでいいんだなぁ。
自分の奴はエラーチェックのあとにふるい分けしているが、解答の方は順番が逆みたい。なんというかこんなんもサクッと書けなかったのが悔しい。