Forked and more actively developed tengo version
Find a file
Józef Sokołowski 6fc27defb8
add support for parsing binary, octal and hex numbers (#364)
Fixes #363

Co-authored-by: Józef Sokołowski <jozef.sokolowski@gmail.com>
2022-06-15 09:50:39 +05:30
.github/workflows limit to go 1.16+ (#382) 2022-06-12 21:32:53 +05:30
cmd enable relative imports (#285) 2020-05-22 13:57:38 -07:00
docs Corrected/changed variable names of the base64 and hex imports (instead of fmt) to correspond with the module name itself. (#375) 2022-04-15 18:38:56 +01:00
examples/interoperability add interoperability example (#266) 2020-04-24 18:26:16 +02:00
parser add support for parsing binary, octal and hex numbers (#364) 2022-06-15 09:50:39 +05:30
require add go module v2 (#244) 2019-12-29 13:38:51 -08:00
stdlib fix documentation for enum.filter (#359) 2022-02-06 22:53:27 -08:00
testdata add custom extension support for importing source file (#350) 2021-11-13 15:13:39 -08:00
token fix internal package issue (#241) 2019-12-24 07:42:30 -08:00
.gitignore add goreleaser deploy to travis 2019-01-30 00:52:55 -08:00
.goreleaser.yml updated goreleaser config (#249) 2020-02-16 06:29:06 +01:00
builtins.go PR: builtin range function #326 (#328) 2021-03-01 22:34:04 -08:00
builtins_test.go PR: builtin range function #326 (#328) 2021-03-01 22:34:04 -08:00
bytecode.go fix a bug in bytecode optimization code (#292) 2020-05-23 08:23:33 -07:00
bytecode_test.go add go module v2 (#244) 2019-12-29 13:38:51 -08:00
compiler.go fix deadcode optimization (#378) 2022-06-10 11:15:34 +05:30
compiler_test.go fix deadcode optimization (#378) 2022-06-10 11:15:34 +05:30
doc.go fix internal package issue (#241) 2019-12-24 07:42:30 -08:00
errors.go PR: builtin range function #326 (#328) 2021-03-01 22:34:04 -08:00
eval.go add Eval function (#338) 2021-07-05 01:49:38 -07:00
eval_test.go add Eval function (#338) 2021-07-05 01:49:38 -07:00
example_test.go add go module v2 (#244) 2019-12-29 13:38:51 -08:00
formatter.go some code clean up (#237) 2019-12-20 11:40:38 -08:00
go.mod add go module v2 (#244) 2019-12-29 13:38:51 -08:00
go.sum fix go.sum (#238) 2019-12-20 11:51:04 -08:00
instructions.go add go module v2 (#244) 2019-12-29 13:38:51 -08:00
iterator.go some code clean up (#237) 2019-12-20 11:40:38 -08:00
LICENSE Create LICENSE 2019-01-11 01:17:07 -08:00
Makefile enable relative imports (#285) 2020-05-22 13:57:38 -07:00
modules.go Extract ModuleGetter interface for dynamic imports (#349) 2021-11-06 17:34:48 -07:00
objects.go Fix copying user functions (#366) 2022-02-08 08:55:33 -08:00
objects_test.go add go module v2 (#244) 2019-12-29 13:38:51 -08:00
README.md Update README.md 2022-01-16 18:50:06 -08:00
script.go Handle panics by deferring recover as an error (#345) 2021-11-13 15:10:47 -08:00
script_test.go add go module v2 (#244) 2019-12-29 13:38:51 -08:00
symbol_table.go fix issues with symbols in global scope blocks (#318) 2020-09-17 17:15:42 -07:00
symbol_table_test.go fix local symbol resolution bug (#316) 2020-09-13 19:33:48 -07:00
tengo.go add custom extension support for importing source file (#350) 2021-11-13 15:13:39 -08:00
tengo_test.go add go module v2 (#244) 2019-12-29 13:38:51 -08:00
variable.go some code clean up (#237) 2019-12-20 11:40:38 -08:00
variable_test.go add go module v2 (#244) 2019-12-29 13:38:51 -08:00
vm.go For the OpMap VM instruction, since numElements is known just use the capacity hint. (#347) 2021-09-21 13:47:21 +01:00
vm_test.go fix issues with symbols in global scope blocks (#318) 2020-09-17 17:15:42 -07:00

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,315ms 3ms Tengo (VM)
go-lua 4,028ms 3ms Lua (VM)
GopherLua 4,409ms 3ms Lua (VM)
goja 5,194ms 4ms JavaScript (VM)
starlark-go 6,954ms 3ms Starlark (Interpreter)
gpython 11,324ms 4ms Python (Interpreter)
Yaegi 11,715ms 10ms Yaegi (Interpreter)
otto 48,539ms 6ms JavaScript (Interpreter)
Anko 52,821ms 6ms Anko (Interpreter)
- - - -
Go 47ms 2ms Go (Native)
Lua 756ms 2ms Lua (Native)
Python 1,907ms 14ms Python2 (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() {
	// create a new Script instance
	script := tengo.NewScript([]byte(
`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
})`))

	// 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"
}

Or, if you need to evaluate a simple expression, you can use Eval function instead:

res, err := tengo.Eval(ctx,
	`input ? "success" : "fail"`,
	map[string]interface{}{"input": 1})
if err != nil {
	panic(err)
}
fmt.Println(res) // "success"

References