kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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

上から順に評価して、条件が成り立ったところから先は評価しないとか
範囲チェックが不要とか
不要になった引数とか

そういうところは省いてます

mulomulでは式を書く順番が違ってきますね
関係型と関数型で書き方が違ってくるところがあるのは当然として
((fresh (x z) (== `(0 . ,x) n) (== `(0 . ,z) p) (mul x m z))のように
(== `(0 . ,z) p)(mul x m z))よりも先に書いているのは
関係脳だとそうしたくなるんでしょうか
それとも単にThe First Commandmentにしたがって再帰を最後に持ってきてるだけなんでしょうか