>> ええと、クロージャが再帰した時はどうなるのでしょうか。Pascalの
>>スタティックリンクのような仕掛けがないと困るような気が…
>>すみませんよぱらいなので頭動いてないです。
まず前提として、
・クロージャはそれ自体が式なので、クロージャの中にも書けるはず。
よって、クロージャはネスト可能。
・ということは、内側のクロージャは、外側のクロージャの環境と、
さらにその外側(普通の関数)の両方の環境が見えなければならない。
というのがあって、mizuさんの案だと配列をひとつしか渡していないので、
いいのかな、と思ったわけです。
再帰がなければ静的にインデックス計算することも可能でしょうが、
再帰を許すと、インデックスが動的に変化することになりませんか、
というのが先の投稿の意図です。
# 私はクロージャ初心者なので何か勘違いしている可能性はありますが…
>あと、Pascalはよく知らないのですが、Pascalのスタティックリンクとは
>どのようなものなのでしょうか?
Pascalは関数のネストができるので、内側の関数からは外側の関数の
ローカル変数が参照できます。かつ再帰を許すため、現状のスタックの
トップからの、外側の関数のローカル変数の位置は静的には決まりません。
そこで、最新の環境に、外周の関数の環境へのポインタを保持していて
それをスタティックリンクと呼びます。
# Pascalの処理系を読んだわけではないので、「エキスパートCプログラミング」の
# 受け売りですが。
>とすると、変数のルックアップは、ある環境を探索して、見つからなければ
>外側の環境へのリンクをたどって…という風に行われるのでしょうか。
そのつもりです。JavaScriptではこんな感じらしいですし。
http://www.hawk.34sp.com/stdpls/jsnotes/jssinso/
ただ、グローバル変数を単なる再外周の環境として扱うか、特別扱いするかは
現在悩んでいるところです。