nyagos は lua53.dll → GopherLua への切り替えの際、組み込み言語のインターフェイスをある分離して、切り替えられるようにしたのですが、それを利用して、mattn 先生が開発された、Go製スクリプト言語 anko を組み込んだ anko-nyagos を試験的に作成してみました。
今のところできるのは下記だけです。
- 起動時に、anko-nyagos.exe と同じフォルダーの nyagos.ank を実行する
- コマンドとしては以下を使えるようにする
エイリアス用関数は、こんな感じ
func f(args){ for s in args{ println(s) } } alias("foo",f)
これを nyagos.ank に記すと、「foo 1 2 3」で「1」「2」「3」と表示されます。
さて、この anko-nyagos.exe 、エイリアスしか実装していないのに、ファイルサイズが 4,807,168 バイトと結構なサイズになってしまいました。オリジナル nyagos.exe は 4,818,944 バイトです。重複していたり、使っていないコードが多いからというのもありますが、まだ Lua・anko 両方とも組み込みとかは考えない方がよいかもしれません。
(追記)
anko からコールバック関数(エイリアス関数本体)を Go 言語側に引き渡す時、どういう型で来るか、anko のドキュメントやソースを見ても分からなかったのですが、安直に
func ankoAlias(name string, f interface{}) { switch code := f.(type) { case string: alias.Table[name] = alias.New(code) default: println(reflect.TypeOf(f).String()) } }
とやって、型を表示させてみたらわかりました。vm.Func
でした。これを anko のソースで検索してみたところ、次のような型のようです。
type Func func(args ...reflect.Value) (reflect.Value, error)
というわけで、現在はこんな感じになっています。
func ankoAlias(name string, f interface{}) { switch code := f.(type) { case string: alias.Table[name] = alias.New(code) case vm.Func: alias.Table[name] = &ankoFunc{f: code} default: println(reflect.TypeOf(f).String()) } }
以上