

GitHub - containous/yaegi: Yaegi is Another Elegant Go Interpreter
source link: https://github.com/containous/yaegi
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

README.md
Yaegi is Another Elegant Go Interpreter. It powers executable Go scripts and plugins, in embedded interpreters or interactive shells, on top of the Go runtime.
Features
- Complete support of Go specification
- Written in pure Go, using only the standard library
- Simple interpreter API:
New()
,Eval()
,Use()
- Works everywhere Go works
- All Go & runtime resources accessible from script (with control)
- Security:
unsafe
andsyscall
packages not used or exported by default - Support Go 1.11 and Go 1.12 (the latest 2 major releases)
Install
As library
import "github.com/containous/yaegi/interp"
REPL
go get -u github.com/containous/yaegi/cmd/yaegi
Note that you can use rlwrap (install with your favorite package manager),
and alias the yaegi
command in alias yaegi='rlwrap yaegi'
in your ~/.bashrc
, to have history and command line edition.
Usage
As an embedded interpreter
Create an interpreter with New()
, run Go code with Eval()
:
package main import ( "github.com/containous/yaegi/interp" "github.com/containous/yaegi/stdlib" ) func main() { i := interp.New(interp.Options{}) i.Use(stdlib.Symbols) _, err := i.Eval(`import "fmt"`) if err != nil { panic(err) } _, err = i.Eval(`fmt.Println("Hello Yaegi")`) if err != nil { panic(err) } }
As a dynamic extension framework
The following program is compiled ahead of time, except bar()
which is interpreted, with the following steps:
- use of
i.Eval(src)
to evaluate the script in the context of interpreter - use of
v, err := i.Eval("foo.Bar")
to get the symbol from the interpreter context, as areflect.Value
- application of
Interface()
method and type assertion to convertv
intobar
, as if it was compiled
package main import "github.com/containous/yaegi/interp" const src = `package foo func Bar(s string) string { return s + "-Foo" }` func main() { i := interp.New(interp.Options{}) _, err := i.Eval(src) if err != nil { panic(err) } v, err := i.Eval("foo.Bar") if err != nil { panic(err) } bar := v.Interface().(func(string) string) r := bar("Kung") println(r) }
As a command line interpreter
The Yaegi command can run an interactive Read-Eval-Print-Loop:
$ yaegi > 1 + 2 3 > import "fmt" > fmt.Println("Hello World") Hello World >
Or interpret Go files:
$ yaegi cmd/yaegi/yaegi.go
>
Documentation
Documentation about Yaegi commands and libraries can be found at usual godoc.org.
Contributing
Yaegi is an open source project, and your feedback and contributions are needed and always welcome.
Issues and pull requests are opened at https://github.com/containous/yaegi
License
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK