MCPcopy Index your code
hub / github.com/d5/tengo

github.com/d5/tengo @v3.0.0

repository ↗ · DeepWiki ↗ · release v3.0.0 ↗ · + Follow
1,368 symbols 4,200 edges 78 files 618 documented · 45% 2 cross-repo links updated 2mo agov3.0.0 · 2025-05-24★ 3,82771 open issues
README

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 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

Benchmark

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

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() {
    // 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"

References

Extension points exported contracts — how you extend this code

Iterator (Interface)
Iterator represents an iterator for underlying data type. [6 implementers]
iterator.go
Node (Interface)
Node represents a node in the AST. [38 implementers]
parser/ast.go
Expr (Interface)
Expr represents an expression node in the AST. [24 implementers]
parser/expr.go
Stmt (Interface)
Stmt represents a statement in the AST. [12 implementers]
parser/stmt.go
Importable (Interface)
Importable interface represents importable module instance. [2 implementers]
modules.go
Object (Interface)
Object represents an object in the VM. [2 implementers]
objects.go
ScannerErrorHandler (FuncType)
ScannerErrorHandler is an error handler for the scanner.
parser/scanner.go
ModuleGetter (Interface)
ModuleGetter enables implementing dynamic module loading. [2 implementers]
modules.go

Core symbols most depended-on inside this repo

Equal
called by 310
require/require.go
TypeName
called by 248
objects.go
NoError
called by 117
require/require.go
emit
called by 105
compiler.go
String
called by 62
parser/ast.go
String
called by 46
objects.go
next
called by 42
parser/scanner.go
wrapError
called by 40
stdlib/errors.go

Shape

Method 648
Function 592
Struct 107
TypeAlias 11
Interface 7
FuncType 3

Languages

Go100%

Modules by API surface

objects.go171 symbols
parser/expr.go122 symbols
vm_test.go102 symbols
parser/parser_test.go75 symbols
parser/stmt.go62 symbols
parser/parser.go58 symbols
formatter.go53 symbols
stdlib/func_typedefs_test.go45 symbols
stdlib/func_typedefs.go44 symbols
stdlib/json/scanner.go42 symbols
script_test.go42 symbols
compiler.go42 symbols

Used by 2 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add tengo \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact