a tiny embeddable scripting language
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Robey 5027920f2c 3.2.0 4 weeks ago
docs add "stop" instruction to stop a script early 2 months ago
src add `_args` and re-add `_proxy` to the argument block passed to a message handler 1 month ago
tests TypeDescriptor.sendMessage now takes its args as Instructions, allowing a "lazyTask" to receive uneval'd ones and handle them lazily. this unlocks shortcut or/and. 1 month ago
.gitignore import tokenizer from zdani 1 year ago
LICENSE.txt include a readme and license 1 year ago
README.md add optional 2 months ago
package-lock.json 3.2.0 4 weeks ago
package.json 3.2.0 4 weeks ago
tsconfig.json fix valueFor to be a promise too (sigh) 7 months ago



Teilz (pronounced "tails") is a tiny embeddable scripting language, written in typescript, and created primarily to support the zdani text game. It stands for "terrifically easy instruction language for zdani".


  • basic-like: most instructions start with a keyword like let or for
  • sandboxed: user code runs with limits on the number of instruction cycles and recursion depth, in a restricted environment
  • strongly typed: every expression is type-checked, without explicit type declarations, because the syntax is kept extremely simple and all types are inferred at parse time
  • extensible: custom types and instructions can (and should) be added by the container
  • simple: all variable references start with @ to distinguish them from instructions; symbols are only used when their meaning has general consensus across all programming languages (; and { ... } and the method call syntax, for example)
  • no "advanced" features like user-defined functions or classes

Builtin types:

  • Boolean
  • Number
  • String
  • Array(A) (array of some other type)
  • Optional(A) (holds some A or none)

Builtin instructions:

  • binary infix operators: * / mod + - == != < > <= >= and or
  • unary operators: not
  • assignment: :=, let
  • conditions, loops, multi-way branches: if, for, match
  • list expressions: any, all, count, sum, min, max (with implicit map & filter)
  • method calls / message passing: @x.set(3, "tomato")
  • format strings: anything in mustaches is parsed as an expression to be stringified: "Double x is {{@x * 2}}"

All of the builtin types may be used as compile-time constants: true, 23, "carrot", [ 1, 2, 3 ]. When you add custom types, you can define syntax so they can be used as constants too.

Example code

Assuming the container adds a print instruction, and defines a local variable named @players of type Array(Player):

for @p in @players where @p.wizard do {
    print "There is a wizard here: {{@p.name}}";
    if @p.username.length mod 2 == 1 then print "Their username is... odd.";






Apache 2 (open-source) license, included in 'LICENSE.txt'.

Credit and blame: Robey Pointer robey@lag.net