次は nyagos 4.2 になりそう

先日考えた 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 というリリースになる予定だ