[Gauche-devel-jp] 最後にメッセージを受け取るアクターと手続きの終りの意味 (Re: CPS を知るのによい参考文献)

アーカイブの一覧に戻る

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)





Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る