Omicron is an esoteric (Turing-complete?) interpreted programming language written in Python.
Compiled to a standalone executable with Nuitka.
Download omicron.exe
. To run a program, open a command line and navigate into the directory containing the interpreter, and run omicron.exe <file>
, where <file>
is path to your .omi
program.
Pointer starts at memory cell 0. Negative addresses are valid.
Memory cells store either a number (integer or floating point), or nil
.
nil
can be used in a program to test for an empty cell, erase a cell, etc.
Name | Description |
---|---|
(any number) | Set current memory cell |
!f | Import program from file f and insert it into current program (pre-execution) |
:n | Mark position in program as n |
@n | Get value at memory cell n (can be nested, e.g. @@@n) |
Pointer | |
> | Increment memory pointer |
< | Decrement memory pointer |
>> n | Move memory pointer forward n |
<< n | Move memory pointer back n |
~ n | Move memory pointer to n |
Arithmetic | |
++ | Increment current memory cell |
-- | Decrement current memory cell |
+ n | Add n to current memory cell |
- n | Subtract n from current memory cell |
* n | Multiply current memory cell by n |
/ n | Divide current memory cell by n |
// n | Floor-divide current memory cell by n |
^ n | Raise current memory cell to the nth power |
% n | Divide current memory cell by n and set to the remainder |
\ n | Set current memory cell to its nth root |
log n | Set current memory cell to its base-n logarithm |
round | Round current memory cell |
ceil | Round up current memory cell |
floor | Round down current memory cell |
sin | Set current memory cell to its sine |
cos | Set current memory cell to its cosine |
tan | et current memory cell to its tangent |
abs | Set current memory cell to its absolute value |
fact n | Set current memory cell to n factorial |
rand n1 n2 | Set current memory cell to random number between n1 and n2 (inclusive) |
pi | Set current memory cell to pi |
e | Set current memory cell to e |
Comparison | |
eq n | Set current memory cell to 1 if it is equal to n, else 0 |
gt n | Set current memory cell to 1 if it is greater than n, else 0 |
gte n | Set current memory cell to 1 if it is greater then or equal to n, else 0 |
lt n | Set current memory cell to 1 if it is less than n, else 0 |
lte n | Set current memory cell to 1 if it is lesser then or equal to n, else 0 |
not | Set current memory cell to 1 if it is 0, else 0 |
and n | Set current memory cell to 1 if (current memory cell && n), else 0 |
or n | Set current memory cell to 1 if (current memory cell || n), else 0 |
xor n | Set current memory cell to 1 if (current memory cell ^ n), else 0 |
Flow | |
goto n | Goto marker n |
qoto q n1 n2 | Goto marker n1 if current memory cell is equal to q, otherwise goto marker n2 |
wait | Pause program until Enter is pressed. |
stop | End program |
I/O | |
input | Accept an integer value (0 if none given) and sets current memory cell |
inputc | Accept a single character (first if more than one given) and sets current memory cell to ASCII value |
read f n | Read nth byte (zero-based) from file f and set current memory cell |
size f | Set current memory cell to size of file f (bytes) |
Print current memory cell | |
printc | Print ASCII character of current memory cell |
write f | Write ASCII char of current memory cell to file f (truncates file) |
awrite f | Append ASCII char of current memory cell to file f |
writeb f | Write current memory cell to file f (binary) (truncates file) |
awriteb f | Append current memory cell to file f (binary) |
mem | Prints the memory tape |
72 printc 101 printc 108 printc printc 111 printc 44 printc 32 printc 87 printc 111 printc 114 printc 108 printc 100 printc 33 printc
inputc printc
input qoto 0 2 1 :1 print goto 1 :2
input ^ 2 > input ^ 2 + @0 \ 2 print
input - 2 > 1 print > 1 print > :1 @1 + @2 print << 2 @2 > @3 ~ 0 -- qoto 0 3 2 :2 ~ 3 goto 1 :3 wait
Alternative; only final output
input - 2 > 1 > 1 > :1 @1 + @2 << 2 @2 > @3 ~ 0 -- qoto 0 3 2 :2 ~ 3 goto 1 :3 ~ 3 print wait
:1 qoto nil 11 2 :11 < goto 4 :2 qoto 0 22 3 :22 > goto 1 :3 qoto 1 22 4 :4 qoto nil 44 5 :44 1 mem goto 1 :5 qoto 0 55 6 :55 1 mem goto 1 :6 0 < goto 4