IRIYA, Kazunori
iriya****@mcn*****
2004年 5月 15日 (土) 18:03:04 JST
こんにちは、入谷です。 皆さんが紹介してくださったドキュメントを手にしながら CPS プログラミング を楽しんでいます。それで最後にメッセージを受け取るアクターのところでちょっ と分からない所があります。 『CPSのポイント。手続きは呼び出したら戻ってきません。行ったっきりです。 ですから、その手続きの後で何か別のことをやりたいなら、「その後にして欲し いこと=継続」を手続きに渡してやります。』(Shiro さん) の『戻ってきません』というところです。 h003419b さんの解説で紹介されている最後にメッセージを受け取るアクター display (Scheme では (lambda (x) x)) までの実行を順繰りにみていくと、継 続を手続きに渡す所は関数の呼び出しになっているので、インタープリタの世界 だと、その関数呼び出しからはちゃんと戻っています。 CPS の世界での手続の呼び出しと復帰と、インタープリタの世界のそれとこんご らがっているからなのか、また『呼び出したら戻ってきません』で指しているの はメッセージを受け取るアクターがいるアクターのことを指して言っているのか、 などと、ぼんやりとは見えているのですが、戻ってこないのに戻ってくるところ が、すっきりしません。 青木さんの解説 ( http://www.sra.co.jp/people/aoki/SmalltalkTextbookJ/textbook27.html ) では、最後にメッセージを受け取るアクターは、 [Transcript cr; show: 'end program'. process terminate] というブロッククロージャになっています。program には処理全体をあらわすブ ロッククロージャを実行するプロセスのインスタンスがバインドされていて『戻っ てこない』ことを process に terminate メッセージを送ることで表現されてい るようです。 青木さんのプログラムを読んでいると、処理系の世界でも復帰はさせないように する、ということが CPS の書く書き方のポイントなのか。そういう意味では、 最後にメッセージを受け取るアクターの書く書き方には、そうした作りこみを入 れないといけないのか? そんな気もしてきました。 でも、その他のドキュメントでは、処理の途中のあるポイントをみたとき、その 関数は最後に引数に継続を適用する式で締めくくっている、その書き方が CPS だ、とも読めます。 それから、そもそも、自分が read-eval-print-loop の中にいる時は終りってな んだ? という話もありますね。 入谷 P.S. 試したプログラムを添付します。 [ 試したプログラム ] (1) Gauche gosh> (define _plus (lambda (x y k) (k (+ x y)))) _plus gosh> (define _star (lambda (x y k) (k (* x y)))) _star gosh> (define display (lambda (x) x)) display gosh> #?=(_plus 1 2 (lambda (u) (_star 5 u display))) #?="(stdin)":4:(_plus 1 2 (lambda (u) (_star 5 u display))) #?- 15 15 (2) Windows Script Host の JScript (ECMAScript のある処理系) var display = function (k) { WScript.echo(k) }; var _plus = function (x, y, k) { return k(x + y) }; var _star = function (x, y, k) { return k(x * y) }; _plus(1, 2, function (u) { return _star(5, u, display) }); // => 15 # 関数呼び出しのところで実行コンテクストをスタックに積んでいます。ですの # で JScript の処理系のレベルからは関数を呼び出したあとに復帰しています。 入谷 On Wed, 05 May 2004 23:35:06 -1000 (HST) Shiro Kawai <shiro****@lava*****> wrote: | ここもわかりやすいです。 | 「SchemeとActor理論」 | http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/actor/actor.html | Actorを実装する過程で、関数呼び出しと継続の概念が統合されるのに至る | 過程がうまく説明されています。 | | 継続はわかりにくいかというと、うーん、分かるまでは分からないけど、 | わかってしまうとどうってことない、という変なものではあります。 | | --shiro | | _______________________________________________ | Gauche-devel-jp mailing list | Gauch****@lists***** | http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp | -- 入谷 和典 / 羽根木 E-Mail: iriya****@mcn***** (Home)