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