This is a rudimentary specification for the Maentwrog programming language.
This information, and the example programs in this distribution, were taken from the esolangs.org wiki page for Maentwrog, written by User:Marinus and (like all esowiki articles) placed in the public domain. Thanks Marinus!
A Maentwrog program consists of a series of words, separated by whitespace. Words can contain any character except whitespace. The way these words are executed depends on the character they begin with.
25 and -14 are
words that push 25 and -14 onto the stack. Extra characters at the end of the word are allowed,
so 25abc and 25.14 both also push 25. : new-word words to execute ; (as in Forth). Redefining a word is not allowed,
and neither are nested function definitions. *varname. This must be done before using a variable. Additionally, words (except number words) can take one of a list of prefixes, changing how the word is executed.
| Prefix | Action | Example | Result |
= | Assign to variable | =foo | A value popped from the stack is assigned to the variable foo. |
@ | If | @bye | Pop value, stop the program (see predefined words) if it isn't 0. |
[ | While | [xyz | Pop value, if it's not 0 execute word xyz, then pop another value and do it again; continue until a 0 is popped. |
$ | Repeat | $. | Pop value, then output that many values from the stack. |
| Word | Stack effect | Description |
bye | Stop program immediately. | |
rem ... ; | Comment. (Ignore all words between rem and ;.)
| |
: word ... ; | Define a new word. | |
debug | Turn on debugging (outputs all words executed). | |
vars | Output a list of currently defined variables and their values. | |
words | Output a list of currently defined words. | |
alloc | n | ptr | Allocate memory for n C longs, returns a pointer. |
free | ptr | - | Free memory at pointer. |
size | - | n | Push stack size. |
dup | a | a a | Duplicate top of stack. |
swap | a b | b a | Swap the two topmost stack values. |
pop | a | - | Remove top value from stack. |
get | ptr | value | Push value at pointer to stack (C *ptr).
|
put | ptr val | - | Store value at pointer (C *ptr = val).
|
rnd | - | n | Push random value. |
> | a b | (a>b) | Push 1 if a is greater than b, else 0. |
< | a b | (a<b) | Push 1 if a is less than b, else 0. |
== | undefined | Undefined. |
. | n | - | Pop a value, output as integer, adding a newline. |
.. | n | - | Pop a value, output as an ASCII character. |
mod | a b | (a%b) | Modulo. |
+ | a b | (a+b) | Addition. |
- | a b | (a-b) | Subtraction. |
* | a b | (a*b) | Multiplication. |
/ | a b | (a/b) | Division, result is rounded towards 0. |