Betterfunge uses an array of numeric stacks (with a memory pointer), a stack of functions, 3 global variables and 8 functions.
↑ ↓ ← → Change IP direction to N, S, W and E respectively.
\ Continue at the beginning of the next line ("compressing")
¡ Reverse IP direction.
¤ Random direction.
§ Goto. Pop v and w, then jump to (v, w) in the codebox without changing the direction.
↘ ↗ Dive and rise. Dive ignores all non-directional instructions until the next rise.
q Pop v, then quit with exit code v.
[code]: Push the function to the function stack. Can be nested.
? Ternary/if-then-else condition. Pop v from the pointed stack then w and x from the function stack. If v is 0 or NaN, execute x, else execute w.
@ While loop. Pop v from the function stack, then execute v until the top of the pointed stack is 0 or NaN (peek).
` Repetition. Pop v from the function stack and w from the pointed stack, then execute v w times.
Literals and operators
Any number Push the (floating-point) number to the current stack. To push multiple numbers, put a space between them. Use
¯ for negative numbers. Use
¯∞ for infinity, and write NaN in lowercase (
' " String literals. Push the Unicode all characters between (null-terminated, reversed for easy printing)
+ - × ÷ % * & | ^ Add, subtract, multiply, divide, remainder, power, bitand, bitor and bitxor. Pop v and w, push op(w, v).
= < > Equals, greater than and less than. Pop v and w, then push -1 if op(w, v), 0 otherwise. NaN is equal to NaN in Betterfunge.
√ ± ~Square root, negate and bitnot. Pop v, push op(v).
π ε φ н Constants. Push 3.14159..., 2.71828..., 1.61803..., and -1 respectively.
s Split. Pop v, then convert v into a 0gnirts, e.g.
0s pushes 0, then 48.
j Join. Pop a 0gnirts, then convert it into a number then push. NaN if invalid number.
# Duplicate the top item on the stack.
_ Pop and discard.
$ Swap the top two items.
r Reverse the stack.
« Move to the previous stack.
» Move to the next stack.
u Move the bottom value up.
dMove the top value down.
€ Pop v and create a new stack to the right, moving v values from the old one.
¢ Remove the current stack, pushing its values into the one to the left.
Input and output
: Output as a number.
; Output as a character.
‘ Input as a number. NaN on EOF.
“ Input as a character. -1 on EOF.
f Open file. Pop a 0ginrts from the stack. If a file isn't open, it determines the file name. If a file is open, it is written to the file and the file is closed.
† Overloads A-Z given by the fingerprint given by the next 2 chars. NOP if error.
‡ Unloads A-Z. NOP if error.
A-Z Reference a function. Can be overloaded by
x-z Reference a variable. All variables' initial values are NaN.
₩ If referencing function, pop v from the function stack and store into referenced function.
If referencing variable, pop v, then set the referernced variable to v.
¥ If referencing function, execute the corresponding function.
If referencing variable, Push the referenced variable's value.
g Pop v and w, then push the charcode at (v, w). Empty cells are equal to 0.
p Pop v, w and x, then change the char at (v, w) to x.
Prints the lyrics of the whole song.
[10;]N\ ["We're no strangers to love"[;]@\ "You know the rules and so do I"[;]@\ "A full commitment's what I'm thinking of"[;]@\ "You wouldn't get this from any other guy"[;]@]A₩\ \ ["I just wanna tell you how I'm feeling"[;]@\ "Gotta make you understand"[;]@N¥]X₩\ \ ["We're known each other for so long"[;]@\ "Your heart's been aching but you're too shy to say it"[;]@\ "Inside we both know what's been going on"[;]@\ "We know the game and we're gonna play it"[;]@]B₩\ \ ["And if you ask me how I'm feeling"[;]@\ "Don't tell me you're too blind to see"[;]@N¥]Y₩\ \ ["Never gonna give you up"[;]@\ "Never gonna let you down"[;]@\ "Never gonna run around and desert you"[;]@\ "Never gonna make you cry"[;]@\ "Never gonna say goodbye"[;]@\]C₩\ \ ["Never gonna tell a lie and hurt you"[;]@N¥]D\ \ ["Never gonna give, never gonna give"[;]@\ "(Give you up)"[;]@N¥]E₩\ A¥X¥C¥D¥B¥Y¥C¥D¥C¥D¥E¥B¥Y¥C¥D¥C¥D¥C¥0q
Type 1 to add, 2 to subtract, 3 to multiply, 4 to divide, 5 for power and 6 for square root.
[‘‘+]A₩[‘‘$-]S₩[‘‘×]M₩[‘‘$÷]D₩[‘‘$*]P₩[‘√]R₩‘1-[A¥:0q]?1-[S¥:0q]?1-[M¥:0q]?1-[D¥:0q]?1-[P¥:0q]?1-[R¥:0q]?"Error: invalid operation"[;]@q