Inline
Inline is an esoteric programming language created by User:OberoN.
Description
Every value is 8-bit long and has a suffix: :b for binaries, :h for hexadecimal, :d for decimal and :a for ASCIIs.
:r and :m for indexed addressing is also possible, like [0:h:r] is the address pointed by register 0 and [0:h:m] is the address pointed by memory cell 0. You can write [0-1:h:r] which is the address pointed by 0 and 1 registers, treating 0 as high part and 1 as low, and also [0-1-2:h:r] and such. Suffixes can be nested like :h:r:m:r.
In Inline immediate values are closed in parentheses. Memory indexing is also possible in the same manner as values, but in square brackets: the memory is virtually infinite. Labels are ASCII strings consisting of alnum chars and underscores.
All other numbers are treated as registers.
Every line is treated as a subroutine/labeled code. Execution starts from line 0 and continues to the other lines until the // instruction is reached; if the program does end without a // instruction, an exception is raised. Obviously, if a line hasn't a label (first thing in the line, in {}s) it isn't callable nor jumpable to.
List of commands
IO
- !(s) memory
- Inputs a char in ASCII to the memory. If there is the "s" it inputs a string.
- *(s) position
- Outputs a char in ASCII from the position (register or memory). If there is the "s" the position must be memory and it outputs a C-string.
- " position
- Outputs a number from the position (register or memory).
Memory
- register > memory
- Transfers the register into the memory.
- register < memory
- Transfers the memory into the register.
- register <> memory
- Exchanges register and memory.
Jumps and calls
- @ label
- Unconditionally jumps to the line labeled.
- ? register condition _ label1 (_ label2)
- Conditioned jump: if the register is in the condition specified (so like (>5:d) will be "bigger than decimal 5" and possible are >,<,=,!,>=,<= and in this case :r defines a real register, not memory which is defined by :m) , jump to label1; else, to label2 (if any). Labels can be also single instructions in this case.
- //
- Die instruction: terminates the program.
- # label
- Call line labeled.
- /
- Return.
- % label register condition amount
- LOOPs over a label while the register is in the condition specified (see ? instruction) and adds the amount to the register (amount could be a register, an immediate or a memory position).
Assignment
- \ register immediate
- Assigns to the register an immediate value.
- $(s) memory immediate
- Assigns to the memory an immediate value. If there is the "s", the immediate is a string and should terminate with :a suffix.
- . register register
- Copies first register in second.
- , register register
- Exchanges registers.
Arithmetics
- + register
- Increments register.
- - register
- Decrements register.
- ++ register / register / ...
- Adds registers together. The result is stored in the last register.
- -- register / register
- Subtracts registers. The result is stored in the first register.
- ** register / register / ...
- Multiplicates registers together. The result is stored in the last register.
- \ register / register
- Divides registers. Result of division is stored in the first, modulo in the second.
- ^^ register / register
- Power-raises registers. Result is stored in the first register.
- & register / register / ...
- ANDs registers. Result is stored in the last register.
- | register / register / ...
- ORs registers. Result is stored in the last register.
- ^ register / register / ...
- XORs registers. Result is stored in the last register.
- >> register / register
- SHRs registers. Result is stored in the first register.
- << register / register
- SHLs registers. Result is stored in the first register.
- >>> register / register
- ROLs registers. Result is stored in the first register.
- <<< register / register
- RORs registers. Result is stored in the first register.
Comments
- ' comment
- Standard comment. One per line.
- ; comment
- Definition comment. One per line, and can be nested with standard comment (see above).
- ~ label
- Prints definition comment of line labeled.
Examples
Hello world
Hello World can be either
$s[0:h](Hello, World!:a)*s[0:h]//
or
{h}~{h}//;Hello, World!
99 bottles of beer
$[0:h](99:d)$s[1:h]( bottles of beer on the wall,\n:a) $s[20:h](Take one down, pass it around,\n:a) \1:h(2e:h)\2:h(a:h)\3:h(0:h) $s[40:h](No more:a) $s[48:h](Go to the store and buy some more,:a) {b_loop}#{print} ' x bottles of beer on the wall, 1:h<>[11:h]2:h<>[12:h]3:h<>[13:h]#{print} ' x bottles of beer. *s[20:h] ' Take one down and pass it around, 0:h<[0:h]-0:h0:h>[0:h]1:h<>[11:h]2:h<>[12:h]3:h<>[13:h]1:h<>[1d:h]#{print} ' x bottles of beer on the wall. 1:h<>[1d:h]?0:h(!2:h)_{b_loop} #{print} ' 2 bottles of beer on the wall, 1:h<>[11:h]2:h<>[12:h]3:h<>[13:h]#{print} ' 2 bottles of beer. *s[20:h] ' Take one down and pass it around, \5:h(1e:h)4:h<[1f:h] {canc_s}4:h<>[5:h:r]%{canc_s}5:h(=8:h)(ff:h) 0:h<[0:h]-0:h0:h>[0:h]1:h<>[10:h]2:h<>[11:h]3:h<>[12:h]1:h<>[1c:h]#{print} ' 1 bottle of beer on the wall. 1:h<>[1c:h]#{print} '1 bottle of beer on the wall, 1:h<>[10:h]2:h<>[11:h]3:h<>[12<:h](0:h)#{print} ' 1 bottle of beer. *s[20:h] ' Take one down and pass it around, *s[40:h]\5:h(8:h)\4:h(73:h) ' No more {add_s}4:h<>[5:h:r]%{canc_s}5:h(=20:h)(1:h) 1:h<>[11:h]2:h<>[12:h]3:h<>[13:h]1:h<>[1d:h]*s[1:h] ' bottles of beer on the wall. 1:h<>[1d:h]*s[40:h]*s[1:h] ' No more bottles of beer on the wall, 1:h<>[11:h]2:h<>[12:h]3:h<>[13:h]*s[40:h]*s[1:h] ' No more bottles of beer. *s[48] ' Go to the store and buy some more, $[0:h](99:d)1:h<>[11:h]2:h<>[12:h]3:h<>[13:h]1:h<>[1d:h]#{print}// {print}"[0:h]*s[1:h]/
Implementation of brainfuck
'0-1 codeptr '2-3 memptr '4 stackptr '5 instruction scratch '6 loop scratch '0-ff loop start locations 'Fill code into 100, place tape after 0 byte after code \0:h(1:h) \2:h(1:h) !s[1-0:h] {scanmemstart} 5:h<[2-3:h:r] ?5:h(=0:h)_{markstart} +3:h?3h(=0:h)_+2:h @{scanmemstart} {markstart}+3h?3:h(=0:h)+2:h @{read} {next}+1:h?1:h(=0:h)_+0:h {read}5:h<[0-1:h:r] ?5:h(=>:a)_{addp} ?5:h(=<:a)_{subp} ?5:h(=+:a)_{addc} ?5:h(=-:a)_{subc} ?5:h(=]:a)_{looptail} ?5:h(=[:a)_{loophead} ?5:h(=.:a)_{pc} ?5:h(=,:a)_{gc} ?5:h(!0:h)_{next}_// {addp}+3:h?3:h(=0:h)_+2:h@{next} {subp}-3:h?3:h(=ff:h)_-3:h@{next} {addc}5:h<[2-3:h:r]+5:h5:h>[2-3:h:r]@{next} {subc}5:h<[2-3:h:r]-5:h5:h>[2-3:h:r]@{next} {pc}*[2-3:h:r]@{next} {gc}![2-3:h:r]@{next} {loophead} 5:h<[2-3:h:r] ?5:h(=0:h)_{skippasttail} 0:h>[4:h:r] +4:h 1:h>[4:h:r] +4:h @{next} {looptail} 5:h<[2-3:h:r] ?5:h(=0:h)_{skipfromtail} -4:h 1:h<[4:h:r] -4:h 0:h<[4:h:r] +4:h+4:h @{next} {skipfromtail} -4:h @{next} {skippasttail} \6:h(1:h) {skippasttailoop} +1:h?1:h(=0:h)_+0:h 5:h<[0-1:h:r] ?5:h(=]:a)_-6:h_?5:h(=[:a)_+6:h ?6:h(=0:h)_{next}_{skippasttailloop}
This demonstrates that Inline is also Turing-complete.