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