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 頁のハードルはとても高い。