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を調べてみると以下で見つかりました.

Gauche ユーザリファレンス: 4.13 モジュール

モジュールの継承で使われるので優先的に評価されているのでしょう.
なのでこの部分は本文中のextendの定義を先に評価してから書くようにします.


© 2022 wat-aro