hello-world.nils.jets.nv
· 3.7 KiB · Text
Raw
Playground
|:: 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
| 1 | |:: documentation for NILS Form| |
| 2 | :@doc string: |
| 3 | "Nova In-Language Static Form is a possible structure for lowering |
| 4 | Nova code into a bytecode language describable in Nova. This is not |
| 5 | intended to be written by hand." |
| 6 | |
| 7 | |:: match $stack $arity :failed:?| |
| 8 | |:: match $stack $symbol| |
| 9 | :@jet: |
| 10 | " |
| 11 | local s = stacks[$stack] |
| 12 | local s_top = s.n |
| 13 | local tuple = s[s_top] |
| 14 | if not tuple or tuple[1] ~= $symbol then |
| 15 | push("failed", { }) |
| 16 | else |
| 17 | pop($stack) |
| 18 | push($stack .. " (r)", { $symbol }) |
| 19 | end |
| 20 | " |
| 21 | |
| 22 | |:: bind $stack $symbol :failed:?| |
| 23 | |:: bind $stack $register| |
| 24 | :@jet: |
| 25 | " |
| 26 | local s = stacks[$stack] |
| 27 | local s_top = s.n |
| 28 | local r = stacks[$register] |
| 29 | local r_top = r.n |
| 30 | local s_tuple = s[s_top] |
| 31 | local r_tuple = r[r_top] |
| 32 | if not s_tuple or r_tuple and s_tuple[1] ~= r_tuple[1] then |
| 33 | push("failed", { }) |
| 34 | else |
| 35 | pop($stack) |
| 36 | push($stack .. " (r)", s_tuple) |
| 37 | if not r_tuple then push($register, s_tuple) end |
| 38 | end |
| 39 | " |
| 40 | |
| 41 | |:: consume $stack :failed:?| |
| 42 | :@jet: |
| 43 | " |
| 44 | local r = pop($stack .. " (r)") |
| 45 | if r then push($stack, r) end |
| 46 | " |
| 47 | |:: consume $stack | |
| 48 | :@jet: |
| 49 | " |
| 50 | pop($stack .. " (r)") |
| 51 | " |
| 52 | |
| 53 | |:: push $stack $symbol :failed:?| |
| 54 | |:: push $stack $symbol| |
| 55 | :@jet: |
| 56 | " |
| 57 | push($stack, { $symbol }) |
| 58 | " |
| 59 | |
| 60 | |:: pushvar $stack $reg :failed:?| |
| 61 | |:: pushvar $stack $reg| |
| 62 | :@jet: |
| 63 | " |
| 64 | local r_tuple = pop($reg) |
| 65 | push($stack, r_tuple) |
| 66 | push($reg, r_tuple) |
| 67 | " |
| 68 | |
| 69 | |:: unbind $n| |
| 70 | :@jet: |
| 71 | " |
| 72 | if stacks[$n].n > 0 then |
| 73 | pop($n) |
| 74 | end |
| 75 | " |
| 76 | |
| 77 | |:: jet @stdio write/1 :failed:?| |
| 78 | |:: jet @stdio write/1| |
| 79 | :@jet: "io.write(string.char(tonumber(stacks["1"][1][1])))" |
| 80 | |
| 81 | |:stacks:| |
| 82 | :@stdio.arity: :@stdio.1: :@stdio.2: |
| 83 | :@stdio.arity (r): :@stdio.1 (r): :@stdio.2 (r): |
| 84 | |
| 85 | :.arity: :.1: :.2: |
| 86 | :.arity (r): :.1 (r): :.2 (r): |
| 87 | |
| 88 | :message.arity: :message.1: |
| 89 | :message.arity (r): :message.1 (r): |
| 90 | |
| 91 | |:registers:| |
| 92 | :1: |
| 93 | |
| 94 | |:: rule 1 succeeded :failed:| :: rule 2 |
| 95 | |:: rule 2 succeeded :failed:| :: rule 3 |
| 96 | |:: rule 3 succeeded :failed:| :: rule 4 |
| 97 | |:: rule $x succeeded :failed:?| |
| 98 | |:: rule $x succeeded| :: rule 1 |
| 99 | |
| 100 | |
| 101 | |:/:| :: print message :message: "Hello, World!" |
| 102 | |:: rule 0| |
| 103 | :: push .arity 2 :: push .1 print :: push .2 message |
| 104 | :: push message.arity 1 :: push message.1 33 |
| 105 | :: push message.arity 1 :: push message.1 100 |
| 106 | :: push message.arity 1 :: push message.1 108 |
| 107 | :: push message.arity 1 :: push message.1 114 |
| 108 | :: push message.arity 1 :: push message.1 111 |
| 109 | :: push message.arity 1 :: push message.1 87 |
| 110 | :: push message.arity 1 :: push message.1 32 |
| 111 | :: push message.arity 1 :: push message.1 44 |
| 112 | :: push message.arity 1 :: push message.1 111 |
| 113 | :: push message.arity 1 :: push message.1 108 |
| 114 | :: push message.arity 1 :: push message.1 108 |
| 115 | :: push message.arity 1 :: push message.1 101 |
| 116 | :: push message.arity 1 :: push message.1 72 |
| 117 | :: rule 0 succeeded |
| 118 | |
| 119 | |:@stdio: write $char| |
| 120 | :@jet: "io.write(string.char(tonumber($char)))" |
| 121 | |:: rule 1| |
| 122 | :: match @stdio.arity 2 :: match @stdio.1 write :: bind @stdio.2 1 |
| 123 | :: consume @stdio.arity |
| 124 | :: consume @stdio.1 |
| 125 | :: consume @stdio.2 |
| 126 | :: jet @stdio write/1 |
| 127 | :: unbind 1 |
| 128 | :: rule 1 succeeded |
| 129 | |
| 130 | |:: print message? :message: $char| |
| 131 | :@stdio: write $char |
| 132 | |:: rule 2| |
| 133 | :: match .arity 2 :: match .1 print :: match .2 message |
| 134 | :: match message.arity 1 :: bind message.1 1 |
| 135 | :: consume .arity :: consume .1 :: consume .2 |
| 136 | :: consume message.arity :: consume message.1 |
| 137 | :: push @stdio.arity 2 :: push @stdio.1 write :: pushvar @stdio.2 1 |
| 138 | :: push .arity 2 :: push .1 print :: push .2 message |
| 139 | :: unbind 1 |
| 140 | :: rule 2 succeeded |
| 141 | |
| 142 | |
| 143 | |:: print message| |
| 144 | :@stdio: write 10 |
| 145 | |:: rule 3| |
| 146 | :: match .arity 2 :: match .1 print :: match .2 message |
| 147 | :: consume .arity :: consume .1 :: consume .2 |
| 148 | :: push @stdio.arity 2 :: push @stdio.1 write :: push @stdio.2 10 |
| 149 | :: unbind 1 |
| 150 | :: rule 3 succeeded |
| 151 | |
| 152 | |
| 153 | || :: rule 0 |