kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Reasoned Schemer (69) 勘違い修正

いろいろ考え直さないとか?

↓みたいなのやっていくときはqqのままにしないで書き替えてったほうがいいのかなー

  (run* q (== q 'pea))
= (run #f q (== q 'pea))
= (let ((q (var 'q))) (map (reify q) (run-goal #f (conj (== q 'pea)))))
= ...

こんな風に

  (run* q (== q 'pea))
= (run #f q (== q 'pea))
= (let ((q (var 'q))) (map (reify q) (run-goal #f (conj (== q 'pea)))))
= (let ((q '#(q))) (map (reify q) (run-goal #f (conj (== q 'pea)))))
= (map (reify '#(q)) (run-goal #f (conj (== '#(q) 'pea))))

でもこれだと実行してみたとき最後の式で評価の結果が合わなくなってしまうんだよな

> (run* q (== q 'pea))
'(pea)
> (let ((q '#(q))) (map (reify q) (run-goal #f (conj (== q 'pea)))))
'(pea)
> (map (reify '#(q)) (run-goal #f (conj (== '#(q) 'pea))))
'(_0)

reify'#(q)conj'#(q)が別物なのが原因
(eqv? '#(q) '#(q))#fなのでwalkassv(#(q) . pea)を見つけてくれなくなる
脳内でやる分には問題ないんだけど
うまい書き方はないかなあ

assvassocにするとどうかな

> (map (reify '#(q)) (run-goal #f (conj (== '#(q) 'pea))))
'(pea)

うまくいった
でも変なところで影響が出そうでこわい
occurs?unifyeqv?equal?にしないとおかしいかな
いやここはequal?ではおかしい
なにかあったら思い出すことにしてこのままで進んでみる
(思い出せるかどうかは知らない)

> (run* q (fresh (x) (== `(,x) q)))
'((_0))

今や当然
でもこの(run* q ...)っていうのがqを変数に思わせる罠という気がしないでもない
マクロ使ってるときにかかりやすい罠?
いやわかってないだけかな