Forked and more actively developed tengo version
2f86800724
* 1. adding more methods to enum module 2. added ModuleMap.AddMap() 3. added bytes iterator * add builtin functions 'is_enumerable' and 'is_array_like' * builtin function 'is_iterable' * first iteration on 'enum' module * fix 'is_iterable' builtin function |
||
---|---|---|
assert | ||
cli | ||
cmd | ||
compiler | ||
docs | ||
objects | ||
runtime | ||
script | ||
stdlib | ||
.gitignore | ||
.goreleaser.yml | ||
.travis.yml | ||
LICENSE | ||
Makefile | ||
README.md | ||
tengo.go |
The Tengo Language
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"
Run this code in the Playground
Features
- Simple and highly readable Syntax
- Dynamic typing with type coercion
- Higher-order functions and closures
- Immutable values
- Garbage collection
- Securely Embeddable and Extensible
- Compiler/runtime written in native Go (no external deps or cgo)
- Executable as a standalone language / REPL
- Use cases: rules engine, state machine, gaming, data pipeline, transpiler
Benchmark
fib(35) | fibt(35) | Type | |
---|---|---|---|
Go | 65ms |
4ms |
Go (native) |
Tengo | 2,786ms |
5ms |
VM on Go |
Lua | 1,775ms |
3ms |
Lua (native) |
go-lua | 5,173ms |
5ms |
Lua VM on Go |
GopherLua | 5,392ms |
5ms |
Lua VM on Go |
Python | 2,865ms |
26ms |
Python (native) |
starlark-go | 16,716ms |
11ms |
Python-like Interpreter on Go |
gpython | 18,709ms |
6ms |
Python Interpreter on Go |
goja | 6,773ms |
13ms |
JS VM on Go |
otto | 87,592ms |
13ms |
JS Interpreter on Go |
Anko | 107,647ms |
22ms |
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