継続渡しとCPSの差異
継続渡しとCPSの差異
関数は引数に関数を取ることもあり、その全てを継続渡しにする必要はない
良い例は『プログラミングGauche』.icon 19.2のfind-fold2関数
code:lisp
(define (find-fold2 pred? proc/cont seed lis)
[(pred? (car lis))
(proc/cont (car lis)
seed
(lambda (seed2)
(find-fold2 pred? proc/cont seed2 (cdr lis))))]
[else
(find-fold2 pred? proc/cont seed (cdr lis))]))
これは第2引数のproc/contは継続渡しになっているが、
find-fold2自体、pred、は継続渡しではない
出現している3つの関数の内の1つだけを継続渡ししてる
これと対比して、出現する関数全てを継続渡しにしたものを特にCPSと呼ぶことにしている でも別にこれが厳密な定義でもないと思うmrsekut.icon
継続渡しと言えばCPSとイコールだよというノリで書いている記事もたくさん見るし
でもこれが逆にわかりにくさが増している気がするので、mrsekut.iconはこれを区別して呼ぼうと思う
原典みたいなものに当たって明確にイコールだよと言及しているものを観測すれば書き直すmrsekut.icon