GoでREPL
"exp/eval"パッケージを使用してREPLしてみる。
その名の通りexperimentalらしく、いろいろ制約はありそう。
(ライブラリのコメントにはimportとinterfaceタイプがダメとあった)
package main import ( "os" "bufio" "fmt" "exp/eval" ) func repl() { world := eval.NewWorld() buf := bufio.NewReader(os.Stdin) for { fmt.Print("> ") read, err := buf.ReadString('\n'); if err != nil { fmt.Println(err) continue } read = read[0:len(read)-1] code,err := world.Compile(read) if err != nil{ fmt.Println(err); continue} val, err := code.Run() if err != nil{ fmt.Println(err); continue} if val != nil{ fmt.Println(val) } } } func main(){ repl() }
実行例
> func twice(i int) int { return i * 2} > twice(2) 4
githubには力技でimporとか実現している模様のREPLがあった。
http://github.com/vito/go-repl