SICP 読み (79) 2.5.3 例: 記号代数

濃い多項式に適しているという項リストの表現。

問題 2.89

まず、0 が空リストでない、という事を忘れないように。あと、なるべく term-list マワリに修正を限定したい。このあたり

 (define (adjoin-term term term-list)
   (if (=zero? (coeff term))
       term-list
       (cons term term-list)))
 (define (the-empty-termlist) '())
 (define (first-term term-list) (car term-list))
 (define (rest-terms term-list) (cdr term-list))
 (define (empty-termlist? term-list) (null? term-list))

 (define (make-term order coeff) (list order coeff))
 (define (order term) (car term))
 (define (coeff term) (cadr term))

できれば、手続きの名前はそのままで、が理想。アマいか。うーん ...


駄目か。add-terms とか mul-terms というレベルから変更が必要っぽい。大体 term という概念自体が不要に見えるし。
でもトップダウンで話が進んでるとゆー事は、デキるってコトなんでしょうかね。逆に言えば、add-terms とか mul-terms から term とか term-list を検討した方が良いのか。

  (define (add-terms L1 L2)
    (cond ((empty-termlist? L1) L2)
          ((empty-termlist? L2) L1)
          (else
           (let ((t1 (first-term L1)) (t2 (first-term L2)))
             (cond ((> (order t1) (order t2))
                    (adjoin-term
                     t1 (add-terms (rest-terms L1) L2)))
                   ((< (order t1) (order t2))
                    (adjoin-term
                     t2 (add-terms L1 (rest-terms L2))))
                   (else
                    (adjoin-term
                     (make-term (order t1)
                                (add (coeff t1) (coeff t2)))
                     (add-terms (rest-terms L1)
                                (rest-terms L2)))))))))

上記で言えば empty-termlist? は 0 なリストだったら、という意味だな。あるいは first-term は order と coeff なリストを返す手続き? もう少しツッコンで書いとくと、リストの length - 1 と car を返す、という事か。
rest-terms は同じで良さげ。order も coeff もか。
make-term は二番目の引数をそのまま返せば良いように見える。検討が必要なのは adjoin-term ですな。って単純に cons したら良さげなんですが、末端がどーなるかが微妙に見えてない。


あ、empty-termlist? はもらったリストが '() だったら、なソレも必要だな。そーゆー意味では the-empty-termlist は '() でも良いのか?
# =zero? も変更必要かも


かけ算な実装をチェックするに上記のソレで動きそうな気がする。
がしかし、確認は別途で。(を