Rの環境操作とクロージャ

折を見て、Common Lisp関連の書籍を読んでいます。なかなか進まないのですが。。。
何を調べていた時か忘れてしまいましたが、こちらで次のようなコードを見つけました。
Javascriptとかでもよく見かけるクロージャのサンプルですね。
で、はたと気になりました。Lispの影響を強く受けているRではどのように書けるのかと。
ちょっと書いてみました。
Rでは、CLのletにあたる関数がありません(多分)。なのですが、そもそもRには環境自体を作成、操作できる関数があるので、そちらを使うこととします。
…期待どおりの動作をしてくれません。環境とクロージャ環境中のオブジェクトを表示してみます。
関数が呼ばれる度に新しい環境が作成されていて、counterは新しい環境内の変数となっているようです。
ということで、Rでは関数内で定義された変数の扱いがCLと違うようで、CLでは親環境にまで派生しますが、Rでは親環境にまで派生しないようです。
Rのスコーピング規則は、Ross先生がSとの互換性を捨ててまでこだわったところらしいので、このような仕様にしているのは何か理由があるのでしょう。破壊的な代入が親環境にまで影響するのが嫌だったとかなのかなー
詳しくはわからないんですが、Pythonのジェネレータっぽいことしたい時はどうすれば良いんだろう。クラス作れとかってことなんでしょうかね。
ちなみに、Rのレキシカルスコープについては、以下の書籍が詳しいです。
[tmkm-amazon]4431712186[/tmkm-amazon]
-
前の記事
gist.elが使えなくなったのでフォーク版作った 2010.11.22
-
次の記事
anything-gist.elをまたまたアップデート 2010.11.24