mirror of
https://github.com/42wim/matterbridge
synced 2024-11-05 12:00:27 +00:00
.. | ||
parser | ||
stdlib | ||
token | ||
.gitignore | ||
.goreleaser.yml | ||
builtins.go | ||
bytecode.go | ||
compiler.go | ||
doc.go | ||
errors.go | ||
formatter.go | ||
go.mod | ||
go.sum | ||
instructions.go | ||
iterator.go | ||
LICENSE | ||
Makefile | ||
modules.go | ||
objects.go | ||
README.md | ||
script.go | ||
symbol_table.go | ||
tengo.go | ||
variable.go | ||
vm.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"
Test this Tengo code in the Tengo Playground
Features
- Simple and highly readable
Syntax
- Dynamic typing with type coercion
- Higher-order functions and closures
- Immutable values
- 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, data pipeline, transpiler
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
- Language Syntax
- Object Types
- Runtime Types and Operators
- Builtin Functions
- Interoperability
- Tengo CLI
- Standard Library
- Syntax Highlighters: VSCode, Atom
- Why the name Tengo? It's from 1Q84.
♥️ Like writing Go code? Come work at Skool. We're hiring!