feels

a useless language for a hopeless world

run your feels

the feels

Feels is a “programming language” that was made during the 2020 pandemic lockdown/election cycle/civil unrest/all-around declining mental health. Its purpose is not to be a useful language, but to be a cathartic one. Write a program while you scream into the void!

It is heavily inspired by (and is a superset of) brainf*ck, but with different tokens and a few extra operations. A program is just a string of operations, which runs in a primitive turing machine. There are operations for moving the read/write pointer, manipulating the pointed value, generating randoms, and printing output (i.e. there is no input; only destiny and chaos).

Each memory location in the turing machine is a number. Feels wants it to be a limitless number, but unfortunately, life is full of limits. In this implementation, each memory location is a JavaScript number, whatever that means. Because the interpreter is implemented in JavaScript. So that it can run in your browser. Every browser cycle it steals from The Rest Of The Internet is probably for the best.

Play with it above, if you want.

A listing of instructions:

InstructionDescription
G Increment the data pointer (move right on the data tape).
g Decrement the data pointer (move left on the data tape).
U Set the data pointer to 0 (reset the data tape position). Go over your data again and again; it won't change.
A Increment the value at the data pointer. As if that will accomplish anything.
a Decrement the value at the data pointer. Like time decrements your life.
W XOR the value in the cell to the left with the value at the data pointer and store at the current location. Sheesh.
w XOR the value in the cell to the right with the value at the data pointer and store at the current location. Why bother?
H Logical shift the value at the data pointer 1 bit to the left. Accomplish nothing.
h Logical shift the value at the data pointer 1 bit to the right. Accomplish less than nothing.
R If the value at the data pointer is zero, jump forward to the instruction after the matching r. One little clock cycle, and it's ten years later.
r If the value at the data pointer is not zero, jump backward to the instruction after the matching R. Yes, you can move the program counter backward, unlike time's arrow.
F or 🤬 (U+1F92C) Store the value from the tape to the register. Yeah there's a register now 🤬!
f or 😕 (U+1F615) Load the value from the register to the tape. It never ends. Until it does.
😫 (U+1F62B, or any other emoji between U+1F600 and U+1FAD6, besides the special ones mentioned)
Output the value at the data pointer as Unicode codepoint character. 2020 is the worst.
😢 (U+1F622) Output the contents of memory starting at the data pointer and treating it as a zero-terminated string of Unicode codepoints. If you like to save your I/O for the end of the world, this is for you. Watch the end of the world while you shed a single tear.
😖 (U+1F616) Output a linefeed \n. Ugh. Come on with this.
😭 (U+1F62D) Set the value at the data pointer to a random 32-bit number. You won't get the one you wanted.
😡 (U+1F621) Set the value at the data pointer to zero. What are we even doing?
😱 (U+1F631) Collapse the value at the data pointer to the unicode BMP codepoint range, by computing XOR of the lower 16 bits with the upper 16 bits, and overwriting the value with this 16-bit value (0x0000 – 0xFFFF inclusive). Just as pointless as everything else, but here we are.
😤 (U+1F624) Ignore the rest of the line. The only useful thing to do.

Whitespace (spaces, tabs, CR, LF) are ignored. U+1F3FB through U+1F3FF (EMOJI MODIFIER FITZPATRICK TYPEs) are ignored. Exclamation marks are ignored!!! So use them freely!!!!!!

The source is here. Sadly, it's not written in feels. 😫