星田さんの記事に対するコメント。
ようやくmapのCPS版の話題に戻る事に。正直言って継続渡しについて曖昧だったのが間を開けることで更にボンヤリしたものに。
人間の頭は忘れるように出来てるので心配せんように。
と桜木先生も仰ってる(笑)。
忘れても構わないんで、その代わりSchemeとActor理論を何度も読み返そう。
その方がよっぽど有益です。
実験してみたかったけどkに当たる部分にどんな引数を持ってきたら良いのかも分からないw。
これは実は一引数関数(あるいは可変長関数)なら何でも構わない。
と言うのも、「継続」と言うから構えるんであって、本質的には継続受け渡しスタイル(CPS)で書かれた関数は単なる高階関数です。処理を任せる関数は一引数関数なら実は何でも良い。あとは、その一引数の関数が「どんな型のデータを引数として受け取ろうと想定してるか」しかない。
良く使われる手は
- 「SchemeとActor理論」で使ってるような (lambda (x) x) => あるいはRacket組み込みの identity (恒等関数)を使っても良い。
- 川合史朗さんは、多値関数 values を薦めている。
- あとは、出力関数 display の類。
の3つかな。
とにかく「最後に処理する」関数なわけで、「SchemeとActor理論」で語られてる通り、「アクターにメッセージを送るだけ」なんで、メッセージを送るべきアクターは特に規定されていないわけです。
じゃあkに更に1を足すProcを持ってきたら足された数字が・・来てない!
うんそれはね。
(lambda (x) add1 x)
と言う処理だと逐次実行で、
- add1と言うファーストクラスオブジェクトを返す。
- xを返す。
- 従ってこのラムダ式の全体の返り値はxとなる -> (begin add1 x) と同じ
と言う事なんだ。
多分やりたいのは
(lambda (x) (map add1 x))
だと思う。
mapnの方も同じか・・。本体内でも(lambda(x) x)が使われてるから、とりあえず継続渡しで末尾再帰をする時に定番の書き方なのか?と推測。
これは先にも書いた通り、valuesでも大丈夫です。