A Cubically interpreter written in Lua.
Import cubically.lua, tables.lua, and cube.lua into your project, then run this line of code:
require("cubically")Cubically will be defined in the global table. Using the interpreter is easy:
local interpreter = Cubically.new([options]) -- Create a new instance of the interpreter
interpreter:exec(program) -- Execute a program on the interpreterThe interpreter's state is preserved between calls, so you can run programs in sections:
-- Initialize the interpreter
local interpreter = Cubically.new({experimental = true})
-- Execute the program
interpreter:exec(program)
-- Show debugging information. Experimental mode must be activated for the debug info command used below.
print("===========")
print("Final state")
print("===========")
interpreter:exec("#") -- You can put any program here. This is an experimental command to show debugging info.Options:
size- The size of the cube (default is3for 3x3)experimental- Enables functionality that is not in the official spec.#- Print debugging information._- Moduluss- Bitwise right shift, or left if given a negative number"- Bitwise AND|- Bitwise OR`- Bitwise XORn- Set the notepad to-arg, or-notepadif no argument is specified- Conditionals
- This only applies if the experimental flag is set. For non-experimental conditionals, please refer to the official language specification.
{...}- Explicit code block?- Executes next command/block only if any argument evaluates to true or if there are no arguments. Also creates a block containing this command and the next command/block.!- Executes next command/block only if code was just skipped due to a condition failing. If arguments are supplied and none of them evaluate to truthy, the next command/block will be skipped.- Examples
- Print notepad only if notepad is truthy:
?6%6 - Execute code only if notepad is truthy or input is truthy, otherwise execute different code:
?67{...}!{...} - Execute code only if notepad is truthy and input is truthy, otherwise execute different code if side 0 is truthy:
?6?7{...}!0{...} - Execute code only if notepad is truthy, otherwise execute different code if input is truthy and side 0 is truthy, otherwise execute different code:
?6{...}!7?0{...}!{...}
- Print notepad only if notepad is truthy:
- Notes
?{...}!{...}will execute the first code block, but not the second.!{...}by itself will not execute the code block, regardless of the arguments supplied to!(if any).{...}by itself will execute the code block.?6!{...}is equivalent to?6{}!{...}. If notepad is truthy, then!{...}is evaluated and the block is skipped, but if notepad is falsy, then{...}is evaluated and the block is executed.!?6{...}is equivalent to!6{...}.
- Notes on code blocks
{%6%7:7}is a code block?6&is a code block+510is a code block- The code blocks in
+41?6{-3%7}!{-4%6}(%6-1)6are:+41?6{-3%7}?6{-3%7}-3%7
!{-4%6}-4%6
(%6-1)6