We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.
Englisht
- This is still a work in progress. It may be changed in the future.
Englisht (prounced like en glished, a slant rhyme with enmeshed that rhymes with fished) is an esolang based on an unreleased esolang called English+ designed by User:Redisnotblue, with the intent of figuring out how well the established commands in that language could actually create a usable programming language.
The language is notably restricted by oversights in the spec of English+. It may shift between different levels of adherance over time.
Syntax
These are all the builtin commands Englisht is allowed to have.
All statements in Englisht can start with “Please”, similarly to INTERCAL. This has no effect on the program but marks where lines start/end. It's kind of like the optional semicolon in Python.
| Englisht | Short Explanation |
|---|---|
| make | Create a variable which refers to something |
| read | Read a web article. |
| ask | Get user input. |
| say | Output the following text until the next newline. |
| using | Import a library. |
Somewhat like its immediate predecessor English+ and its ultimate predecessor English, this language can have multiple keywords for the same function, e.g. say can also be represented as print, output etc. This is always done with the keyword make.
make print say make output say
It also allows you to create comments with the keyword read provided the comment is not a valid website. The comment also has to be separated from the command by a space. If it is a valid website, read returns all the text in that website as a string.
read This is a comment. readThis is not a comment. read https://esolangs.org/wiki/Englisht read The above is not a comment, but this is. read This says https://esolangs.org/wiki/Englisht but that's not the whole thing so this is also a comment.
Integers
In Englisht, only numbers which are a single word (including hyphenated ones) exist in general. Numbers from zero through ninety-nine exist as normal, though numbers which could otherwise be read as multiple words must be hyphenated. Words such as hundred, thousand, million, billion, trillion, quadrillion, quintillion, and sextillion, but no others, essentially modify the number in front by multiplying it by the amount in the long scale (not the short scale). 10^9 is one thousand million, while 10^12 is one billion and 10^18 is one trillion. Negative goes before numbers and makes them negative.
Ideally, you can import the numbers library to get better numbers, but whether that's actually possible to implement is up in the air.
The commands add, subtract, multiply, divide, and remainder (modulo result) exist. Symbolic versions of these operators such as +, -, *, / and % should also be in the numbers module but can be obtained with the keyword make as well. You can also join operations and numbers using the keyword make as well. Order of operations goes left to right on the whole with many exceptions. Joined number - operation pairs occur before unjoined ones. With regards to the operations, multiply / divide / remainder occur first, then add / subtract.
Variables
Variables can consist of uppercase and lowercase letters within the set of ASCII characters, definitely ones such as A through Z and a through z, but also ones like ÿ. They can also contain hyphens (-).
In every case, they are separated from keywords and other variables by spaces.
A variable is defined using the keyword make, which is actually its main function. The variable is defined as the thing after make, while the things after the variable are put inside. A variable can be instantiated without a value by:
- putting a newline after the variable
- putting two or more whitespace characters (space, tab, newline) after a variable
- reading a web file that doesn't exist
- using a library that doesn't exist
make nothing read This instantiates "nothing" as empty. make one-half one divide two read This instantiates "one-half" as zero (because of integer division). make one-half one divide two read This reassigns "one-half" as empty because of the two whitespace characters. make one-half read one divide two read This reassigns "one-half" as empty because it's not a web address. make one-half read https://esolangs.org/wiki/Englisht read This reassigns "one-half" as the contents of this page.
Input and Output
say can only output text, not variables. It outputs text which is after it, separated by a space, and outputs a newline after all the text it outputs.
ask puts data that the user enters into a variable after it, where the variable is separated by a space.
ask not-a-quine say not-a-quine read The above prints "not-a-quine", not the value in the variable.
Libraries and Variables
Libraries work similarly to files, with a few weird twists.
Libraries are called using the using keyword, but this is not all the keyword is used for. It can be used to evaluate the value within a variable as the thing which the built-in function checks as opposed to the string, but:
- It can only do this for a single variable.
- The variable has to be the final thing in the command (ideally it should come strictly before the newline, though allowing some whitespace afterwards is acceptable, just not required)
ask not-a-quine make temp not-a-quine using say not-a-quine read The above prints the value in the variable "not-a-quine". make not-a-quine temp using make temp-two read not-a-quine read The above evaluates the value within not-a-quine as a webpage and stores it in temp-two. using say not-a-quine read This also prints the value in not-a-quine. using say temp-two read This prints the text of the webpage which not-a-quine was referring to, or it prints nothing if there was no such webpage.
This also works for all times where you just want to use the library on a value within a variable.
make temp-eleven eleven using numbers say eleven read This prints "11" as opposed to "eleven".
Logic
| if | if statement |
| and | logical and-like thing |
| or | logical or-like thing / elif statement |
| not | logical not |
| otherwise | else statement |
| repeat | begin do-while loop |
Englisht has three main logic operators - or, and, not. You may have noticed or is defined as "elif statement". These logical operators can only exist within if-statements.
There are no boolean operators and there aren't really any boolean values either. A value is false if it is uninstantiated, defined as empty, or defined as zero, and it is true in every other case. Additionally, all three false values are interchangeable, meaning a variable could even be automatically instantiated with a value of zero the first time it is mentioned until it is confirmed to be a string.
If-statements always go after the command they modify. Then another command can modify the if-statement:
- or goes after statements like an elif statement (like "otherwise, if)
- and goes after statements like a nested if-statement (like "if also")
- and-statements can modify preceding or statements, but not vice versa
- not goes before values so they get treated like true if they would be false or false if they would be true
- otherwise ends the if-statement and goes before the statement it modifies, which can also include another if-statement or can simply be a newline or two whitespace characters after it
- All if-statements must end in an otherwise, even if the otherwise has a newline or two whitespace characters after it
Essentially, the distinction between an elif and an else... if exists and is used for spacing purposes.
make true one if one make true three and two make true two or two otherwise make true zero
The thing below is the code with the important words surrounded by apostrophes.
make true one '''if''' one make true three '''and''' two make true two '''or''' two otherwise make true zero
If one, true has the value of one. If one and two, true has the value of three. If two but not one, true has the value of two. If neither two nor one, false has the value of zero.
Finally, repeat allows the things after it to loop. Essentially, it works like a do-while loop, where the repeat has a newline after it if there is more than one command after it, and then in a newline, the if statement which checks whether it should continue looping occurs.
make does-not-repeat one repeat say 1 if does-not-repeat otherwise read That constantly prints 1. repeat say 1 if zero otherwise read That constantly prints 1. repeat make looper looper plus one make temp looper say Current iteration is: using say looper make looper temp if looper minus ten otherwise say Done. read This prints "Current iteration is:(newline)(iteration number)" from one through ten.
The if-statement at the end can also have and, or, and otherwise statements which occur after the loop is done.