mirror of
				https://github.com/42wim/matterbridge.git
				synced 2025-10-31 05:47:24 +01:00 
			
		
		
		
	
 
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/v2A 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!
