hello-world.inlang.nils.nv
· 6.3 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."
|:@data stack: reset? :@data seen: $stack $value|
:@data: $stack $value
|:@data stack: reset|
|:@data stack: push $stack $value|
:@data: $stack $value
|:@data stack: pop $stack :@data: $stack $value|
:@data stack: reset
:@data result: $value
|:@data stack: pop $stack? :@data: $x $y|
:@data seen: $x $y
|:@data stack: pop $stack|
:@data stack: reset
:@data result: empty
|:@data stack: peek $stack :@data: $stack $value?|
:@data stack: reset
:@data result: $value
|:@data stack: peek $stack? :@data: $x $y|
:@data seen: $x $y
|:@data stack: peek $stack|
:@data stack: reset
:@data result: empty
|:@retained stack: reset? :@retained seen: $stack $value|
:@retained: $stack $value
|:@retained stack: reset|
|:@retained stack: push $stack $value|
:@retained: $stack $value
|:@retained stack: pop $stack :@retained: $stack $value|
:@retained stack: reset
:@retained result: $value
|:@retained stack: pop $stack? :@retained: $x $y|
:@retained seen: $x $y
|:@retained stack: pop $stack|
:@retained stack: reset
:@retained result: empty
|:@retained stack: peek $stack :@retained: $stack $value?|
:@retained stack: reset
:@retained result: $value
|:@retained stack: peek $stack? :@retained: $x $y|
:@retained seen: $x $y
|:@retained stack: peek $stack|
:@retained stack: reset
:@retained result: empty
|:@registers: reset :@reg seen: $reg $value|
:@reg: $reg $value
|:@registers: reset|
|:@registers: store $register $value :@reg: $register $other-value|
:@registers: reset
:@reg: $register $value
|:@registers: store $register $value :@reg: $other-register $other-value|
:@reg seen: $other-register $other-value
|:@registers: store $register $value|
:@reg: $register $value
|:@registers: fetch $register :@reg: $register $value?|
:@registers: reset
:@registers result: $value
|:@registers: fetch $register :@reg: $other-register $other-value|
:seen @reg: $other-register $other-value
|:@registers: fetch $register|
:@registers: reset
:@registers result: empty
|:@registers: clear $register :@reg: $register $value|
:@registers: reset
|:@registers: clear $register :@reg: $other-register $value|
:@registers seen: $other-register $value
|:@registers: clear $register|
|:: match $symbol at top of $stack :failed:?|
|:: match $symbol at top of $stack :@data result: $symbol|
:@retained stack: push $stack $symbol
|:: match $symbol at top of $stack :@data result: $wrong-symbol|
:@data stack: push $stack $wrong-symbol :failed:
|:: match $symbol at top of $stack :@data result: empty|
:failed:
|:: match $symbol at top of $stack?|
:@data stack: pop $stack
|:: bind $stack $reg :failed:?|
|:: bind $stack $reg :@registers result: $empty :@data result: $symbol|
:@retained stack: push $stack $symbol
:@registers: store $reg $symbol
|:: bind $stack $reg :@register result: $symbol :@data result: $symbol|
:@retained stack: push $stack $symbol
|:: bind $stack $reg :@register result: $symbol :@data result: $different-symbol|
:failed: :@data stack: push $stack $different-symbol
|:: bind $stack $reg?|
:@registers: fetch $reg
:@data stack: pop $stack
|:: consume $stack :failed:? :@retained result: empty|
|:: consume $stack :failed:? :@retained result: $value|
:@data stack: push $stack $value
|:: consume $stack :@retained result: $_|
|:: consume $stack?|
:@retained stack: pop $stack
|:: push $stack $symbol :failed:?|
|:: push $stack $symbol|
:@data stack: push $stack $symbol
|:: pushvar $stack $reg :failed:?|
|:: pushvar $stack $reg :@registers result: $value|
:@data stack: push $stack $value
|:: pushvar $stack $reg?|
:@registers: fetch $reg
|:: unbind $reg| :@registers: clear $reg
|:: unbind|
|:: done :failed:| :: next rule :: ;
|:: done| :: reset rules :: rule :: ;
|:: reset rules :rule: ;|
|:: reset rules? :rule:|
|:: next rule :rule: ;| :: rule
|:: next rule :rule:| :: next rule :: rule
|:: jet @stdio write/1 :failed:?|
|:: jet @stdio write/1 :@registers result: $symbol|
:@jet: "io.write(string.char(tonumber($symbol)))"
|:: jet @stdio write/1?|
:@registers: fetch 1
|:/:| :: print message :message: "Hello, World!"
|:: ;|
:rule: ;
:: 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
:: done
|:@stdio: write $char|
:@jet: "io.write(string.char(tonumber($char)))"
|:: rule :: ;|
:rule: :rule: ;
:: match 2 at top of @stdio.arity :: match write at top of @stdio.1 :: bind @stdio.2 1
:: consume @stdio.arity
:: consume @stdio.1
:: consume @stdio.2
:: jet @stdio write/1
:: unbind 1
:: done
|:: print message? :message: $char|
:@stdio: write $char
|:: rule :: rule :: ;|
:rule: :rule: :rule: ;
:: match 2 at top of .arity :: match print at top of .1 :: match message at top of .2
:: match 1 at top of message.arity :: 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
:: done
|:: print message|
:@stdio: write 10
|:: rule :: rule :: rule :: ;|
:rule: :rule: :rule: :rule: ;
:: match 2 at top of .arity :: match print at top of .1 :: match message at top of .2
:: consume .arity :: consume .1 :: consume .2
:: push @stdio.arity 2 :: push @stdio.1 write :: push @stdio.2 10
:: unbind 1
:: done
|| :: ;
| 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 | |:@data stack: reset? :@data seen: $stack $value| |
| 8 | :@data: $stack $value |
| 9 | |:@data stack: reset| |
| 10 | |
| 11 | |:@data stack: push $stack $value| |
| 12 | :@data: $stack $value |
| 13 | |
| 14 | |:@data stack: pop $stack :@data: $stack $value| |
| 15 | :@data stack: reset |
| 16 | :@data result: $value |
| 17 | |:@data stack: pop $stack? :@data: $x $y| |
| 18 | :@data seen: $x $y |
| 19 | |:@data stack: pop $stack| |
| 20 | :@data stack: reset |
| 21 | :@data result: empty |
| 22 | |
| 23 | |:@data stack: peek $stack :@data: $stack $value?| |
| 24 | :@data stack: reset |
| 25 | :@data result: $value |
| 26 | |:@data stack: peek $stack? :@data: $x $y| |
| 27 | :@data seen: $x $y |
| 28 | |:@data stack: peek $stack| |
| 29 | :@data stack: reset |
| 30 | :@data result: empty |
| 31 | |
| 32 | |
| 33 | |:@retained stack: reset? :@retained seen: $stack $value| |
| 34 | :@retained: $stack $value |
| 35 | |:@retained stack: reset| |
| 36 | |
| 37 | |:@retained stack: push $stack $value| |
| 38 | :@retained: $stack $value |
| 39 | |
| 40 | |:@retained stack: pop $stack :@retained: $stack $value| |
| 41 | :@retained stack: reset |
| 42 | :@retained result: $value |
| 43 | |:@retained stack: pop $stack? :@retained: $x $y| |
| 44 | :@retained seen: $x $y |
| 45 | |:@retained stack: pop $stack| |
| 46 | :@retained stack: reset |
| 47 | :@retained result: empty |
| 48 | |
| 49 | |:@retained stack: peek $stack :@retained: $stack $value?| |
| 50 | :@retained stack: reset |
| 51 | :@retained result: $value |
| 52 | |:@retained stack: peek $stack? :@retained: $x $y| |
| 53 | :@retained seen: $x $y |
| 54 | |:@retained stack: peek $stack| |
| 55 | :@retained stack: reset |
| 56 | :@retained result: empty |
| 57 | |
| 58 | |
| 59 | |:@registers: reset :@reg seen: $reg $value| |
| 60 | :@reg: $reg $value |
| 61 | |:@registers: reset| |
| 62 | |
| 63 | |:@registers: store $register $value :@reg: $register $other-value| |
| 64 | :@registers: reset |
| 65 | :@reg: $register $value |
| 66 | |:@registers: store $register $value :@reg: $other-register $other-value| |
| 67 | :@reg seen: $other-register $other-value |
| 68 | |:@registers: store $register $value| |
| 69 | :@reg: $register $value |
| 70 | |
| 71 | |:@registers: fetch $register :@reg: $register $value?| |
| 72 | :@registers: reset |
| 73 | :@registers result: $value |
| 74 | |:@registers: fetch $register :@reg: $other-register $other-value| |
| 75 | :seen @reg: $other-register $other-value |
| 76 | |:@registers: fetch $register| |
| 77 | :@registers: reset |
| 78 | :@registers result: empty |
| 79 | |
| 80 | |:@registers: clear $register :@reg: $register $value| |
| 81 | :@registers: reset |
| 82 | |:@registers: clear $register :@reg: $other-register $value| |
| 83 | :@registers seen: $other-register $value |
| 84 | |:@registers: clear $register| |
| 85 | |
| 86 | |
| 87 | |
| 88 | |:: match $symbol at top of $stack :failed:?| |
| 89 | |:: match $symbol at top of $stack :@data result: $symbol| |
| 90 | :@retained stack: push $stack $symbol |
| 91 | |:: match $symbol at top of $stack :@data result: $wrong-symbol| |
| 92 | :@data stack: push $stack $wrong-symbol :failed: |
| 93 | |:: match $symbol at top of $stack :@data result: empty| |
| 94 | :failed: |
| 95 | |:: match $symbol at top of $stack?| |
| 96 | :@data stack: pop $stack |
| 97 | |
| 98 | |:: bind $stack $reg :failed:?| |
| 99 | |:: bind $stack $reg :@registers result: $empty :@data result: $symbol| |
| 100 | :@retained stack: push $stack $symbol |
| 101 | :@registers: store $reg $symbol |
| 102 | |:: bind $stack $reg :@register result: $symbol :@data result: $symbol| |
| 103 | :@retained stack: push $stack $symbol |
| 104 | |:: bind $stack $reg :@register result: $symbol :@data result: $different-symbol| |
| 105 | :failed: :@data stack: push $stack $different-symbol |
| 106 | |:: bind $stack $reg?| |
| 107 | :@registers: fetch $reg |
| 108 | :@data stack: pop $stack |
| 109 | |
| 110 | |
| 111 | |:: consume $stack :failed:? :@retained result: empty| |
| 112 | |:: consume $stack :failed:? :@retained result: $value| |
| 113 | :@data stack: push $stack $value |
| 114 | |:: consume $stack :@retained result: $_| |
| 115 | |:: consume $stack?| |
| 116 | :@retained stack: pop $stack |
| 117 | |
| 118 | |
| 119 | |:: push $stack $symbol :failed:?| |
| 120 | |:: push $stack $symbol| |
| 121 | :@data stack: push $stack $symbol |
| 122 | |
| 123 | |
| 124 | |:: pushvar $stack $reg :failed:?| |
| 125 | |:: pushvar $stack $reg :@registers result: $value| |
| 126 | :@data stack: push $stack $value |
| 127 | |:: pushvar $stack $reg?| |
| 128 | :@registers: fetch $reg |
| 129 | |
| 130 | |
| 131 | |:: unbind $reg| :@registers: clear $reg |
| 132 | |:: unbind| |
| 133 | |
| 134 | |
| 135 | |:: done :failed:| :: next rule :: ; |
| 136 | |:: done| :: reset rules :: rule :: ; |
| 137 | |
| 138 | |:: reset rules :rule: ;| |
| 139 | |:: reset rules? :rule:| |
| 140 | |
| 141 | |:: next rule :rule: ;| :: rule |
| 142 | |:: next rule :rule:| :: next rule :: rule |
| 143 | |
| 144 | |:: jet @stdio write/1 :failed:?| |
| 145 | |:: jet @stdio write/1 :@registers result: $symbol| |
| 146 | :@jet: "io.write(string.char(tonumber($symbol)))" |
| 147 | |:: jet @stdio write/1?| |
| 148 | :@registers: fetch 1 |
| 149 | |
| 150 | |:/:| :: print message :message: "Hello, World!" |
| 151 | |:: ;| |
| 152 | :rule: ; |
| 153 | :: push .arity 2 :: push .1 print :: push .2 message |
| 154 | :: push message.arity 1 :: push message.1 33 |
| 155 | :: push message.arity 1 :: push message.1 100 |
| 156 | :: push message.arity 1 :: push message.1 108 |
| 157 | :: push message.arity 1 :: push message.1 114 |
| 158 | :: push message.arity 1 :: push message.1 111 |
| 159 | :: push message.arity 1 :: push message.1 87 |
| 160 | :: push message.arity 1 :: push message.1 32 |
| 161 | :: push message.arity 1 :: push message.1 44 |
| 162 | :: push message.arity 1 :: push message.1 111 |
| 163 | :: push message.arity 1 :: push message.1 108 |
| 164 | :: push message.arity 1 :: push message.1 108 |
| 165 | :: push message.arity 1 :: push message.1 101 |
| 166 | :: push message.arity 1 :: push message.1 72 |
| 167 | :: done |
| 168 | |
| 169 | |:@stdio: write $char| |
| 170 | :@jet: "io.write(string.char(tonumber($char)))" |
| 171 | |:: rule :: ;| |
| 172 | :rule: :rule: ; |
| 173 | :: match 2 at top of @stdio.arity :: match write at top of @stdio.1 :: bind @stdio.2 1 |
| 174 | :: consume @stdio.arity |
| 175 | :: consume @stdio.1 |
| 176 | :: consume @stdio.2 |
| 177 | :: jet @stdio write/1 |
| 178 | :: unbind 1 |
| 179 | :: done |
| 180 | |
| 181 | |:: print message? :message: $char| |
| 182 | :@stdio: write $char |
| 183 | |:: rule :: rule :: ;| |
| 184 | :rule: :rule: :rule: ; |
| 185 | :: match 2 at top of .arity :: match print at top of .1 :: match message at top of .2 |
| 186 | :: match 1 at top of message.arity :: bind message.1 1 |
| 187 | :: consume .arity :: consume .1 :: consume .2 |
| 188 | :: consume message.arity :: consume message.1 |
| 189 | :: push @stdio.arity 2 :: push @stdio.1 write :: pushvar @stdio.2 1 |
| 190 | :: push .arity 2 :: push .1 print :: push .2 message |
| 191 | :: unbind 1 |
| 192 | :: done |
| 193 | |
| 194 | |
| 195 | |:: print message| |
| 196 | :@stdio: write 10 |
| 197 | |:: rule :: rule :: rule :: ;| |
| 198 | :rule: :rule: :rule: :rule: ; |
| 199 | :: match 2 at top of .arity :: match print at top of .1 :: match message at top of .2 |
| 200 | :: consume .arity :: consume .1 :: consume .2 |
| 201 | :: push @stdio.arity 2 :: push @stdio.1 write :: push @stdio.2 10 |
| 202 | :: unbind 1 |
| 203 | :: done |
| 204 | |
| 205 | |
| 206 | || :: ; |