計算機プログラムの構造と解釈 第二版 P174 問題3.34
squarerを作ってみようという問題。
この欠点は、二乗を作るときにはちゃんと機能するんだけど、
反対向きにある数字の根を作ろうとすると失敗する。
なんでかって言うと、multiplierは2値設定されないと動かないようになっているからだ!
写経したやつを貼っておく。
constraint.scmは
http://d.hatena.ne.jp/unlearned/20100606/1275873184
と同様
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) (use math.mt-random) (load "./constraints.scm") ;;; ; 実行 ;;; (define (squarer a b) (multiplier a a b) 'ok) (define a (make-connector)) (define b (make-connector)) (squarer a b) (probe "input" a) (probe "squarer" b) ;; main (define (main args) (print "(set-value! a 5 'user)") (set-value! a 5 'user) (newline) (newline) (print "(forget-value! a 'user)") (forget-value! a 'user) (newline) (newline) (print "(set-value! b 100 'user)") (set-value! b 100 'user) (newline) (newline) (print "(set-value! a 10 'user)") (set-value! a 10 'user) (newline) (newline) 0)
実行
(set-value! a 5 'user) Probe: input = 5 Probe: squarer = 25 (forget-value! a 'user) Probe: input = ? Probe: squarer = ? (set-value! b 100 'user) Probe: squarer = 100 (set-value! a 10 'user) Probe: input = 10
と、このようにうまくいかない。