2016/01/19
SICP 4.4.4 extend-if-consistentのエラー
4.4.4の論理型プログラミングの実装を評価すると以下のエラーが出ます.
gosh> *** ERROR: Compile Error: cannot find "var" in ("/usr/local/Cellar/gauche/0.9.4/share/gauche-0.9/site/lib" "/usr/local/Cellar/gauche/0.9.4/share/gauche-0.9/0.9.4/lib" "/usr/local/Cellar/gauche/0.9.4/share/gauche/site/lib" "/usr/local/Cellar/gauche/0.9.4/share/gauche/0.9/lib")
"(standard input)":1:(define (extend-if-consistent var da ...
Stack Trace:
_______________________________________
0 (eval expr env)
At line 179 of "/usr/local/Cellar/gauche/0.9.4/share/gauche-0.9/0.9.4/lib/gauche/interactive.scm"
これがextend-if-consistentのコードです.
(define (extend-if-consistent var dat frame)
(let ((binding (binding-in-frame var frame)))
(if binding
(pattern-match (binding-value binding) dat frame)
(extend var dat frame))))
何も問題ないように思えます.
defineなのになぜvarを探しているのかわかりません.
散々迷って,このコードのvarを1つずつ変更していったところ,
最後の行のextendの次のvarを探しているようでした.
else節なのになぜこんなところが評価されているんだと思いながらも,
この評価機のextendの定義を先に評価したところ,extend-if-consistentの評価も通りました.
Gaucheのextendを調べてみると以下で見つかりました.
モジュールの継承で使われるので優先的に評価されているのでしょう.
なのでこの部分は本文中のextendの定義を先に評価してから書くようにします.