ページ

2009年11月20日

golangのevalをちょっとだけ見てみた

先日、evalがあると驚いていたので、golangのevalをちょっとだけ見てみましたが、よく分かりません。基本的には、eval_test.goをみて書いてみました。
テストケースとかstmt_test.goを見ると関数とかも値として返してくれるのかなー、と期待しましたが、違うようです。よく分かりません。動作としてはコンパイルして、スレッドの中で実行しているような気配を漂わせていますが、めんどーになってちゃんとは追ってません。実行時にバイナリを書き換えるとかいうソフトを昔聞いたような気がしますが、実行ファイルが自分でコンパイルして何かを実行するってやっぱりおもしろい。
でも、evalで何ができるかは、よく分からないんです。



package main

import (
"exp/eval";
"log";
)

func main() {
srcs := []string{
"1",
"type hoge struct {s string};",
"a:=1;",
"a",
"func f1() {}",
"1,2",
};

for _, src := range srcs {
world := eval.NewWorld();
log.Stdout("[Code] " + src + "\n");
code, err := world.Compile(src);
if err != nil {
log.Stderr("[Err] " + err.String());
} else {
value, err := code.Run();
if err != nil {
log.Stderr("[Err] " + err.String());
} else if value != nil {
log.Stdout("[Out] " + value.String() + "\n");
} else {
log.Stdout("[Out] (value == nil)\n");
}
}
}
}


実行結果

2009/11/20 17:42:25 [Code] 1
2009/11/20 17:42:25 [Out] 1
2009/11/20 17:42:25 [Code] type hoge struct {s string};
2009/11/20 17:42:25 [Out] (value == nil)
2009/11/20 17:42:25 [Code] a:=1;
2009/11/20 17:42:25 [Out] (value == nil)
2009/11/20 17:42:25 [Code] a
2009/11/20 17:42:25 [Err] input:1:1: a: undefined
2009/11/20 17:42:25 [Code] func f1() {}
2009/11/20 17:42:25 [Out] (value == nil)
2009/11/20 17:42:25 [Code] 1,2
2009/11/20 17:42:25 [Err] input:1:1: only one expression allowed


それから、"[...]int{1,2}"とかを実行すると、[Err] input:1:1: *ast.CompositeLit expression node not implementedとなる。

0 件のコメント: