WTFCode

WTFCode is an esoteric programming language created by User:Asicosilomu on the 3rd of Feburary 2023, with the goal of over-complicating the simplest of tasks. 
The language only has three symbols: brackets, square brackets and double quotes. It uses instructions for everything, math, comparison, and logic operators are all instructions. This doesn't seem that bad at first, but the messed up syntax will quickly confuse you.
== Syntax ==
* Each instruction must be on a separate line.
* When passing arguments to an instruction, you must specify the datatype and, after a space, the value.
* Arguments are separated by spaces.
* Numbers are not wrapped in any way.
* Strings must be enclosed in double quotes, which cannot be escaped.
* Code for returnvalues must be enclosed in brackets (not square brackets), and any brackets inside the code must be properly opened and closed.
* if, while and function statements have their conditions/arguments enclosed in square brackets.
* Instructions and datatypes are case insensitive.
== Datatypes ==
WTFCode has three datatypes: number, string and returnvalue. Syntax for the first two is in the previous section.
returnvalue is a datatype that denotes a value that is the return value of a specific instruction. The value of a returnvalue is enclosed within brackets (see Syntax), and inside it is a single instruction. If the instruction returns a value, that becomes the returnvalue, otherwise, it becomes undefined.
== Instructions ==
=== JSEVAL ===
Evaluates a line of JavaScript (that must be able to be put in a return statement) and returns its result.
Syntax:
 JSEVAL [CODE]
Returns: any
=== RETURN ===
Returns a value. If used in the root of the program, it exits the interpreter and the value is returned outside. If used in a function, the function exits, and the value is returned to the caller.
Syntax:
 RETURN [DATATYPE] [VALUE]
Returns: none
=== VARIABLE ===
Instruction for managing variables. Has two modes: GET and SET.
==== VARIABLE GET ====
Gets the value of the variable [NAME].
Syntax:
 VARIABLE GET [NAME]
Returns: any
==== VARIABLE SET ====
Sets variable [NAME]'s value to [VALUE], of type [DATATYPE].
Syntax:
 VARIABLE SET [DATATYPE] [NAME] [VALUE]
