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

From Esolang
Jump to navigation Jump to search
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.

Value-Returning Commands
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

Logic-Related Commands
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.