matterbridge/vendor/github.com/d5/tengo/v2
2020-05-24 00:06:21 +02:00
..
parser Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
stdlib Update dependencies / vendor (#1146) 2020-05-24 00:06:21 +02:00
token Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
.gitignore Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
.goreleaser.yml Update vendor d5/tengo (#1066) 2020-03-28 23:41:35 +01:00
builtins.go Update vendor d5/tengo (#1066) 2020-03-28 23:41:35 +01:00
bytecode.go Update dependencies / vendor (#1146) 2020-05-24 00:06:21 +02:00
compiler.go Update dependencies / vendor (#1146) 2020-05-24 00:06:21 +02:00
doc.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
errors.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
formatter.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
go.mod Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
go.sum Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
instructions.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
iterator.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
LICENSE Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
Makefile Update dependencies / vendor (#1146) 2020-05-24 00:06:21 +02:00
modules.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
objects.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
README.md Update dependencies / vendor (#1146) 2020-05-24 00:06:21 +02:00
script.go Update dependencies / vendor (#1146) 2020-05-24 00:06:21 +02:00
symbol_table.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
tengo.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
variable.go Update to tengo v2 (#976) 2020-01-09 21:52:19 +01:00
vm.go Update vendor d5/tengo (#1066) 2020-03-28 23:41:35 +01: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 its compiled/executed as bytecode on stack-based VM thats 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,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

♥️ Like writing Go code? Come work at Skool. Were hiring!