先日考えた Lua インスタンスをクローンする方式は、 集中してやったら、案外あっさり出来た。
foo = { { { "bar" } } } nyagos.alias.foo = function(this) print("foo=",foo[1][1][1]) end
こういうコードは、従来の 4.1 では foo=nil
となってしまっていたのだが、最新版では foo=bar
と出せるようになった。
なぜ 4.1 で期待どおり動かないかは説明しづらく、NYAGOS にとって負い目のような仕様だった。
今回の修正では ~/.nyagos
で定義した shareテーブル以外のグローバル変数も、
エイリアス関数・プロンプト関数・一行入力のキー関数のいずれでも参照できるようになった。
これでほとんどの Lua ユーザが戸惑うことはなくなるだろう。
また、今まで無駄に新規 Lua インスタンスを作成していた箇所があり、それでNYAGOSの起動そのものが遅くなっていた。
今回、あくまで新規の goroutine を作った時、すなわち「foo | more
」「foo &
」などのように、
エイリアスをバックグラウンドで実行させたときだけ Lua インスタンスの作成・クローンを行うようにした。
このコスト削減で、Lua のクローンのコストも相殺されたのではないかと思われる。
ただ、従来の share
は廃止しない。というのも、Lua インスタンスのクローンでは、
親(フォアグラウンドgoroutine)→子(バックグランドgoroutine)へと情報が伝わるだけで、
子 → 親へは伝わらないからだ。
使う機会はゼロではないが、念のため、残しておくのが無難だろう。
という感じで、かなり大胆にコードを書き替えた。 それで、安定度は下がったものの、4.1.x の負い目は払拭した。ゆえに次回は 4.2.0 か 4.2-beta というリリースになる予定だ。