This page is still being worked on!
RoundAbout is a two-dimensional esoteric programming language. Code is placed on a two-dimensional grid, called Map.
Language overview
A RoundAbout program consists of a size definition and the actual program code inside. Each cell in the map consists of a single UTF-8 character.
The program code is then executed by looking at the current symbol below the cursor, and then executing an instruction based on the selected mode. Any empty spaces should be considered a space (U+0020). At the start of execution the cursor is positioned on the top-left corner (at 0,0) and the direction is set to right. The following example is a CAT program
//21,2
$?; =+1; &^; @v; $-+;
~
Instructions
Due to the fact that RoundAbout has multiple execution modes, each symbol can have different meanings in different contexts.
Contextless
These instructions can be used regardless of mode
Cmd
|
Name
|
Condition
|
Description
|
~
|
Halt
|
None
|
Halts the program execution
|
;
|
Reset
|
None
|
Sets the mode to Traversal
|
Traversal
Cmd
|
Name
|
Condition
|
Description
|
@
|
Set-conditionaltraversal
|
None
|
Sets the mode to Conditional Traversal
|
?
|
Set-compare
|
None
|
Sets the mode to Comparison
|
&
|
Set-flags
|
None
|
Sets the mode to Comparison
|
%
|
Set-operation
|
None
|
Sets the mode to Operation
|
=
|
Set-stack
|
None
|
Sets the mode to Stack
|
[
|
Set-heap
|
None
|
Sets the mode to Heap
|
$
|
Set-io
|
None
|
Sets the nice to IO
|
#
|
Set-map
|
None
|
Sets the mode to Map
|
>
|
Flow-right
|
None
|
Sets the direction to right
|
<
|
Flow-left
|
None
|
Sets the direction to left
|
v
|
Flow-down
|
None
|
Sets the direction to down
|
^
|
Flow-up
|
None
|
Sets the direction to up
|
/
|
Flow-fsreflect (forward slash reflect)
|
None
|
When direction is up or right, set direction to right-up. When direction is down or left, set direction to left-down. When direction is right-down, set direction to left-up. When direction is left-up, set direction to right-down. Otherwise preserve direction
|
\
|
Flow-bsreflect (back slash reflect)
|
None
|
When direction is up or left, set direction to left-up. When direction is down or right, set direction to right-down. When direction is left-down, set direction to right-up. When direction is right-up, set direction to left-down. Otherwise preserve direction
|
|
|
Flow-vreflect (vertical reflect)
|
None
|
When direction is right, set direction to left. When direction is left, set direction to right. When direction is right-down or left-down, set direction to down. When direction is right-up or left-up, set direction to up. Otherwise preserve direction
|
-
|
Flow-hreflect (horizontal reflect)
|
None
|
When direction is down, set direction to up. When direction is up, set direction to down. When direction is right-down or right-up, set direction to down. When direction is left-down or left-up, set to left. Otherwise preserve direction
|
+
|
Flow-preflect (plus reflect)
|
None
|
Set direction randomly to either right, left, up, or down
|
x
|
Flow-xreflect (cross reflect)
|
None
|
Set direction randomly to either right-down, right-up, left-down, left-up
|
*
|
Flow-sreflect (star reflect)
|
None
|
Set direction randomly to either right, right-down, right-up, left, left-down, left-up, down, or up
|
Conditional traversal
This is an extension to the basic traversal mode where any instructions are only executed if ResultFlag is set to true.
Comparison
This mode is used to compare values on the stack, therefore to execute such an instruction the stack has to have at least two values.
Cmd
|
Name
|
Condition
|
Description
|
>
|
Compare-greaterthan
|
At least two values on the stack
|
Compares the two top most values (a, b) on the stack using b > a and sets ResultFlag to the result
|
<
|
Compare-lessthan
|
At least two values on the stack
|
Compares the two top most values (a, b) on the stack using b < a and sets ResultFlag to the result
|
=
|
Compare-equal
|
At least two values on the stack
|
Compares the two top most values (a, b) on the stack using b == a and sets ResultFlag to the result
|
!
|
Compare-notequal
|
At least two values on the stack
|
Compares the two top most values (a, b) on the stack using b != a and sets ResultFlag to the result
|
Flags
This mode is used to track results of certain instructions. The flags values are stored in a binary number that is arbitrarily large. Right now only six bits are used, but sixteen bits are reserved for runtime usage. This means when using custom you should either use bit 0 or use values above 65535 (2^16 - 1)
Reserved Bits Table
|
Name
|
Description
|
Bit 0
|
ResultFlag
|
This is a general flag that represent whether some action succeeded or not
|
Bit 1
|
ComplexRoot
|
Set when taking a root results in a complex value
|
Bit 2
|
DivisionByZero
|
Set when any division/modulo by zero is performed. Currently there are 3 scenarios: Division, Modulo, and 0th Root
|
Bit 3
|
ResultTruncated
|
Set when division had a remainder
|
Bit 4
|
ReadNoDigits
|
Set when Stack-read read no digits
|
Bit 5
|
InvalidValue
|
Set when an invalid was passed to an instruction
|
Bit 6
|
Utf8Error
|
Set when encoding/decoing values using UTF-8 codec failed
|
Bit 7
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 8
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 9
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 10
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 11
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 12
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 13
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 14
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Bit 15
|
Reserved Bit
|
This is a reserved bit, but as of now has yet no functionality
|
Instructions
Cmd
|
Name
|
Condition
|
Description
|
|
|
Flags-true
|
At least one value on the stack
|
Reads a number, if non-negative then performs flags = flags | value . If read number is negative, set InvalidValue flag to TRUE
|
&
|
Flags-false
|
At least one value on the stack
|
Reads a number, if non-negative then performs flags = flags & ~value . If read number is negative, set InvalidValue flag to TRUE
|
^
|
Flags-invert
|
At least one value on the stack
|
Reads a number, if non-negative then performs flags = flags ^ value . If read number is negative, set InvalidValue flag to TRUE
|
>
|
Flags-push
|
None
|
Pushes the Flags' value onto the stack
|
?
|
Flags-push
|
At least one value on the stack
|
Pops a value off the stack, if non-negative then performs (flags & value) == value and saves the result to ResultFlag. If value is negative, set InvalidValue flag to TRUE
|
Operation
This mode is used for operating with values on the stack.
Cmd
|
Name
|
Condition
|
Description
|
+
|
Operation-add
|
At least two values on the stack
|
Pops two values of the stack and adds them together using b + a
|
-
|
Operation-sub
|
At least two values on the stack
|
Pops two values of the stack and subtracts them from each other and pushes the result onto the stack using b - a
|
*
|
Operation-mul
|
At least two values on the stack
|
Pops two values of the stack and multiplies them together and pushes the result onto the stack using b * a
|
/
|
Operation-div
|
At least two values on the stack
|
Pops two values of the stack and performs integer division and pushes the result onto the stack using b / a
|
^
|
Operation-pow
|
At least two values on the stack
|
Pops two values of the stack and calculates the power and pushes it onto the stack using b ^ a
|
\
|
Operation-root
|
At least two values on the stack
|
Pops two values of the stack and calculate the nth root and push the truncated result onto the stack using b√a
|
%
|
Operation-mod
|
At least two values on the stack
|
Pops two values of the stack and performs integer division and pushes the remainder onto the stack them using b % a
|
|
|
Operation-or
|
At least two values on the stack
|
a
|
&
|
Operation-and
|
At least two values on the stack
|
Pops two values of the stack and performs bitwise AND and pushes the result onto the stack them using b & a
|
v
|
Operation-xor
|
At least two values on the stack
|
Pops two values of the stack and performs bitwise XOR and pushes the result onto the stack them using b ^ a
|
>
|
Operation-rshift
|
At least two values on the stack
|
Pops two values of the stack and performs bitwise right shift and pushes the result onto the stack them using b >> a
|
<
|
Operation-lshift
|
At least two values on the stack
|
Pops two values of the stack and performs bitwise left shift and pushes the result onto the stack them using b << a
|
!
|
Operation-invert
|
At least one value on the stack
|
Applies bitwise inversion to the topmost item on the stack
|
Stack
Cmd
|
Name
|
Condition
|
Description
|
+
|
Stack-push
|
None
|
Read digits until a non-digit character is encountered and push read value onto the stack. If no digits were read, push 0
|
-
|
Stack-pop
|
At least one value on the stack
|
Pops a value off the stack
|
*
|
Stack-swap
|
At least two values on the stack
|
Swaps the two topmost values on the stack
|
>
|
Stack-save
|
At least one value on the stack
|
Pop a value off the stack and set it to the current cell in the heap
|
<
|
Stack-load
|
None
|
Push a value equal to the current cell in the heap
|
?
|
Stack-any
|
None
|
Set ResultFlag to true if stack is not empty, otherwise set to false
|
:
|
Stack-dupe
|
At least one value on the stack
|
Duplicates the top value on the stack
|
&
|
Stack-clear
|
None
|
Clears the stack
|
Heap
Cmd
|
Name
|
Condition
|
Description
|
>
|
Heap-rshift
|
None
|
Moves cell pointer right
|
<
|
Heap-lshift
|
None
|
Moves cell pointer left
|
#
|
Heap-jump
|
At least one value on the stack
|
Pops a value off the stack and moves pointer to such place
|
*
|
Heap-home
|
None
|
Move cell pointer to 0
|
+
|
Heap-increment
|
None
|
Increment value in current cell by one
|
-
|
Heap-decrement
|
None
|
Decrement value in current cell by one
|
0
|
Heap-null
|
None
|
Set value in current cell to 0
|
&
|
Heap-clear
|
None
|
Set all cells to 0
|
IO
Cmd
|
Name
|
Condition
|
Description
|
+
|
IO-write
|
At least one value on the stack
|
Pop a value off the stack and write it to STDOUT using UTF-8 encoding
|
-
|
IO-read
|
None
|
Read a UTF-8 character from STDIN and push it's value onto the stack. If no character is read, push -1
|
?
|
IO-any
|
None
|
If a character can be read from STDIN set ResultFlag to true, otherwise set to false
|
Map
Cmd
|
Name
|
Condition
|
Description
|
+
|
Map-read
|
None
|
Advance cursor, read a UTF-8 character from the map at current location and push it's value onto stack
|
-
|
Map-write
|
At least one value on the stack
|
Advance cursor, pop a value off the stack, convert it to a UTF-8 character and set write it to the current location on the map
|
*
|
Map-null
|
None
|
Advance cursor, set the character at current location to a space (U+0020)
|
#
|
Map-jump
|
At least two values on the stack
|
Pop two values off the stack (y, x) and then set cursor location to (x, y). If out-of-bound, wrap around
|
>
|
Map-wincrement (width increment)
|
None
|
Increase the map's width by one
|
<
|
Map-wdecrement (width decrement)
|
Map width greater than 1
|
Decrease the map's width by one
|
v
|
Map-hincrement (height increment)
|
None
|
Increase the map's height by one
|
^
|
Map-hdecrement (height decrement)
|
Map height greater than 1
|
Decrease the map's height by one
|
W
|
Map-readwidth
|
None
|
Push a value onto the stack equal to the map's width
|
H
|
Map-readheight
|
None
|
Push a value onto the stack equal to the map's height
|
X
|
Map-readx
|
None
|
Push a value onto the stack equal to the cursor's X coordinate
|
Y
|
Map-ready
|
None
|
Push a value onto the stack equal to the cursor's Y coordinate
|