hello-world.inlang.nils.nv
· 6.2 KiB · Text
Surowy
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 :rule: 1 :failed:| :: rule 2
|:: done :rule: 2 :failed:| :: rule 3
|:: done :rule: 3 :failed:| :: rule 4
|:: done :rule: $x :failed:?|
|:: done :rule: $x| :: rule 1
|:: 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 0|
: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
:: done
|:@stdio: write $char|
:@jet: "io.write(string.char(tonumber($char)))"
|:: rule 1|
:rule: 1
:: 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 2|
:rule: 2
:: 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 3|
:rule: 3
:: 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
|| :: 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 | |:@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 :rule: 1 :failed:| :: rule 2 |
136 | |:: done :rule: 2 :failed:| :: rule 3 |
137 | |:: done :rule: 3 :failed:| :: rule 4 |
138 | |:: done :rule: $x :failed:?| |
139 | |:: done :rule: $x| :: rule 1 |
140 | |
141 | |
142 | |:: jet @stdio write/1 :failed:?| |
143 | |:: jet @stdio write/1 :@registers result: $symbol| |
144 | :@jet: "io.write(string.char(tonumber($symbol)))" |
145 | |:: jet @stdio write/1?| |
146 | :@registers: fetch 1 |
147 | |
148 | |:/:| :: print message :message: "Hello, World!" |
149 | |:: rule 0| |
150 | :rule: 0 |
151 | :: push .arity 2 :: push .1 print :: push .2 message |
152 | :: push message.arity 1 :: push message.1 33 |
153 | :: push message.arity 1 :: push message.1 100 |
154 | :: push message.arity 1 :: push message.1 108 |
155 | :: push message.arity 1 :: push message.1 114 |
156 | :: push message.arity 1 :: push message.1 111 |
157 | :: push message.arity 1 :: push message.1 87 |
158 | :: push message.arity 1 :: push message.1 32 |
159 | :: push message.arity 1 :: push message.1 44 |
160 | :: push message.arity 1 :: push message.1 111 |
161 | :: push message.arity 1 :: push message.1 108 |
162 | :: push message.arity 1 :: push message.1 108 |
163 | :: push message.arity 1 :: push message.1 101 |
164 | :: push message.arity 1 :: push message.1 72 |
165 | :: done |
166 | |
167 | |:@stdio: write $char| |
168 | :@jet: "io.write(string.char(tonumber($char)))" |
169 | |:: rule 1| |
170 | :rule: 1 |
171 | :: match 2 at top of @stdio.arity :: match write at top of @stdio.1 :: bind @stdio.2 1 |
172 | :: consume @stdio.arity |
173 | :: consume @stdio.1 |
174 | :: consume @stdio.2 |
175 | :: jet @stdio write/1 |
176 | :: unbind 1 |
177 | :: done |
178 | |
179 | |:: print message? :message: $char| |
180 | :@stdio: write $char |
181 | |:: rule 2| |
182 | :rule: 2 |
183 | :: match 2 at top of .arity :: match print at top of .1 :: match message at top of .2 |
184 | :: match 1 at top of message.arity :: bind message.1 1 |
185 | :: consume .arity :: consume .1 :: consume .2 |
186 | :: consume message.arity :: consume message.1 |
187 | :: push @stdio.arity 2 :: push @stdio.1 write :: pushvar @stdio.2 1 |
188 | :: push .arity 2 :: push .1 print :: push .2 message |
189 | :: unbind 1 |
190 | :: done |
191 | |
192 | |
193 | |:: print message| |
194 | :@stdio: write 10 |
195 | |:: rule 3| |
196 | :rule: 3 |
197 | :: match 2 at top of .arity :: match print at top of .1 :: match message at top of .2 |
198 | :: consume .arity :: consume .1 :: consume .2 |
199 | :: push @stdio.arity 2 :: push @stdio.1 write :: push @stdio.2 10 |
200 | :: unbind 1 |
201 | :: done |
202 | |
203 | |
204 | || :: rule 0 |