Curlyfrick
Curlyfrick is an esolang that was designed after seeing how the popular graphing program Desmos evaluates {}
as the literal number 1
. Using these brackets, any number can be formed, which was the main inspiration.
Syntax
Each line has two parts: the op code and the data. The op code determines which command is to be performed on the data.
Opcodes are provided in a sort of binary way, with .
representing 0 and {}
representing 1. For example:
{}.{}{}
represents 1011
, which is opcode 11.
Here is a list of opcodes, and their bracket representation
Opcode | Function | Brackets |
---|---|---|
1 | Print value | ...{}
|
2 | Print variable at variable pointer | ..{}.
|
3 | Store value in variable | ..{}{}
|
4 | Increment variable pointer | .{}..
|
5 | Decrement variable pointer | .{}.{}
|
6 | Input to a variable | .{}{}.
|
7 | Start an if condition | .{}{}{}
|
8 | Start a while loop | {}...
|
9 | Comment | {}..{}
|
10 | End statement | {}.{}.
|
11 | Increment variable | {}.{}{}
|
12 | Decrement variable | {}{}..
|
13 | Print value as char | {}{}.{}
|
14 | Print variable as char | {}{}{}.
|
15 | Zero the value of a var | {}{}{}{}
|
- If statements test to see if the value of the variable pointer is zero, and if it is, skip to the next END (
{}.{}.
). - While statements are similar, but constantly check the value of the variable at the variable pointer
The opcodes ..{}.
, ..{}.
, .{}{}{}
, {}...
and {}.{}.
still need data, but it doesn’t have any impact on the execution of the program (i.e. data given to these opcodes acts as a comment).
Also, the opcode and data are separated by a tab (\t
)
Examples of Opcodes
{} {} Print the value 5 {} {}+{}+{}+{}+{} {} {} Store the value 8 in the variable 0 {}{} ({}+{})^({}+{}+{}) {} {} Increment variable 0 by 27 {} {}{} ({}+{}+{})^({}+{}+{}) {} {} Increment the variable pointer {} {} {} {} Print value in variable 1 {} {} {} {} Decrement the variable pointer {}{} {} {} {} Print the value in variable 1 as a character {}{}{} {}
Valid mathematical operations are:
+-*/
-> Standard operations^
-> Exponent√
-> Square root
Examples
Truth Machine
.{}{}. {} .{}{}{} {} {}... {} ...{} {} {}.{}. {} ...{} {}-{} {}.{}. {}
Pseudocode-ish representation
INPUT IF VAR_0 ISN'T 1 THEN WHILE VAR_0 IS TRUE PRINT 1 END PRINT 0 END
Hello, World!
{}{}.{} (({}+{}+{}+{})^({}+{}+{}))+(({}+{})^({}+{}+{})) {}{}.{} (((({}+{})^({}+{}+{}))+{}+{})^({}+{}))+{} {}{}.{} (((({}+{})^({}+{}+{}))+{}+{})^({}+{}))+(({}+{})^({}+{}+{})) {}{}.{} (((({}+{})^({}+{}+{}))+{}+{})^({}+{}))+(({}+{})^({}+{}+{})) {}{}.{} (((({}+{})^({}+{}+{}))+{}+{})^({}+{}))+(({}+{})^({}+{}+{}))+{}+{}+{} {}{}.{} (((({}+{})*({}+{}))^({}+{}))*({}+{}+{}))-({}+{}+{}+{}) {}{}.{} (({}+{})^({}+{}+{}))*({}+{}+{}+{}) {}{}.{} ({}+{}+{})*((({}+{}+{}+{}+{})^({}+{}))+{}+{}+{}+{}) {}{}.{} (((({}+{})^({}+{}+{}))*({}+{}+{}+{}))+{}+{}+{}+{}+{})*({}+{}+{}) {}{}.{} ((((({}+{})^({}+{}+{}))*({}+{}+{}+{}))+{}+{}+{}+{}+{})*({}+{}+{}))+{}+{}+{} {}{}.{} (((({}+{})^({}+{}+{}))+{}+{})^({}+{}))+(({}+{})^({}+{}+{})) {}{}.{} ((({}+{})^({}+{}+{}))+{}+{})^({}+{}) {}{}.{} ((({}+{})^({}+{}+{}))*({}+{}+{}+{})) + {}
Looping counter
{}.{}{} {} {}... {} {}.{}{} {} {}.{}. {}
Infinite loop
{}.{}{} {} {}... {} {}.{}. {}
Square root of 2
...{} √2)
Feel free to add more examples
Cat program
.{}{}. {} {}... {} {}{}{}. {} .{}{}. {} {}.{}. {}
Computational Class
I’m pretty sure Curlyfrick is Turing complete, as a comparison table between BF and Curlyfrick can be drawn
BF | Curlyfrick |
---|---|
>
|
.{}..
|
<
|
.{}.{}
|
+
|
{}.{}{}
|
-
|
{}{}..
|
.
|
..{}.
|
,
|
.{}{}.
|
[
|
{}...
|
]
|
{}.{}.
|
Some notable things
- When using input (
.{}{}.
), it will try and store the input as an integer if possible, otherwise, it will be stored as a string - The increment and decrement functions will either increment/decrement the value of the variable by the given amount, or it will go through and increment/decrement the ordinal value of each character in a string by the given amount
- The amount of variables to put in the register list can be specified on the command line, but defaults to 30,000
- If the variable pointer reaches a value that is not inside the list of vars, then it will kind of wrap around, but details of this can be found in the interpreter.
- The
√
operator must be closed with a)