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

なんとか手を動かしてみる。
とりあえず当たり前なのをでっち上げてみた。

  ("2-87"
   (setup (lambda () 
	    (install-scheme-number-package)
	    (install-polynomial-package)))

   ("() is zero"
    (assert-true (=zero? (make-polynomial 'x '())))
    )

   ("() is zero (2)"
    (assert-true (=zero? '(polynomial x)))
    )
   )

で、実装は以下ですか?

 (put '=zero? '(polynomial)
      (lambda (p) (empty-termlist? (term-list p))))

上記は当たり前ですが、install-polynomial-package 手続きの中で定義。

で、前日書いた以下の記述ですが

(add (polynomial x 1 (polynomial y (1 -1) (0 -1)))
(polynomial x 1 (polynomial y (1 1) (0 1))))

を =zero? に渡すと真を返せば良いのかな??

ってのはダウト臭い。gosh で試してみたら駄目でした。正しくは

(add (polynomial x (1 (polynomial y (1 1) (0 1))))
     (polynomial x (1 (polynomial y (1 -1) (0 -1)))))

でした。(gosh にて確認)

ので、試験としては以下ですか。(追加分のみ)

   ("(y + 1)x + (-y - 1)x is zero"
    (let ((py1 (make-polynomial 'y '((1 1) (0 1))))
	  (py2 (make-polynomial 'y '((1 -1) (0 -1)))))
      (assert-true (=zero? (add (make-polynomial 'x (list (list 1 py1)))
				(make-polynomial 'x (list (list 1 py2)))))))
    )

一応パスしています。けどなんか微妙。
試験作るのにとても苦労したんですが、term-list の理解が微妙? というか、make-polynomial の理解が微妙なのか。(とほほ

この後の問題をざくっと見るに、_大仕事_とか_(易しくはない)_とか書いてあって、あと 4 頁のハードルはとても高い。