Max Kuznetsov c461a7fe60 Fix: stop execution when trying to slice an unsupported type (#443) | 8 月之前 | |
---|---|---|
.github | 1 年之前 | |
cmd | 4 年之前 | |
docs | 8 月之前 | |
examples | 4 年之前 | |
parser | 8 月之前 | |
require | 4 年之前 | |
stdlib | 8 月之前 | |
testdata | 3 年之前 | |
token | 4 年之前 | |
.gitignore | 8 月之前 | |
.goreleaser.yml | 4 年之前 | |
LICENSE | 5 年之前 | |
Makefile | 4 年之前 | |
README.md | 2 年之前 | |
builtins.go | 3 年之前 | |
builtins_test.go | 3 年之前 | |
bytecode.go | 4 年之前 | |
bytecode_test.go | 4 年之前 | |
compiler.go | 2 年之前 | |
compiler_test.go | 10 月之前 | |
doc.go | 4 年之前 | |
errors.go | 3 年之前 | |
eval.go | 3 年之前 | |
eval_test.go | 3 年之前 | |
example_test.go | 4 年之前 | |
formatter.go | 4 年之前 | |
go.mod | 4 年之前 | |
go.sum | 4 年之前 | |
instructions.go | 10 月之前 | |
iterator.go | 4 年之前 | |
modules.go | 3 年之前 | |
objects.go | 2 年之前 | |
objects_test.go | 4 年之前 | |
script.go | 1 年之前 | |
script_test.go | 2 年之前 | |
symbol_table.go | 4 年之前 | |
symbol_table_test.go | 4 年之前 | |
tengo.go | 3 年之前 | |
tengo_test.go | 4 年之前 | |
variable.go | 4 年之前 | |
variable_test.go | 4 年之前 | |
vm.go | 8 月之前 | |
vm_test.go | 8 月之前 |
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
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
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"