最后活跃于 1748752843

hello-world.inlang.nils.nv 原始文件 Playground
1|:: documentation for NILS Form|
2 :@doc string:
3"Nova In-Language Static Form is a possible structure for lowering
4Nova code into a bytecode language describable in Nova. This is not
5intended 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|| :: ;