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.

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.

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.

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} 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]/
 * 1) {print} ' 2 bottles of beer on the wall,

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.

External resources
Implementation