fez-lisp 1.5.197 → 1.5.199
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/baked/std-T.js +1 -1
- package/package.json +1 -1
- package/src/compiler.js +1 -0
- package/src/enhance.js +42 -11
- package/src/interpreter.js +1 -1
- package/src/parser.js +111 -5
package/lib/baked/std-T.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export default [[[0,"let"],[1,"math:map"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:select"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:exclude"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:enumerated-fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:maximum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:minimum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-def"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-get"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-set!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-del!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-set-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-increment!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-decrement!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-increment-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-decrement-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-add!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-subtract!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-multiply!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-divide!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-add-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-subtract-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-multiply-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-divide-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:max-sub-array-sum"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:median"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:mean"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:subset"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:permutations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations-n"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:variants"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:unique"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:divisors"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"var:def"],[[0,"lambda"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:get"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"var:set!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:del!"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:set-and-get!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:first"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:second"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:third"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:last"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:transform"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:enumerated-reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:zip"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"array:push!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"array:append!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"bools:fold"],[[0,"lambda"],[1,"Boolean[]"],[[0,"lambda"],[1,"Boolean"],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"from:string->array"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"from:array->string"],[[0,"lambda"],[1,"Unknown[][]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->integers"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->integer"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:integer->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->floats"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->float"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:float->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]]]
|
1
|
+
export default [[[0,"let"],[1,"math:map"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:select"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:exclude"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:enumerated-fold"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-every?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:enumerated-some?"],[[0,"lambda"],[1,"Number[]"],[[0,"lambda"],[1,"Number"],[1,"Number"],[[0,"do"],[1,"Boolean"]]],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"math:maximum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:minimum-index"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-def"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-get"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-set!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-del!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-set-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-increment!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-decrement!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:var-increment-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-decrement-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-add!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-subtract!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-multiply!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-divide!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-add-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-subtract-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-multiply-and-get!"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:var-divide-and-get!"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:max-sub-array-sum"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:median"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:mean"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"math:subset"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:permutations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:combinations-n"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:variants"],[[0,"lambda"],[1,"Unknown[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"math:unique"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"math:divisors"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"var:def"],[[0,"lambda"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:get"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"var:set!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:del!"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"var:set-and-get!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:first"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:second"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:third"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:last"],[[0,"lambda"],[1,"Unknown[]"],[[0,"do"],[1,"Any"]]]],[[0,"let"],[1,"array:transform"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown"],[[0,"do"],[1,"Unknown"]]],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"array:reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:enumerated-reduce"],[[0,"lambda"],[1,"Unknown[]"],[[0,"lambda"],[1,"Number"],[1,"Unknown"],[1,"Number"],[[0,"do"],[1,"Number"]]],[1,"Number"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"array:zip"],[[0,"lambda"],[1,"Unknown[]"],[1,"Unknown[]"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"array:push!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown"]]]],[[0,"let"],[1,"array:append!"],[[0,"lambda"],[1,"Unknown[]"],[1,"Any"],[[0,"do"],[1,"Unknown[]"]]]],[[0,"let"],[1,"bools:fold"],[[0,"lambda"],[1,"Boolean[]"],[[0,"lambda"],[1,"Boolean"],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]],[1,"Boolean"],[[0,"do"],[1,"Boolean"]]]],[[0,"let"],[1,"from:string->array"],[[0,"lambda"],[1,"Number[]"],[1,"Number"],[[0,"do"],[1,"Unknown[][]"]]]],[[0,"let"],[1,"from:array->string"],[[0,"lambda"],[1,"Unknown[][]"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->integers"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->integer"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:integer->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:strings->floats"],[[0,"lambda"],[1,"Unknown[][]"],[[0,"do"],[1,"Number[]"]]]],[[0,"let"],[1,"from:string->float"],[[0,"lambda"],[1,"Number[]"],[[0,"do"],[1,"Number"]]]],[[0,"let"],[1,"from:float->string"],[[0,"lambda"],[1,"Number"],[[0,"do"],[1,"Number[]"]]]]]
|
package/package.json
CHANGED
package/src/compiler.js
CHANGED
package/src/enhance.js
CHANGED
@@ -36,17 +36,6 @@ const opt = (ast) => {
|
|
36
36
|
case APPLY:
|
37
37
|
{
|
38
38
|
switch (first[VALUE]) {
|
39
|
-
case STATIC_TYPES.ABSTRACTION:
|
40
|
-
case STATIC_TYPES.COLLECTION:
|
41
|
-
case STATIC_TYPES.UNKNOWN:
|
42
|
-
case STATIC_TYPES.ATOM:
|
43
|
-
case STATIC_TYPES.BOOLEAN:
|
44
|
-
case STATIC_TYPES.ANY:
|
45
|
-
case STATIC_TYPES.NUMBER:
|
46
|
-
case STATIC_TYPES.NUMBERS:
|
47
|
-
case STATIC_TYPES.ABSTRACTIONS:
|
48
|
-
case STATIC_TYPES.BOOLEANS:
|
49
|
-
case STATIC_TYPES.COLLECTIONS:
|
50
39
|
case STATIC_TYPES.AS_NUMBER:
|
51
40
|
exp.length = 0
|
52
41
|
for (let i = 0; i < rest.length; ++i) exp.push(...rest[i])
|
@@ -245,4 +234,46 @@ const opt = (ast) => {
|
|
245
234
|
return wrapInBlock(shaked)
|
246
235
|
}
|
247
236
|
|
237
|
+
export const removeCast = (ast) => {
|
238
|
+
const evaluate = (exp) => {
|
239
|
+
const [first, ...rest] = isLeaf(exp) ? [exp] : exp
|
240
|
+
if (first != undefined) {
|
241
|
+
switch (first[TYPE]) {
|
242
|
+
case WORD:
|
243
|
+
break
|
244
|
+
case ATOM:
|
245
|
+
break
|
246
|
+
case APPLY:
|
247
|
+
{
|
248
|
+
switch (first[VALUE]) {
|
249
|
+
case STATIC_TYPES.ABSTRACTION:
|
250
|
+
case STATIC_TYPES.COLLECTION:
|
251
|
+
case STATIC_TYPES.UNKNOWN:
|
252
|
+
case STATIC_TYPES.ATOM:
|
253
|
+
case STATIC_TYPES.BOOLEAN:
|
254
|
+
case STATIC_TYPES.ANY:
|
255
|
+
case STATIC_TYPES.NUMBER:
|
256
|
+
case STATIC_TYPES.NUMBERS:
|
257
|
+
case STATIC_TYPES.ABSTRACTIONS:
|
258
|
+
case STATIC_TYPES.BOOLEANS:
|
259
|
+
case STATIC_TYPES.COLLECTIONS:
|
260
|
+
case STATIC_TYPES.AS_NUMBER:
|
261
|
+
exp.length = 0
|
262
|
+
for (let i = 0; i < rest.length; ++i) exp.push(...rest[i])
|
263
|
+
evaluate(exp)
|
264
|
+
break
|
265
|
+
default:
|
266
|
+
break
|
267
|
+
}
|
268
|
+
}
|
269
|
+
break
|
270
|
+
default:
|
271
|
+
break
|
272
|
+
}
|
273
|
+
for (const r of rest) evaluate(r)
|
274
|
+
}
|
275
|
+
}
|
276
|
+
evaluate(ast)
|
277
|
+
return wrapInBlock(ast)
|
278
|
+
}
|
248
279
|
export const enhance = (ast) => opt(AST.parse(AST.stringify(ast))[0])
|
package/src/interpreter.js
CHANGED
@@ -816,7 +816,7 @@ export const keywords = {
|
|
816
816
|
)
|
817
817
|
return +(typeof evaluate(args[0], env) === 'function')
|
818
818
|
},
|
819
|
-
|
819
|
+
// Only for type checking
|
820
820
|
[STATIC_TYPES.UNKNOWN]: (args, env) => evaluate(args[0], env),
|
821
821
|
[STATIC_TYPES.ANY]: (args, env) => evaluate(args[0], env),
|
822
822
|
|
package/src/parser.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { APPLY, ATOM, TYPE, WORD, VALUE } from './keywords.js'
|
1
|
+
import { APPLY, ATOM, TYPE, WORD, VALUE, STATIC_TYPES } from './keywords.js'
|
2
2
|
export const leaf = (type, value) => [type, value]
|
3
3
|
export const isLeaf = ([car]) => car === APPLY || car === ATOM || car === WORD
|
4
4
|
export const LISP = {
|
@@ -117,7 +117,46 @@ export const AST = {
|
|
117
117
|
: typeof ast === 'string'
|
118
118
|
? `"${ast}"`
|
119
119
|
: ast,
|
120
|
-
|
120
|
+
json: (ast) => {
|
121
|
+
const dfs = (exp) => {
|
122
|
+
let out = ''
|
123
|
+
const [head, ...tail] = isLeaf(exp) ? [exp] : exp
|
124
|
+
switch (head[TYPE]) {
|
125
|
+
case WORD:
|
126
|
+
out += `[${WORD},"${head[VALUE]}"]`
|
127
|
+
break
|
128
|
+
case ATOM:
|
129
|
+
out += `[${ATOM},${head[VALUE]}]`
|
130
|
+
break
|
131
|
+
case APPLY:
|
132
|
+
switch (head[VALUE]) {
|
133
|
+
case STATIC_TYPES.ABSTRACTION:
|
134
|
+
case STATIC_TYPES.COLLECTION:
|
135
|
+
case STATIC_TYPES.UNKNOWN:
|
136
|
+
case STATIC_TYPES.ATOM:
|
137
|
+
case STATIC_TYPES.BOOLEAN:
|
138
|
+
case STATIC_TYPES.ANY:
|
139
|
+
case STATIC_TYPES.NUMBER:
|
140
|
+
case STATIC_TYPES.NUMBERS:
|
141
|
+
case STATIC_TYPES.ABSTRACTIONS:
|
142
|
+
case STATIC_TYPES.BOOLEANS:
|
143
|
+
case STATIC_TYPES.COLLECTIONS:
|
144
|
+
case STATIC_TYPES.AS_NUMBER:
|
145
|
+
out += dfs(tail[0])
|
146
|
+
break
|
147
|
+
default:
|
148
|
+
out += `[[${APPLY},"${head[VALUE]}"]${
|
149
|
+
tail.length ? ',' : ''
|
150
|
+
}${tail.map(dfs).join(',')}]`
|
151
|
+
break
|
152
|
+
}
|
153
|
+
break
|
154
|
+
}
|
155
|
+
return out
|
156
|
+
}
|
157
|
+
return dfs(ast)
|
158
|
+
},
|
159
|
+
struct: (ast, mod = '') => {
|
121
160
|
const dfs = (exp) => {
|
122
161
|
let out = ''
|
123
162
|
const [head, ...tail] = isLeaf(exp) ? [exp] : exp
|
@@ -133,9 +172,76 @@ export const AST = {
|
|
133
172
|
})`
|
134
173
|
break
|
135
174
|
case APPLY:
|
136
|
-
|
137
|
-
|
138
|
-
|
175
|
+
switch (head[VALUE]) {
|
176
|
+
case STATIC_TYPES.ABSTRACTION:
|
177
|
+
case STATIC_TYPES.COLLECTION:
|
178
|
+
case STATIC_TYPES.UNKNOWN:
|
179
|
+
case STATIC_TYPES.ATOM:
|
180
|
+
case STATIC_TYPES.BOOLEAN:
|
181
|
+
case STATIC_TYPES.ANY:
|
182
|
+
case STATIC_TYPES.NUMBER:
|
183
|
+
case STATIC_TYPES.NUMBERS:
|
184
|
+
case STATIC_TYPES.ABSTRACTIONS:
|
185
|
+
case STATIC_TYPES.BOOLEANS:
|
186
|
+
case STATIC_TYPES.COLLECTIONS:
|
187
|
+
case STATIC_TYPES.AS_NUMBER:
|
188
|
+
out += dfs(tail[0])
|
189
|
+
break
|
190
|
+
default:
|
191
|
+
out += `Expression::Apply(vec![Expression::Word("${
|
192
|
+
head[VALUE]
|
193
|
+
}".to_string()),${tail.map(dfs).join(',')}])`
|
194
|
+
break
|
195
|
+
}
|
196
|
+
break
|
197
|
+
}
|
198
|
+
return out
|
199
|
+
}
|
200
|
+
const str = dfs(ast)
|
201
|
+
return mod
|
202
|
+
? `use crate::fez::Expression;
|
203
|
+
pub fn ${mod}() -> Expression { ${str} }`
|
204
|
+
: str
|
205
|
+
},
|
206
|
+
ocaml: (ast) => {
|
207
|
+
const dfs = (exp) => {
|
208
|
+
let out = ''
|
209
|
+
const [head, ...tail] = isLeaf(exp) ? [exp] : exp
|
210
|
+
switch (head[TYPE]) {
|
211
|
+
case WORD:
|
212
|
+
out += `Word "${head[VALUE]}"`
|
213
|
+
break
|
214
|
+
case ATOM:
|
215
|
+
{
|
216
|
+
const n = Number.isInteger(head[VALUE])
|
217
|
+
? `${head[VALUE]}.0`
|
218
|
+
: head[VALUE].toString()
|
219
|
+
out += `Atom ${head[VALUE] < 0 ? `(${n})` : n}`
|
220
|
+
}
|
221
|
+
break
|
222
|
+
case APPLY:
|
223
|
+
switch (head[VALUE]) {
|
224
|
+
case STATIC_TYPES.ABSTRACTION:
|
225
|
+
case STATIC_TYPES.COLLECTION:
|
226
|
+
case STATIC_TYPES.UNKNOWN:
|
227
|
+
case STATIC_TYPES.ATOM:
|
228
|
+
case STATIC_TYPES.BOOLEAN:
|
229
|
+
case STATIC_TYPES.ANY:
|
230
|
+
case STATIC_TYPES.NUMBER:
|
231
|
+
case STATIC_TYPES.NUMBERS:
|
232
|
+
case STATIC_TYPES.ABSTRACTIONS:
|
233
|
+
case STATIC_TYPES.BOOLEANS:
|
234
|
+
case STATIC_TYPES.COLLECTIONS:
|
235
|
+
case STATIC_TYPES.AS_NUMBER:
|
236
|
+
out += dfs(tail[0])
|
237
|
+
break
|
238
|
+
default:
|
239
|
+
out += `Apply [Word "${head[VALUE]}"; ${tail
|
240
|
+
.map(dfs)
|
241
|
+
.join('; ')}]`
|
242
|
+
break
|
243
|
+
}
|
244
|
+
|
139
245
|
break
|
140
246
|
}
|
141
247
|
return out
|