Reasoned Schemer (41) 9章 condu
(run* q (conda ((alwayso) #s) (#s #u)))
はno value
conda
はquestionが成功なら次の行以降は実行しないんだけど
これだと(alwayso)
が成功し続けてその行の実行が終わらないので
そこでcondu
の登場
こっちはconda
よりもさらに早く打ち切る
questionが1回成功したところで終わり
The Law of
condu
condu
behaves likeconda
, except that a successful question succeeds only once.
なおuはuni-のu
ので
(run* q (condu ((alwayso) #s) (#s #u)))
は(_0)
になる
condu corresponds to Mercury’s committed choice (so-called once).
onceっていうのは聞いたことないかな
avoiding the cut of Prolog
cutってよくないものなんだ
ピュアじゃないっていうような話はあったかもしれない
9章でやっとconda
やcondu
が出てきたのもそういうことかもしれない
でも
(run* q (condu (#s (alwayso)) (#s #u)))
はno value
ややこしいぞ
question(#s
)が1回成功したら(alwayso)
を実行するんだけど
そっちには1回だけ成功したら、っていうのはないってことかな
やっぱりquestionが特別扱いなのか
(run 1 q (conda ((alwayso) #s) (#s #u)) #u)
はno valueだけど
(run 1 q (condu ((alwayso) #s) (#s #u)) #u)
は()
だとか微妙な差
run 1
だったらひとつ値が出たところで終わらないんだっけ?
あ、#u
があるから一度も成功しなくてずっと試し続けるのか
condu
でもやっぱりquestionで変数が束縛されてはいけない
The Second Commandment (Final)
If prior to determining the question of aconda
orcondu
line a variable is fresh, it must remain fresh in that line’s question.
まだ意味はわかっていない