Skip to content
A fast script language for Go
Go
Branch: master
Clone or download

Latest commit

ozanh add string comparison support (#294)
* enable relative imports

* update per 1st review

* remove symlink stuffs

* fix cli run in make file

* make resolving import path explicit

* fix importDir

* add string comparison operators

* fix duplicates
Latest commit 366c699 May 25, 2020

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/workflows add GitHub Actions (#293) May 23, 2020
cmd enable relative imports (#285) May 22, 2020
docs add string comparison support (#294) May 25, 2020
examples/interoperability add interoperability example (#266) Apr 24, 2020
parser add go module v2 (#244) Dec 29, 2019
require add go module v2 (#244) Dec 29, 2019
stdlib fix stdlib json string encoding (#272) May 5, 2020
testdata/cli enable relative imports (#285) May 22, 2020
token fix internal package issue (#241) Dec 24, 2019
.gitignore add goreleaser deploy to travis Jan 30, 2019
.goreleaser.yml updated goreleaser config (#249) Feb 16, 2020
LICENSE Create LICENSE Jan 11, 2019
Makefile enable relative imports (#285) May 22, 2020
README.md add GitHub Actions (#293) May 23, 2020
builtins.go builtin splice (#254) Mar 4, 2020
builtins_test.go builtin splice (#254) Mar 4, 2020
bytecode.go fix a bug in bytecode optimization code (#292) May 23, 2020
bytecode_test.go add go module v2 (#244) Dec 29, 2019
compiler.go enable relative imports (#285) May 22, 2020
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 string comparison support (#294) May 25, 2020
objects_test.go add go module v2 (#244) Dec 29, 2019
script.go enable relative imports (#285) May 22, 2020
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 Revert "remove callable args alloc (#259)" (#260) Mar 15, 2020
vm_test.go add string comparison support (#294) May 25, 2020

README.md

The Tengo Language

GoDoc test Go Report Card

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) Language (Type)
Tengo 2,931ms 4ms Tengo (VM)
go-lua 4,824ms 4ms Lua (VM)
GopherLua 5,365ms 4ms Lua (VM)
goja 5,533ms 5ms JavaScript (VM)
starlark-go 11,495ms 5ms Starlark (Interpreter)
Yaegi 15,645ms 12ms Yaegi (Interpreter)
gpython 16,322ms 5ms Python (Interpreter)
otto 73,093ms 10ms JavaScript (Interpreter)
Anko 79,809ms 8ms Anko (Interpreter)
- - - -
Go 53ms 3ms Go (Native)
Lua 1,612ms 3ms Lua (Native)
Python 2,632ms 23ms Python 2 (Native)

* 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

♥️ Like writing Go code? Come work at Skool. We're hiring!

You can’t perform that action at this time.