Knight

Knight is an imperative programming language created by Sampersand in April 2021. It was designed to be easy to write interpreters for, while still being usable. There are over 20 official interpreters.
== Syntax ==
Knight uses Polish notation: Instead of x OP y, it is OP x y. Because of this, the language has fixed arity. 
Knight contains a number of builtins. They are either represented by uppercase letters or symbols. The former may be referred to by the first letter of the name, optionally followed by any sequence of uppercase letters and underscores (so, for example, WHILE can also be W, WHILST, WAT, or WHY_WOULD_ANYONE_DO_THIS). Variables are a lowercase letter or underscore followed by any number of digits, lowercase letters, or underscores.
All tokens are separated by their character class. So, WxOx is interpreted as W x O x, while WXox is interpreted as WX ox.
The majority of Knight's builtins will coerce the second argument to the type of the first. So, for example, + 2 "2" is 4, while + "2" 2 is "22".
== Builtins ==
For a full and up-to-date list of builtins (and plenty more), see the official spec.
Builtin 	Function
# 	Line comment
:[](){} (tab)(CR)(LF)	Whitespace tokens. Brackets must be balanced.
; 	Returns its second argument. Bread and butter pattern to chain multiple statements together. It is commonly mixed with : as a style choice (as seen in the FizzBuzz example).
TRUE 	true Boolean constant
FALSE 	false Boolean constant
NULL 	null
= 	Assigns a value to a variable.
'" 	String literal. There are no escapes in Knight; the entire string is read from quote to matching quote.
PROMPT 	Reads a line from standard input. Does not include the newline.
OUTPUT 	Outputs the first argument to standard output, followed by a newline (unless the string ends in \).
RANDOM 	Returns a random number from (a minimum) of 0-32767
+ 	If the first argument is a number, the second argument is added, if the first is a string, the second argument is appended.
* 	If the first argument is a number, the second argument is multiplied, if the first is a string, the string is repeated the second argument times.
-/%^ 	Basic arithmetic for subtract, divide, modulo, and power.
? 	Returns true if the two arguments are equal in type and value, false otherwise.
! 	Returns the logical negation of the argument
&| 	Logical and/or, returns the value of the argument that was evaluated
<> 	Arithmetic or lexicographical less-than or greater-than
WHILE 	While loop
IF 	If the first argument is truthy, evaluates the first statement, otherwise the second statement.
GET 	Obtains a substring
SUBSTITUTE 	Substitutes a range in a string with another string.
BLOCK 	Instead of evaluating its arguments, returns a block of code to be used with CALL
CALL 	Invokes a function created by BLOCK
EVAL 	Evaluates a string as a Knight statement.
` 	Runs a shell command, and returns the standard output
QUIT 	Quits the program with the given return value
LENGTH 	Returns the length of the string in bytes
ASCII 	Converts the first character of a String to a Number with its codepoint, or vice versa
DUMP 	Dumps a representation of its argument for debugging.
== Examples ==
"Hello, World!"
 OUTPUT("Hello, World!")
"Hello, World!" (shortest)
 O"Hello, World!"
FizzBuzz to 100
 ; = x 1
 : WHILE (> 101 x) {
 ; OUTPUT (
 IF (!% x 15) { "FizzBuzz" } 
 IF (!% x 3) { "Fizz" }
 IF (!% x 5) { "Buzz" }
 { x }
 : )
 : = x + x 1
 : }
Simple cat program
 WHILE (= line PROMPT()) {
 OUTPUT (line)
 }
== Links ==
* Official GitHub organization
* Official GitHub repo with specs, benchmarks, list of interpreters, and test cases
* Official spec
* C interpreter (typically the fastest and first to get updates)
* Official Discord
Category:Languages Category:Implemented Category: Programming languages using polish notation