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