Returns: none
=== EXECCHILDFUNCTIONJS ===
Allows you to execute a JavaScript function that you have access to as an object. Complete with the ability to pass parameters. Has a way more humane shorthand of "ecfjs". First argument (/w datatype) is the function object, and, after that, parameters.
Syntax:
 ECFJS [DATATYPE] [FUNCTION] [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
Returns: any
== Instruction groups ==
Instruction groups are groups of instructions that are meant to accomplish the same category of tasks.
=== Comparison instructions ===
Instructions which allow you to compare two values.
Equality:
 EQ [DATATYPE] [VALUE] [DATATYPE] [VALUE]
== if, while and function ==
=== IF ===
Checks if the condition is true and, if so, executes code up until the ESCAPE instruction. ESCAPE is used to close the statement. Condition is wrapped in square brackets.
Syntax:
 IF [(CONDITION)]
 # your code here...
 ESCAPE
=== WHILE ===
Just like the if, except that it will repeatedly execute the code until the condition becomes false. If the condition never becomes false, an infinite loop is formed and freezes your program.
Syntax:
 WHILE [(CONDITION)]
 # your code here...
 ESCAPE
=== FUNCTION ===
To declare a Function, open a new function statement by using the FUNCTION instruction. After a space, type the name of your function (case-insensitive) and, after another space, the arguments between square brackets, under the form [DATATYPE] [NAME] [DATATYPE] [NAME] .... You'll be able to access them in your function as regular variables, by their [NAME]. The statement is closed with the ESCAPE instruction.
Syntax:
 FUNCTION MYFUNC [[DATATYPE] [NAME] [DATATYPE] [NAME] ...]
 # your code here...
 ESCAPE
You can also not specify arguments, by just typing [], or omitting the brackets altogether. Afterwards, you can call the function exactly like a built-in instruction. As mentioned before, function names are case-insensitive, which means myfunc, mYfUnC and MYFUNC refer to the same function. Declaring myfunc, then MYFUNC, because of this property, MYFUNC will overwrite myfunc.
Syntax:
 MYFUNC [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
Here is an example of a function which takes a number and returns its value times 10:
 FUNCTION MULT10 [NUMBER NR]
 RETURN RETURNVALUE (MULT RETURNVALUE (VAR GET NR) NUMBER 10)
 ESCAPE
And to call it:
 MULT10 NUMBER 69
That returns 690.
==== Special Datatypes ====
There are two datatypes exclusive to the Function: any and mode. They may be used when specifying function arguments.
===== ANY =====
any indicates that a given argument accepts a value of any type.
===== MODE =====
mode allows you to create functions like VAR, that have multiple modes. A mode argument cannot have a datatype in function calls.
The following function uses mode (it needs ostream):
 FUNCTION MYFUNC [MODE WAYOFLIFE STRING TEST]
 SHOW INFO RETURNVALUE (VAR GET WAYOFLIFE)
 SHOW INFO RETURNVALUE (VAR GET TEST)
 ESCAPE
Calling it:
 MYFUNC SHOVE STRING "in ur mom"
That would print "SHOVE", then, on another line, "in ur mom".
Tip! To make your modes case-insensitive, pass them through LOWER before checking them against anything. Don't forget to make the check value all lowercase. Or uppercase, if you use UPPER.
==== "arguments" array ====
"arguments" is a special variable that is set by the interpreter at the time your function is called. This array contains all the arguments that your function was called with, but didn't ask for. The name IS case-sensitive.
If you have said function:
 FUNCTION MYFUNC [STRING ONE STRING TWO]
 INCLUDE LOCAL/STRING
 RETURN RETURNVALUE (CONCAT RETURNVALUE (VAR GET ONE) STRING " " RETURNVALUE (VAR GET TWO))
 ESCAPE
And you call it like this:
 MYFUNC STRING "Hello" STRING "World" STRING "Asicosilomu" STRING "is" STRING "the" STRING "best!"
The arguments object would look like:
 Array (4) [ "Asicosilomu", "is", "the", "best!" ]
== Imports ==
Modules are snippets of code that you can import into your program to provide extra functionality. Just like #include -ing something in your C++ program. You can import modules from local/, a special directory that contains all of the interpreter's built-in modules, or load them from a remote location!
Syntax:
 INCLUDE [PATH]
or
 IMPORT [PATH]
Example:
 INCLUDE LOCAL/DIALOGS
 INCLUDE https://raw.githubusercontent.com/Asicosilomu/files/main/sample.wtf
or
 IMPORT LOCAL/DIALOGS
 IMPORT https://raw.githubusercontent.com/Asicosilomu/files/main/sample.wtf
=== Loading remote modules ===
You can load a remote module by simply not importing from local/. Entering a path that is not part of local/ will cause the interpreter to load the module remotely. If you specify a relative path, it will be loaded correctly, so a script running on https://asicosilomu.com loading modules/sample.wtf would lead to the importing of https://asicosilomu.com/modules/sample.wtf.
For example, if you have a file at https://asicosilomu.com/sample.wtf which looks like this:
 # Sample WTFCode module
 
 function greet [string t]
 include local/ostream
 include local/string
 show log returnvalue (concat string "Hello, " returnvalue (var get t) string "!")
 escape
And you load it like this...
 include https://asicosilomu.com/sample.wtf
Then call the function...
 greet string "Asicosilomu"
Your script would show this:
 Hello, Asicosilomu!
Warning! When including a remote module, your program halts until the server responds or the request times out.
=== Built-in modules ===
Here are the modules that come with the latest version of the interpreter. Keep in mind, modules are written 100% in WTFCode!
==== DIALOGS ====
The dialogs module can be used to show pop-ups, using the alert, confirm and prompt JavaScript functions. Those are nicely integrated as WTFCode instructions when you import dialogs. Paths are case-insensitive, like everything else.
Importing:
 INCLUDE LOCAL/DIALOGS
or
 IMPORT LOCAL/DIALOGS
Example:
 INCLUDE LOCAL/DIALOGS
 VAR SET RETURNVALUE NAME (PROMPT STRING "What's your name?" STRING "Asicosilomu")
 ALERT RETURNVALUE (CONCAT STRING "OK. Your name is " RETURNVALUE (VAR GET NAME) STRING ".")
This example will ask you for your name, then show it back to you.
==== COMPARISON ====
Since the migration of most instructions from native JS to WTFCode modules, comparison provides comparison instructions.
Importing:
 INCLUDE LOCAL/COMPARISON
or
 IMPORT LOCAL/COMPARISON
===== Instructions =====
Greater than:
 GREAT [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Less than:
 LESS [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Greater than or equal to:
 GREATEQ [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Less than or equal to:
 LESSEQ [DATATYPE] [VALUE] [DATATYPE] [VALUE]
==== LOGIC ====
Since the migration of most instructions from native JS to WTFCode modules, logic provides logic operators.
Importing:
 INCLUDE LOCAL/LOGIC
or
 IMPORT LOCAL/LOGIC
===== Instructions =====
Invert the value of a boolean:
 NOT [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Check if two or more values are true:
 AND [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
Check if one of two or more values is true:
 OR [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
==== STRING ====
Since the migration of most instructions from native JS to WTFCode modules, string provides string manipulation functions.
Importing:
 INCLUDE LOCAL/STRING
or
 IMPORT LOCAL/STRING
===== Instructions =====
====== STRING ======
Converts a value to a string.
Syntax:
 STRING [DATATYPE] [VALUE]
Returns: string
====== UPPER ======
Changes a string to all uppercase.
Syntax:
 UPPER [DATATYPE] [VALUE]
Returns: string
====== LOWER ======
Changes a string to all lowercase.
Syntax:
 LOWER [DATATYPE] [VALUE]
Returns: string
====== CONCAT ======
Concatenates two one or more values as a string.
Syntax:
 CONCAT [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
Returns: string
==== MATH ====
Since the migration of most instructions from native JS to WTFCode modules, math provides mathematical operators.
Importing:
 INCLUDE LOCAL/MATH
or
 IMPORT LOCAL/MATH
===== Instructions =====
====== FLOOR ======
Shaves the decimal points off a number.
Syntax:
 FLOOR [DATATYPE] [VALUE]
Returns: number
Chain addition:
 CHAINADD [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
Chain subtraction:
 CHAINSUB [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
Chain multiplication:
 CHAINMULT [DATATYPE] [VALUE] [DATATYPE] [VALUE] ...
Addition:
 ADD [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Subtraction:
 SUB [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Multiplication:
 MULT [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Division:
 DIV [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Modulus:
 MOD [DATATYPE] [VALUE] [DATATYPE] [VALUE]
==== RANDOM ====
Since the migration of most instructions from native JS to WTFCode modules, random provides random numbers.
Importing:
 INCLUDE LOCAL/RANDOM
or
 IMPORT LOCAL/RANDOM
===== Instructions =====
====== RANDOM ======
Returns a random number in a specified range. The first argument is the minimum number, and the second is the maximum.
Syntax:
 RANDOM [DATATYPE] [VALUE] [DATATYPE] [VALUE]
Returns: number
==== DOM ====
Since the migration of most instructions from native JS to WTFCode modules, dom provides DOM management functions.
Importing:
 INCLUDE LOCAL/DOM
or
 IMPORT LOCAL/DOM
===== Instructions =====
====== DOM CREATE ======
Returns a new HTML element with tagname [NAME]. [NAME] is a value with a datatype, which must be specified.
Syntax:
 DOM CREATE [DATATYPE] [NAME]
Returns: object
====== DOM QUERY ======
Returns the first child of [ELEMENT] that matches the selector [SELECTOR].
Syntax:
 DOM QUERY [DATATYPE] [ELEMENT] [DATATYPE] [SELECTOR]
Returns: object
====== DOM QUERYALL ======
Returns a NodeList that contains all of [ELEMENT]'s children that match the selector [SELECTOR].
Syntax:
 DOM QUERYALL [DATATYPE] [ELEMENT] [DATATYPE] [SELECTOR]
Returns: NodeList
====== DOM APPEND ======
Append [ELEMENT] as a child of [PARENT].
Syntax:
 DOM APPEND [DATATYPE] [PARENT] [DATATYPE] [ELEMENT]
Returns: none
====== DOM CLONE ======
Create a clone of [ELEMENT].
Syntax:
 DOM CLONE [DATATYPE] [ELEMENT]
Returns: object
==== PROPERTY ====
Since the migration of most instructions from native JS to WTFCode modules, property provides property management functions.
Importing:
 INCLUDE LOCAL/PROPERTY
or
 IMPORT LOCAL/PROPERTY
===== Instructions =====
====== PROPERTY GET ======
Returns the value of [OBJECT]'s [NAME] property.
Syntax:
 PROPERTY GET [DATATYPE] [OBJECT] [DATATYPE] [NAME]
Returns: none
====== PROPERTY SET ======
Sets the value of [OBJECT]'s [NAME] property to [VALUE]. Equivalent of [OBJECT].[NAME] = [VALUE].
Syntax:
 PROPERTY SET [DATATYPE] [OBJECT] [DATATYPE] [NAME] [DATATYPE] [VALUE]
Returns: any
==== ARRAY ====
Since the migration of most instructions from native JS to WTFCode modules, array provides array management functions.
Importing:
 INCLUDE LOCAL/ARRAY
or
 IMPORT LOCAL/ARRAY
===== Instructions =====
====== ARRAY GET ======
Returns the value of [ARRAY]'s index [INDEX] entry.
Syntax:
 ARRAY GET [DATATYPE] [ARRAY] [DATATYPE] [INDEX]
Returns: any
====== ARRAY SET ======
Sets the value of [ARRAY]'s index [INDEX] entry to [VALUE].
Syntax:
 ARRAY GET [DATATYPE] [ARRAY] [DATATYPE] [INDEX] [DATATYPE] [VALUE]
Returns: any
====== ARRAY CREATE ======
Creates a new, empty array.
Syntax:
 ARRAY CREATE
Returns: array
====== ARRAY LENGTH ======
Returns the length of [ARRAY].
Syntax:
 ARRAY LENGTH [DATATYPE] [ARRAY]
Returns: number
==== OSTREAM ====
Since the migration of most instructions from native JS to WTFCode modules, ostream provides string output capabilities.
Importing:
 INCLUDE LOCAL/OSTREAM
or
 IMPORT LOCAL/OSTREAM
===== Instructions =====
====== SHOW ======
Prints the [STRING](s) to the console, with log level [LOGLEVEL].
Syntax:
 SHOW [LOGLEVEL] [DATATYPE] [STRING] [DATATYPE] [STRING] ...
Returns: none
==== EXCEPTION ====
Since the migration of most instructions from native JS to WTFCode modules, exception provides an error gun.
Importing:
 INCLUDE LOCAL/EXCEPTION
or
 IMPORT LOCAL/EXCEPTION
===== Instructions =====
====== THROW ======
Throws an exception, with text [ERROR].
Syntax:
 THROW [DATATYPE] [ERROR]
Returns: none
==== NOP ====
Since the migration of most instructions from native JS to WTFCode modules, nop provides nothing.
Importing:
 INCLUDE LOCAL/NOP
or
 IMPORT LOCAL/NOP
===== Instructions =====
====== NOP ======
Does nothing.
Syntax:
 NOP
Returns: none
== Examples ==
=== Hello World ===
 include local/ostream
 show log string "Hello, World!"
=== 99 Bottles of Beer ===
 include local/comparison
 include local/math
 include local/string
 include local/ostream
 
 var set number beer 99
 while [great returnvalue (var get beer) number 0]
 if [great returnvalue (var get beer) number 2]
 var set returnvalue prefix (concat returnvalue (var get beer) string " bottles of beer on the wall, " returnvalue (var get beer) string " bottles of beer.")
 var set returnvalue suffix (concat returnvalue (sub returnvalue (var get beer) number 1) string " bottles of beer on the wall.")
 escape
 if [eq returnvalue (var get beer) number 2]
 var set string prefix "2 bottles of beer on the wall, 2 bottles of beer."
 var set string suffix "1 bottle of beer on the wall."
 escape
 if [eq returnvalue (var get beer) number 1]
 var set string prefix "1 bottle of beer on the wall, 1 bottle of beer."
 var set string suffix "no more beer on the wall!"
 escape
 show log returnvalue (concat returnvalue (var get prefix) string " Take one down, pass it around, " returnvalue (var get suffix))
 var set returnvalue beer (sub returnvalue (var get beer) number 1)
 escape
=== Username Generator ===
 include local/random
 include local/comparison
 include local/string
 
 var set returnvalue iadjective (random number 1 number 5)
 var set returnvalue inoun (random number 1 number 5)
 if [eq returnvalue (var get iadjective) number 1]
 var set string adjective "Optimistic"
 escape
 if [eq returnvalue (var get iadjective) number 2]
 var set string adjective "Amazing"
 escape
 if [eq returnvalue (var get iadjective) number 3]
 var set string adjective "Tactical"
 escape
 if [eq returnvalue (var get iadjective) number 4]
 var set string adjective "Generous"
 escape
 if [eq returnvalue (var get iadjective) number 5]
 var set string adjective "Interesting"
 escape
 if [eq returnvalue (var get inoun) number 1]
 var set string noun "Potato"
 escape
 if [eq returnvalue (var get inoun) number 2]
 var set string noun "Fisher"
 escape
 if [eq returnvalue (var get inoun) number 3]
 var set string noun "Kitten"
 escape
 if [eq returnvalue (var get inoun) number 4]
 var set string noun "Debugger"
 escape
 if [eq returnvalue (var get inoun) number 5]
 var set string noun "Player"
 escape
 return returnvalue (concat returnvalue (var get adjective) returnvalue (var get noun))
=== Polish Cheetos ===
 include local/dialogs
 include local/math
 include local/comparison
 include local/string
 include local/exception
 
 alert string "You ran out of cheetos! Let's buy some!"
 var set returnvalue price (prompt string "How much is a bag of cheetos (polish złoty)? the price probably rised since last time" string "22")
 var set returnvalue budget (prompt string "How much polish złoty do you have?" string "66")
 var set returnvalue cheetos (prompt string "how much cheeto u want?" string "3")
 var set returnvalue dif (sub returnvalue (var get budget) returnvalue (mult returnvalue (var get cheetos) returnvalue (var get price)))
 
 if [greateq returnvalue (var get dif) number 0]
 	alert returnvalue (concat string "you bought " returnvalue (var get cheetos) string " cheetos. yay! You have " returnvalue (var get dif) string " polish złoty left.")
 	return string "what a success"
 escape
 
 alert string "you dont have enough polish złoty go work you poor idiot"
 throw string "User too poor."
=== Quine ===
 include local/string
 var set returnvalue input (jseval `return returnvalue (concat returnvalue (jseval "include local/string" + String.fromCharCode(10) + "var set returnvalue input ") returnvalue (jseval String.fromCharCode(40)) string "jseval " returnvalue (jseval String.fromCharCode(96)) returnvalue (var get input) returnvalue (jseval String.fromCharCode(96)) returnvalue (jseval String.fromCharCode(41)) returnvalue (jseval String.fromCharCode(10)) returnvalue (var get input))`)
 return returnvalue (concat returnvalue (jseval "include local/string" + String.fromCharCode(10) + "var set returnvalue input ") returnvalue (jseval String.fromCharCode(40)) string "jseval " returnvalue (jseval String.fromCharCode(96)) returnvalue (var get input) returnvalue (jseval String.fromCharCode(96)) returnvalue (jseval String.fromCharCode(41)) returnvalue (jseval String.fromCharCode(10)) returnvalue (var get input))
== Interpreter ==
The WTFCode interpreter allows you to use WTFCode anywhere in your HTML document, if you wanted to, for some reason...
Simply follow the instructions on the GitHub page for loading it, then you can put WTFCode in script tags like any other code. Like this:
 <script type="text/wtfcode">
 include local/ostream
 show log string "Hello, World!"
 </script>
Category:Languages
Category:2023
Category:Implemented
Category:High-level