1
+ int + int ::= $ADD($1, $2)
2
+ int - int ::= $SUB($1, $2)
3
+ int * int ::= $MUL($1, $2)
4
+ int / int ::= $DIV($1, $2)
5
+ int % int ::= $MOD($1, $2)
6
+ int >> int ::= $SHR($1, $2)
7
+ int << int ::= $SHL($1, $2)
8
+ int & int ::= $BWA($1, $2)
9
+ int | int ::= $BWO($1, $2)
10
+ string + string ::= $CAT($1, $2)
11
+ string + int ::= $CAT($1, $2)
12
+ int + string ::= $CAT($1, $2)
13
+ int == int ::= {
14
+ $EQUALS($1, $2)
15
+ }
16
+ string == string ::= $EQUALS($1, $2)
17
+ int > int ::= $GREATER($1, $2)
18
+ int < int ::= $GREATER($2, $1)
19
+ (-int) ::= $SUB(0, $1)
20
+ (+int) ::= $1
21
+ string(int) ::= $CHAR($1, $2)
22
+ symbol -> (*) ::= $LAMBDA($1, $2)
23
+
24
+ namespace ::= $TYPEDEF(0, namespace)
25
+
26
+ namespace{*} ::= {
27
+ $TYPEDEF($QUOTE($2), Namespace)
28
+ }
29
+
30
+ ConsCell + ConsCell ::= {
31
+ appending ::= $2
32
+ traverser ::= $LAMBDA(x, {
33
+ $IF($TYPEOF(x, Nil), {
34
+ appending
35
+ }, {
36
+ $CONS($CAR(x), traverser($CDR(x)))
37
+ })
38
+ })
39
+ traverser($QUOTE($1))
40
+ }
41
+
42
+ Namespace.(*) ::= {
43
+ body ::= $UNTYPE($1)
44
+ comb ::= body + $CONS($QUOTE($2), $NIL())
45
+ $EVAL(comb)
46
+ }
47
+
48
+ Namespace(*) ::= $1 . ($2)
49
+ Namespace{*} ::= $1 . ($2)
50
+
51
+ include ::= $LOAD
52
+
53
+ import ::= $TYPEDEF(0, import)
54
+ import(string) ::= namespace {
55
+ include($2)
56
+ }
57
+
58
+ ConsCell(int) ::= $IF($2 < 1, $CAR($QUOTE($1)), $CDR($QUOTE($1))($2-1))
59
+
60
+ $WRITELN ::= x -> $WRITE(x + "\n")
61
+ $WRITEB2 ::= x -> {
62
+ $WRITEB((x >> 8) & 255)
63
+ $WRITEB(x & 255)
64
+ }
65
+ $WRITEB4 ::= x -> {
66
+ $WRITEB((x >> 24) & 255)
67
+ $WRITEB((x >> 16) & 255)
68
+ $WRITEB((x >> 8) & 255)
69
+ $WRITEB(x & 255)
70
+ }
71
+ $WRITEB8 ::= x -> {
72
+ $WRITEB((x >> 56) & 255)
73
+ $WRITEB((x >> 48) & 255)
74
+ $WRITEB((x >> 40) & 255)
75
+ $WRITEB((x >> 32) & 255)
76
+ $WRITEB((x >> 24) & 255)
77
+ $WRITEB((x >> 16) & 255)
78
+ $WRITEB((x >> 8) & 255)
79
+ $WRITEB(x & 255)
80
+ }
81
+
82
+ string :=@ (*) ::= $DEF($1, $2)
83
+ string =@@ (*) ::= $SET($1, $2)
84
+ @@string ::= $GET($1)
85
+
86
+ // VECTORS:
87
+
88
+ $vec ::= $LAMBDA(size, $VECTOR(size))
89
+ Vector(int) ::= $VECTOR_GET($1, $2)
90
+ Vector <- (*) ::= $TYPEDEF($CONS($1, $2), VectorSet)
91
+ VectorSet for int ::= {
92
+ vector ::= $CAR($UNTYPE($1))
93
+ value ::= $CDR($UNTYPE($1))
94
+ index ::= $2
95
+ $VECTOR_SET(vector, index, value)
96
+ vector
97
+ }
98
+ ?Vector ::= $VECTOR_LEN($1)
99
+ Vector scale int ::= $VECTOR_RESIZE($1, $2)
100
+
101
+ // SEQUENCES:
102
+
103
+ // EMPTY SEQUENCE:
104
+ _seq ::= $TYPEDEF($NIL(), _EmptySeq)
105
+ (?_EmptySeq) ::= 0
106
+ (!_EmptySeq) ::= $NIL()
107
+
108
+ // CREATING
109
+ _EmptySeq,(*) ::= $TYPEDEF($CONS(1, $CONS($2, $NIL())), _Seq)
110
+ (?_Seq) ::= $CAR($UNTYPE($1))
111
+ (!_Seq) ::= $CDR($UNTYPE($1))
112
+
113
+ // APPENDING
114
+ _Seq,(*) ::= {
115
+ len ::= ?$1
116
+ list ::= !$1
117
+ element ::= $2
118
+ inserter ::= x -> {
119
+ $IF($TYPEOF(x, Nil), {
120
+ $CONS(element, $NIL())
121
+ }, {
122
+ $CONS($CAR(x), inserter($CDR(x)))
123
+ })
124
+ }
125
+ $TYPEDEF($CONS(len+1, inserter(list)), _Seq)
126
+ }
127
+
128
+ // INDEXING
129
+ _Seq(int) ::= {
130
+ list ::= !$1
131
+ index ::= $2
132
+ selector ::= i -> (x -> {
133
+ $IF(i < 1, $CAR(x), selector(i-1)($CDR(x)))
134
+ })
135
+ selector(index)(list)
136
+ }
137
+
138
+ (~_Seq) ::= $IF((?$1 - 1) < 1, _seq, $TYPEDEF($CONS(?$1 - 1, $CDR(!$1)), _Seq))
139
+ (*_Seq) ::= $CAR(!$1)
140
+ (~_EmptySeq) ::= _seq
141
+ (*_EmptySeq) ::= _seq
142
+
143
+ // MAPPING FUNC
144
+ _Seq map (*) ::= {
145
+ list ::= !$1
146
+ len ::= ?$1
147
+ f ::= $2
148
+ mapper ::= x -> {
149
+ $IF($TYPEOF(x, Nil), {
150
+ $NIL()
151
+ }, {
152
+ $CONS(f($CAR(x)), mapper($CDR(x)))
153
+ })
154
+ }
155
+
156
+ $TYPEDEF($CONS(len, mapper(list)), _Seq)
157
+ }
158
+
159
+ _Seq replace int ::= $TYPEDEF($CONS($1, $2), _SeqReplace)
160
+ _SeqReplace with (*) ::= {
161
+ element ::= $2
162
+ replaceStatement ::= $UNTYPE($1)
163
+ seq ::= $CAR(replaceStatement)
164
+ len ::= ?seq
165
+ index ::= $CDR(replaceStatement)
166
+
167
+ "i" :=@ 0
168
+
169
+ seq map x -> {
170
+ result ::= $IF(@@"i" == index, element, x)
171
+ "i" =@@ @@"i" + 1
172
+ result
173
+ }
174
+ }
175
+
176
+ string map (*) ::= {
177
+ len ::= $STRLEN($1)
178
+ str ::= $1
179
+ f ::= $2
180
+ mapper ::= i -> {
181
+ $IF(i == len, {
182
+ ""
183
+ }, {
184
+ $STR(f(str(i))) + mapper(i+1)
185
+ })
186
+ }
187
+
188
+ mapper(0)
189
+ }
190
+
191
+ string foreach (*) ::= {
192
+ len ::= $STRLEN($1)
193
+ str ::= $1
194
+ f ::= $2
195
+ mapper ::= i -> {
196
+ $IF(i == len, {
197
+ ""
198
+ }, {
199
+ f(str(i))
200
+ mapper(i+1)
201
+ })
202
+ }
203
+
204
+ mapper(0)
205
+ }
206
+
207
+ _EmptySeq map (*) ::= {}
208
+
209
+
210
+ _map ::= $TYPEDEF($NIL(), _EmptyMap)
211
+
212
+ _EmptyMap{*} ::= {
213
+ "_MAPBUILDER" :=@ _seq
214
+
215
+ // DEFINE SYNTAX
216
+ string:(*) ::= {
217
+ "_MAPBUILDER" =@@ (@@"_MAPBUILDER"), $CONS($1, $2)
218
+ }
219
+
220
+ // EVAL ARGUMENT
221
+ $EVAL($QUOTE($2))
222
+
223
+ // RETURN MAP
224
+ $TYPEDEF(@@"_MAPBUILDER", _Map)
225
+ }
226
+
227
+ (?_EmptyMap) ::= 0
228
+ (?_Map) ::= ?($UNTYPE($1))
229
+ (.._Map) ::= $UNTYPE($1) map x -> $CDR(x)
230
+ (.._EmptyMap) ::= _seq
231
+
232
+ _Map{*} ::= {
233
+ map ::= $1
234
+ "_MAPBUILDER" :=@ $UNTYPE($1)
235
+
236
+ // DEFINE SYNTAX
237
+ string:(*) ::= {
238
+ index ::= (map?$1)
239
+ $IF(index == -1, {
240
+ "_MAPBUILDER" =@@ (@@"_MAPBUILDER"), $CONS($1, $2)
241
+ }, {
242
+ "_MAPBUILDER" =@@ ((@@"_MAPBUILDER") replace index with $CONS($1, $2))
243
+ })
244
+ }
245
+
246
+ // EVAL ARGUMENT
247
+ $EVAL($QUOTE($2))
248
+
249
+ // RETURN MAP
250
+ $TYPEDEF(@@"_MAPBUILDER", _Map)
251
+ }
252
+
253
+ _Map(string) ::= {
254
+ seq ::= $UNTYPE($1)
255
+
256
+ $IF($TYPEOF(seq, _EmptySeq), {
257
+ $NIL()
258
+ }, {
259
+ head ::= *seq
260
+ $IF($CAR(head) == $2, {
261
+ $CDR(head)
262
+ }, {
263
+ ($TYPEDEF(~seq, _Map))($2)
264
+ })
265
+ })
266
+ }
267
+
268
+
269
+ _EmptyMap?string ::= -1
270
+
271
+ _Map?string ::= {
272
+ seq ::= $UNTYPE($1)
273
+ len ::= ?seq
274
+ searching ::= $2
275
+
276
+ seacher ::= i -> {
277
+ $IF(i == len, {
278
+ -1
279
+ }, {
280
+ $IF(searching == $CAR(seq(i)), {
281
+ i
282
+ }, {
283
+ seacher(i+1)
284
+ })
285
+ })
286
+ }
287
+
288
+ seacher(0)
289
+ }
290
+
291
+ include("toolchain/language.gsm")
0 commit comments