与太[hatena.ne.jp]

コメントに書こうと思ったけど、長いので。


一つ問題なのは、グローバル関数ならともかく、クロージャが一時(ローカル)変数にアクセスできないと、相当つらいんだよね。クロージャを使うたびに変数名が必要なのでは、わざわざ無名にした意味が全くない。
別のスタックフレームを参照させる関数と仕組みを作るか、リストをファーストクラスに導入するかしないといけない。
前者はTclなんかで重宝する(upvar, uplevel)。ただ、これも、せっかくのクロージャの中身がちょっと複雑になるので、あんまり好きではない……。リストを導入するのも、大手術になる割りに、何だかいまさらな感じ。結局、謎のインデックス番号が飛び交うだけで、スマートにはなりきれないし。スタックを考えて書くよりは綺麗だけど。
オブジェクト指向は変なところで偉大だなぁ。
upvarすると変数に参照が入ってしまうTcl方式は汚いと思うので、やるならエントリ名にプレフィックスを付けると別スタックを見に行く方式かな。単語の任意の部分で置換を使える華和梨だからできるわけだし、修正はエントリ名からエントリIDを引っ張る一カ所ですむ。例えば、

function hoge $( setstr <-1>::$@arg[0] ほげ );
hoge @ローカル変数;
echo $@ローカル変数;

出力>> ほげ

みたいな。
どっちにしても見にくいか。もちろん、ルートのフレームを絶対値プレフィクスで渡されて、さらに<-1>::すると死ぬから、救済しないといけない。
置換子の構文糖としては、${<-1>::name}よりは、$<-1>::{name}の方がまだ見やすいか。統一的でないが。いっそ、一つ上に限っては$でもいいか。


しかし、食指の動きにくい話だなぁ(^^;。考えることが増える割に、見かけ上の動作を揃えられる以外にメリットの薄い、自己犠牲的プログラミングの好きな人にしか意味のない仕様だ……。