TMMLPTEALPAITAFNFAL

From Esolang
Jump to navigation Jump to search

TMMLPTEALPAITAFNFAL (The Multi-Million Language Project To End All Language Projects And Isn't That A Fine Name For A Language) is an esoteric programming language devised by Gerson Kurz. Actually, it is not only one language; it is a new language for each day. Based on a unique-day-index (relative to January 1, 1900) a new allowed set of commands and arbitrary limits for variable names take place. However the syntax of the language does not change and looks mostly like some BASIC dialect. For example, on August 16, 2004, the following rules applied:

VALID TMMLPTEALPAITAFNFAL INSTRUCTIONS FOR TODAY:
- GOTO
- STOP
- RETURN
- ADD
- SUB
- MUL
- DIV
- IF-THEN-UNLESS
- COPY
- WRITE
- READ
- DECLARATION
- WHILE-DO-PROVIDED
- UNLESS-DO
- REPEAT-UNLESS
- DO-UNTIL
- DO-UNLESS
- NAND
RESTRICTIONS ON IDENTIFIERS FOR TODAY:
IDENTIFIER CHARACTERS MUST BE IN ASCII RANGE 32 .. 75 (' ' .. 'K')

Data storage

There are an infinite number of cells. The cells can be given names with the DECLARE instruction; however, they must adhere to the RESTRICTIONS ON IDENTIFIERS. Alternatively, you can simply use a cell index (e.g. CELL 0). The cells each have the storage of a long.

Instructions

Note that not all instructions are available on all days.

Instruction Explanation Availability
GOTO Jumps to the given line number Exactly one of this and GOSUB will be allowed.
GOSUB Calls the subroutine at the given line number Exactly one of this and GOTO will be allowed.
STOP Ends the program. Always allowed.
RETURN Returns from the current subroutine. If there is none, acts like STOP. Always allowed.
ADD Adds the given values together. Always allowed.
SUB Subtracts the given values. Always allowed.
MUL Multiplies the given values together. Always allowed.
DIV Divides the given values, rounding down. Results in the error "HEY, DIVISION BY ZERO IS A VERY BAD IDEA" if the divisor is 0. Exactly one of this and MOD will be allowed.
MOD Takes the modulus of the given values. Results in the error "HEY, MODULO ZERO IS A VERY BAD IDEA" if the divisor is 0. Exactly one of this and DIV will be allowed.
IF-THEN Runs the statement if the given condition is true. At least one of this and the other control structures is allowed.
IF-THEN-ELSE Runs the first statement if the given condition is true; otherwise runs the second statement. At least one of this and the other control structures is allowed.
IF-THEN-UNLESS Runs the statement if the first condition is true and the second condition is false. At least one of this and the other control structures is allowed.
IF-THEN-PROVIDED Runs the statement if the first condition and the second condition are both true. At least one of this and the other control structures is allowed.
COPY Copies the value to the given cell. Always allowed.
WRITE Outputs a character or a number. Always allowed.
READ Gets input as a character or a number. Always allowed.
DECLARE Declares a name for a cell. Always allowed.
WHILE-DO Runs the statement while the condition is true. At least one of this and the other control structures is allowed.
WHILE-DO-UNLESS Runs the statement while the first condition is true and the second condition is false. At least one of this and the other control structures is allowed.
WHILE-DO-PROVIDED Runs the statement while the first condition and the second condition are both true. At least one of this and the other control structures is allowed.
UNLESS-DO Acts the same as UNTIL-DO. At least one of this and the other control structures is allowed.
REPEAT-UNTIL Acts the same as DO-UNTIL. At least one of this and the other control structures is allowed.
REPEAT-UNLESS Acts the same as UNTIL-DO. At least one of this and the other control structures is allowed.
DO-WHILE Acts like a do-while loop while the condition is true. At least one of this and the other control structures is allowed.
DO-UNTIL Acts like a do-while loop while the condition is false. At least one of this and the other control structures is allowed.
DO-UNLESS Acts the same as UNTIL-DO. At least one of this and the other control structures is allowed.
UNTIL-DO Runs the statement while the condition is false. At least one of this and the other control structures is allowed.
NAND Sets the output to 0 if both inputs are -1, otherwise to 1. Always allowed.

Errors

  • The arithmetic instructions must have the destination value on the right. If it's not a cell, results in an error "ERROR, ARITHMETIC INSTRUCTION MUST HAVE MEMORY TARGET, STUPID!"
  • READ must have a cell value as the destination. If it doesn't, results in an error "ERROR, READ INSTRUCTION MUST HAVE MEMORY TARGET, STUPID!"
  • NAND must have the destination value on the right. If it's not a cell, results in an error "ERROR, NAND INSTRUCTION MUST HAVE MEMORY TARGET, STUPID!"

Syntax

Taken from the official page, with some formatting changes and corrections.
STATEMENT: [LINE_NUMBER] CONTROL_LOGIC | MATH_STATEMENT | IO_STATEMENTS | DECLARATION
DECLARATION: "DECLARE" NUMERIC "AS" NAME
NAME: NC (NC | DECINT)*
NC: <non-numeric printable ASCII char>
CONTROL_LOGIC: BRANCH_STATEMENT | IF_FAMILY | WHILE_FAMILY
IF_FAMILY: IF_THEN | IF_THEN_ELSE | IF_THEN_UNLESS | IF_THEN_PROVIDED
WHILE_FAMILY: WHILE_DO | WHILE_DO_UNLESS | WHILE_DO_PROVIDED | UNLESS_DO | REPEAT_UNTIL | REPEAT_UNLESS | DO_WHILE | DO_UNTIL | DO_UNLESS | UNTIL_DO
IF_THEN: "IF" BOOLEAN_EXPRESSION "THEN" STATEMENT
IF_THEN_ELSE: "IF" BOOLEAN_EXPRESSION "THEN" STATEMENT "ELSE" STATEMENT
IF_THEN_UNLESS: "IF" BOOLEAN_EXPRESSION "THEN" STATEMENT "UNLESS" BOOLEAN_EXPRESSION
IF_THEN_PROVIDED: "IF" BOOLEAN_EXPRESSION "THEN" STATEMENT "PROVIDED" BOOLEAN_EXPRESSION
WHILE_DO: "WHILE" BOOLEAN_EXPRESSION "DO" STATEMENT
WHILE_DO_UNLESS: "WHILE" BOOLEAN_EXPRESSION "DO" STATEMENT "UNLESS" BOOLEAN_EXPRESSION
WHILE_DO_PROVIDED: "WHILE" BOOLEAN_EXPRESSION "DO" STATEMENT "PROVIDED" BOOLEAN_EXPRESSION
UNLESS_DO: "UNLESS" BOOLEAN_EXPRESSION "DO" STATEMENT
UNTIL_DO: "UNTIL" BOOLEAN_EXPRESSION "DO" STATEMENT
REPEAT_UNTIL: "REPEAT" STATEMENT "UNTIL" BOOLEAN_EXPRESSION
REPEAT_UNLESS: "REPEAT" STATEMENT "UNLESS" BOOLEAN_EXPRESSION
DO_WHILE: "DO" STATEMENT "WHILE" BOOLEAN_EXPRESSION
DO_UNTIL: "DO" STATEMENT "UNTIL" BOOLEAN_EXPRESSION
DO_UNLESS: "DO" STATEMENT "UNLESS" BOOLEAN_EXPRESSION
IO_STATEMENTS: READ | WRITE
WRITE: "WRITE" ("CHAR" | "INTEGER") NUMERIC
READ: "READ" ("CHAR" | "INTEGER") NUMERIC
BOOLEAN_EXPRESSION: NUMERIC [(">" | "<" | "=" | "<>" | ">=" | "<=") NUMERIC]
MATH_STATEMENT: ADD | SUB | MUL | MOD | DIV | COPY | NAND
ADD: "ADD" NUMERIC "TO" NUMERIC
COPY: "COPY" NUMERIC "TO" NUMERIC
SUB: "SUB" NUMERIC "FROM" NUMERIC
MUL: "MUL" NUMERIC "WITH" NUMERIC
NAND: "NAND" NUMERIC "WITH" NUMERIC
MOD: "MOD" NUMERIC "BY" NUMERIC
DIV: "DIV" NUMERIC "BY" NUMERIC
NUMERIC: NAME | INTEGER | "CELL" INTEGER ["INDIRECT"]
BRANCH_STATEMENT: GOTO | GOSUB | STOP | RETURN
STOP: "STOP"
RETURN: "RETURN"
GOSUB: "GOSUB" NUMERIC
GOTO: "GOTO" NUMERIC
LINE_NUMBER: "LINE" INTEGER ":"
INTEGER: DECINT (DECINT)*
DECINT: "0" .. "9"

External resources