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))))

見たいな感じらしい。なるほどー。それでいいんだなぁ。
自分の奴はエラーチェックのあとにふるい分けしているが、解答の方は順番が逆みたい。なんというかこんなんもサクッと書けなかったのが悔しい。