Skip to content
A fast script language for Go
Go
Branch: master
Clone or download
Latest commit c60fc28 Dec 30, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci some code clean up (#237) Dec 20, 2019
cmd add go module v2 (#244) Dec 29, 2019
docs add go module v2 (#244) Dec 29, 2019
parser add go module v2 (#244) Dec 29, 2019
require add go module v2 (#244) Dec 29, 2019
stdlib add go module v2 (#244) Dec 29, 2019
token fix internal package issue (#241) Dec 24, 2019
.gitignore add goreleaser deploy to travis Jan 30, 2019
.goreleaser.yml some code clean up (#237) Dec 20, 2019
LICENSE Create LICENSE Jan 11, 2019
Makefile some code clean up (#237) Dec 20, 2019
README.md Update README.md Dec 29, 2019
builtins.go some code clean up (#237) Dec 20, 2019
bytecode.go add go module v2 (#244) Dec 29, 2019
bytecode_test.go add go module v2 (#244) Dec 29, 2019
compiler.go add go module v2 (#244) Dec 29, 2019
compiler_test.go add go module v2 (#244) Dec 29, 2019
doc.go fix internal package issue (#241) Dec 24, 2019
errors.go some code clean up (#237) Dec 20, 2019
example_test.go add go module v2 (#244) Dec 29, 2019
formatter.go some code clean up (#237) Dec 20, 2019
go.mod add go module v2 (#244) Dec 29, 2019
go.sum fix go.sum (#238) Dec 20, 2019
instructions.go add go module v2 (#244) Dec 29, 2019
iterator.go some code clean up (#237) Dec 20, 2019
modules.go some code clean up (#237) Dec 20, 2019
objects.go add go module v2 (#244) Dec 29, 2019
objects_test.go add go module v2 (#244) Dec 29, 2019
script.go add go module v2 (#244) Dec 29, 2019
script_test.go add go module v2 (#244) Dec 29, 2019
symbol_table.go fix internal package issue (#241) Dec 24, 2019
symbol_table_test.go add go module v2 (#244) Dec 29, 2019
tengo.go some code clean up (#237) Dec 20, 2019
tengo_test.go add go module v2 (#244) Dec 29, 2019
variable.go some code clean up (#237) Dec 20, 2019
variable_test.go add go module v2 (#244) Dec 29, 2019
vm.go add go module v2 (#244) Dec 29, 2019
vm_test.go add go module v2 (#244) Dec 29, 2019

README.md

The Tengo Language

GoDoc Go Report Card CircleCI Sourcegraph

Tengo is a small, dynamic, fast, secure script language for Go.

Tengo is fast and secure because it's compiled/executed as bytecode on stack-based VM that's written in native Go.

/* The Tengo Language */
fmt := import("fmt")

each := func(seq, fn) {
    for x in seq { fn(x) }
}

sum := func(init, seq) {
    each(seq, func(x) { init += x })
    return init
}

fmt.println(sum(0, [1, 2, 3]))   // "6"
fmt.println(sum("", [1, 2, 3]))  // "123"

Test this Tengo code in the Tengo Playground

Features

Benchmark

fib(35) fibt(35) Type
Go 48ms 3ms Go (native)
Tengo 2,349ms 5ms VM on Go
Lua 1,416ms 3ms Lua (native)
go-lua 4,402ms 5ms Lua VM on Go
GopherLua 4,023ms 5ms Lua VM on Go
Python 2,588ms 26ms Python (native)
starlark-go 11,126ms 6ms Python-like Interpreter on Go
gpython 15,035ms 4ms Python Interpreter on Go
goja 5,089ms 5ms JS VM on Go
otto 68,377ms 11ms JS Interpreter on Go
Anko 92,579ms 18ms Interpreter on Go

* fib(35): Fibonacci(35)
* fibt(35): tail-call version of Fibonacci(35)
* Go does not read the source code from file, while all other cases do
* See here for commands/codes used

Quick Start

go get github.com/d5/tengo/v2

A simple Go example code that compiles/runs Tengo script code with some input/output values:

package main

import (
	"context"
	"fmt"

	"github.com/d5/tengo/v2"
)

func main() {
	// Tengo script code
	src := `
each := func(seq, fn) {
    for x in seq { fn(x) }
}

sum := 0
mul := 1
each([a, b, c, d], func(x) {
	sum += x
	mul *= x
})`

	// create a new Script instance
	script := tengo.NewScript([]byte(src))

	// set values
	_ = script.Add("a", 1)
	_ = script.Add("b", 9)
	_ = script.Add("c", 8)
	_ = script.Add("d", 4)

	// run the script
	compiled, err := script.RunContext(context.Background())
	if err != nil {
		panic(err)
	}

	// retrieve values
	sum := compiled.Get("sum")
	mul := compiled.Get("mul")
	fmt.Println(sum, mul) // "22 288"
}

References

You can’t perform that action at this time.