Reasoned Schemer (32) かけ算
かけ算はすんなり
(define (odd-mul dn m)
(add (cons 0 (mul dn m)) m))
(define (mul n m)
(cond
((null? n) '())
((null? m) '())
((equal? n '(1)) m)
((equal? m '(1)) n)
(else
(let ((an (car n)) (dn (cdr n))
(am (car m)))
(cond
((eq? an 0) (cons 0 (mul dn m)))
((eq? am 0) (mul m n))
((and (eq? an 1) (eq? am 1))
(odd-mul dn m)))))))
上から順に評価して、条件が成り立ったところから先は評価しないとか
範囲チェックが不要とか
不要になった引数とか
そういうところは省いてます
mulo
とmul
では式を書く順番が違ってきますね
関係型と関数型で書き方が違ってくるところがあるのは当然として
((fresh (x z) (== `(0 . ,x) n) (== `(0 . ,z) p) (mul x m z))
のように
(== `(0 . ,z) p)
を(mul x m z))
よりも先に書いているのは
関係脳だとそうしたくなるんでしょうか
それとも単にThe First Commandmentにしたがって再帰を最後に持ってきてるだけなんでしょうか