|:: documentation for NILS Form| :@doc string: "Nova In-Language Static Form is a possible structure for lowering Nova code into a bytecode language describable in Nova. This is not intended to be written by hand." |:: match $stack $arity :failed:?| |:: match $stack $symbol| :@jet: " local s = stacks[$stack] local s_top = s.n local tuple = s[s_top] if not tuple or tuple[1] ~= $symbol then push("failed", { }) else pop($stack) push($stack .. " (r)", { $symbol }) end " |:: bind $stack $symbol :failed:?| |:: bind $stack $register| :@jet: " local s = stacks[$stack] local s_top = s.n local r = stacks[$register] local r_top = r.n local s_tuple = s[s_top] local r_tuple = r[r_top] if not s_tuple or r_tuple and s_tuple[1] ~= r_tuple[1] then push("failed", { }) else pop($stack) push($stack .. " (r)", s_tuple) if not r_tuple then push($register, s_tuple) end end " |:: consume $stack :failed:?| :@jet: " local r = pop($stack .. " (r)") if r then push($stack, r) end " |:: consume $stack | :@jet: " pop($stack .. " (r)") " |:: push $stack $symbol :failed:?| |:: push $stack $symbol| :@jet: " push($stack, { $symbol }) " |:: pushvar $stack $reg :failed:?| |:: pushvar $stack $reg| :@jet: " local r_tuple = pop($reg) push($stack, r_tuple) push($reg, r_tuple) " |:: unbind $n| :@jet: " if stacks[$n].n > 0 then pop($n) end " |:: jet @stdio write/1 :failed:?| |:: jet @stdio write/1| :@jet: "io.write(string.char(tonumber(stacks["1"][1][1])))" |:stacks:| :@stdio.arity: :@stdio.1: :@stdio.2: :@stdio.arity (r): :@stdio.1 (r): :@stdio.2 (r): :.arity: :.1: :.2: :.arity (r): :.1 (r): :.2 (r): :message.arity: :message.1: :message.arity (r): :message.1 (r): |:registers:| :1: |:: rule 1 succeeded :failed:| :: rule 2 |:: rule 2 succeeded :failed:| :: rule 3 |:: rule 3 succeeded :failed:| :: rule 4 |:: rule $x succeeded :failed:?| |:: rule $x succeeded| :: rule 1 |:/:| :: print message :message: "Hello, World!" |:: rule 0| :: push .arity 2 :: push .1 print :: push .2 message :: push message.arity 1 :: push message.1 33 :: push message.arity 1 :: push message.1 100 :: push message.arity 1 :: push message.1 108 :: push message.arity 1 :: push message.1 114 :: push message.arity 1 :: push message.1 111 :: push message.arity 1 :: push message.1 87 :: push message.arity 1 :: push message.1 32 :: push message.arity 1 :: push message.1 44 :: push message.arity 1 :: push message.1 111 :: push message.arity 1 :: push message.1 108 :: push message.arity 1 :: push message.1 108 :: push message.arity 1 :: push message.1 101 :: push message.arity 1 :: push message.1 72 :: rule 0 succeeded |:@stdio: write $char| :@jet: "io.write(string.char(tonumber($char)))" |:: rule 1| :: match @stdio.arity 2 :: match @stdio.1 write :: bind @stdio.2 1 :: consume @stdio.arity :: consume @stdio.1 :: consume @stdio.2 :: jet @stdio write/1 :: unbind 1 :: rule 1 succeeded |:: print message? :message: $char| :@stdio: write $char |:: rule 2| :: match .arity 2 :: match .1 print :: match .2 message :: match message.arity 1 :: bind message.1 1 :: consume .arity :: consume .1 :: consume .2 :: consume message.arity :: consume message.1 :: push @stdio.arity 2 :: push @stdio.1 write :: pushvar @stdio.2 1 :: push .arity 2 :: push .1 print :: push .2 message :: unbind 1 :: rule 2 succeeded |:: print message| :@stdio: write 10 |:: rule 3| :: match .arity 2 :: match .1 print :: match .2 message :: consume .arity :: consume .1 :: consume .2 :: push @stdio.arity 2 :: push @stdio.1 write :: push @stdio.2 10 :: unbind 1 :: rule 3 succeeded || :: rule 0