Lua のかわりに anko を組み込んだ anko-nyagos を作ってみました。

nyagos は lua53.dll → GopherLua への切り替えの際、組み込み言語のインターフェイスをある分離して、切り替えられるようにしたのですが、それを利用して、mattn 先生が開発された、Go製スクリプト言語 anko を組み込んだ anko-nyagos を試験的に作成してみました。

今のところできるのは下記だけです。

  • 起動時に、anko-nyagos.exe と同じフォルダーの nyagos.ank を実行する
  • コマンドとしては以下を使えるようにする
    • alias("エイリアス名",実行関数)エイリアスを anko の関数で定義する
    • alias("エイリアス名","コマンド定義")エイリアスの置換テキストを定義する
    • サンプルにあったのと同じ println()

エイリアス用関数は、こんな感じ

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())
    }
}

以上