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.
==External resources==
Implementation
Category:2012
Category:Languages
Category:Cell-based
Category:Turing complete
Category:Implemented