標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

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

以上