From Esolang
Jump to navigation Jump to search
Paradigm(s) imperative declerative
Designed by User:LabRicecat
Appeared in 2021
Computational class Unknown
Reference implementation Unimplemented
Influenced by ini
File extension(s) .taml

TAML, the Text Adventure Markup Language, is an esoteric programming language intending to lay out the program as a kind of text adventure-like tree structure.

Language overview

A TAML program, called an Adventure consists of a set of Questions, where each one has a fixed amount of Answers. Syntactically these are split into three parts: Name, Event and Answers.
Typically a question would look like this

 [Start]                    # Name
 Hello my dear adventurer.  # Event
 {Greetings!} HappyAnswer   # Answers
 {Go away!} RudeAnswer

This successfully creates a Question called Start which executes its Event and afterwards leaves the user with two Answers to pick from.
The output of this program might look like this:

 Hello my dear adventurer.
 [1] Greetings!
 [2] Go away!

The # indicates a comment and every character afterward until a newline will be ignored.


As a Adventure might have multiple Questions, the TAML interpreter will always pick the first defined one as a starting point.
There is no limit on how many Questions are allowed, but all must have a non-empty, unique name and not contain any whitespaces in them.


Events are an optional part of a Question which performs specific actions.
Special instructions can be performed by using the <instruction args...> syntax.
Variables can be inserted via $name. Everything else will be printed to the console as is.


Variables are stored in a global hashmap. When an undefined variable is accessed, it gets replaced by an empty string.
All variables are stored as strings. They are castable to a number using %(<expr>).
Names must not start with a digit but can contain a-z A-Z 0-9 as well as . _ and :


Number literals have to consist of only numbers and at most one . to indicate a floating point.
String literals have to start and end with a double quote ", they support all ANSI escape sequences, starting with a slash /.


Syntax Description
input -> VAR Prompts the user and stores the input into VAR
expr (EXPR) -> VAR Calculates the simple C-like expression into VAR (See Expressions)
var NAME is VAL Sets the variable <name> to Val.
if VAL <BODY> Executes BODY if VAL is truthy. (See Expression)
else <BODY> Executes BODY if the last if failed
ask QUESTION Jumps to the Question
textspeed MILLISECONDS Sets the speed at which the Events text gets printed
clear Clears the screen


TAML evaluates expressions very similar to the C programming language.
Truthy is not 0, and every operator returning a boolean value will always return 1 or 0.
Supported operators are:

Operator C equivalent Name On Strings On Numbers
+ plus + Plus concatenates adds
- minus - Minus errors subtracts
* multiplied * Asterisk error multiplies
/ divided / Slash concatenates and inserts the systems directory slash (/, \ ...) divides
equals == Equals truthy if both strings are the same truthy if both numbers are the same
greater > Greater errors truthy if left is greater than right
less < Less errors truthy if left is less than right
not ! Not errors turns truthy to falsy and vice versa
and && And errors truthy if left and right are truthy
or || Or errors truthy if left or right are truthy
xor ^ Exclusive Or errors truthy if left or right, but not both are truthy

Note: Not can be used to invert the operator that follows.

 1 not equals 2   # truthy
 1 not greater 2  # same as C's <=
 1 not plus 2     # 1 - 2 => -1 
 not not 1        # 1

The opposite of And is Or. Exclusive Or's opposite is Equals.


Answers are just as the Event optional and can be left out.
The syntax looks like this:


After the Event of an Question is finished, a list of all Answers gets printed and the user has to pick one. Starting with index 1.
Special cases:

OPTION empty? QUESTION empty? Only Answer? Action
yes no yes Asks QUESTION after the Event
no yes no Exits the program when picked
yes yes yes Exits the program after the Event


Not enough? Add some lol!

Hello, World!

 Hello, World!

Cat program

 <input -> foo>

Infinite cat program

 <input -> foo>
 {} CAT