Reasoned Schemer (002) goal、run*、fresh、fuse
1. Playthings
相変わらず章タイトルは役に立ちそうにありません
- goal: 何かしら成功したり失敗したり値を持たなかったりするもの
#s
: 成功#u
: 失敗run*
: 成功する変数の組み合わせを探してリストで返してくれるなにか
たとえば(run* q (== q 'pea))
の値は(pea)
- The First Law of ==
(== v w)
は(== w v)
で置き換えることができる
freshという概念が出てくる
- fresh:
q
がfreshといえばq
は未確定とかなんでもOKとかそんな感じ
(run* q (== q 'pea))
するとq
はfreshではなくなるけど
(run* q #s)
してもq
はfreshなまま
- どんな変数も最初はfresh
-
変数でない値と関連付けられたり、freshでない変数を関連付けられたりすると変数はfreshでなくなる
-
(run* q #s)
の値は(_0)
-
freshな値はアンダースコア+数字に具象化される
reifyは「to consider or represent (something abstract) as a material or concrete thing」だそうです
何かしら抽象的なものを物質的な/具体的なものと考える、だって
業界でなんと訳されてるかは不明だけど「具象化」で
fresh
: freshな変数を導入する
(run* q (fresh (x) (== (cons x '()) q)))
とか
ちなみに値は(_0)
この場合、q
はなんでもありって訳にはいかないからfreshは未確定くらいの意味なのかな
`(,x)
は(cons x '())
の短縮形
普通にquasiquote
のことだと思われます
- fuse: ふたつの変数を同一とすること
融合と訳す
(run* q (fresh (x) (== x q)))
とするとx
とq
が融合する- different: ふたつの変数は、融合していなければ、異なるという
- 異なる変数が具象化されるときは、アンダースコアに異なる数字をつける
- 変数名が異なるだけの
run
式は同じ値を持つ (== `(,x) x)
は決して成功しない- The second Low of ==
x
がfreshで、x
がv
の中に現れなければ、(== v x)
は成功してv
をx
と結びつける