fez-lisp 1.6.58 → 1.6.60
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/package.json +1 -1
- package/src/check.js +11 -9
- package/src/keywords.js +2 -2
- package/src/types.js +22 -23
- package/src/utils.js +8 -5
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -606,7 +606,7 @@ const resolveGetter = ({ rem, prop, name, env }) => {
|
|
606
606
|
|
607
607
|
switch (array[TYPE]) {
|
608
608
|
case APPLY:
|
609
|
-
if (
|
609
|
+
if (hasSubReturn(env[array[VALUE]][STATS])) {
|
610
610
|
const rightSub = getSubReturn(env[array[VALUE]][STATS])
|
611
611
|
const isAtom = rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
|
612
612
|
const isCollection = rightSub.has(COLLECTION)
|
@@ -614,12 +614,12 @@ const resolveGetter = ({ rem, prop, name, env }) => {
|
|
614
614
|
setPropToAtom(env[name][STATS], prop)
|
615
615
|
setPropToSubReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
|
616
616
|
} else if (!isAtom && isCollection) {
|
617
|
-
setPropToReturn(env[name][STATS], prop,
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
617
|
+
setPropToReturn(env[name][STATS], prop, {
|
618
|
+
[RETURNS]: [
|
619
|
+
env[array[VALUE]][STATS][RETURNS][1].types[0],
|
620
|
+
new SubType(env[array[VALUE]][STATS][RETURNS][1].types.slice(1))
|
621
|
+
]
|
622
|
+
})
|
623
623
|
} else return false
|
624
624
|
} else return false
|
625
625
|
break
|
@@ -713,10 +713,12 @@ const resolveSetter = (first, rest, env, stack) => {
|
|
713
713
|
case APPLY:
|
714
714
|
if (env[right[VALUE]]) {
|
715
715
|
if (right[VALUE] === KEYWORDS.CREATE_ARRAY) {
|
716
|
-
|
716
|
+
const inner = initArrayType({
|
717
717
|
rem: rest.at(-1),
|
718
718
|
env
|
719
719
|
})[RETURNS][1]
|
720
|
+
current[STATS][TYPE_PROP][0] = COLLECTION
|
721
|
+
if (!inner.has(UNKNOWN)) current[STATS][TYPE_PROP][1] = inner
|
720
722
|
break
|
721
723
|
}
|
722
724
|
if (hasSubReturn(env[right[VALUE]][STATS])) {
|
@@ -782,7 +784,6 @@ const initArrayTypeRec = ({ rem, env }) => {
|
|
782
784
|
const initArrayType = ({ rem, env }) => {
|
783
785
|
const ret = initArrayTypeRec({ rem, env })
|
784
786
|
const known = ret.find((x) => x[0] !== ANY && x[0] !== UNKNOWN)
|
785
|
-
// console.log(known[0], ret[0])
|
786
787
|
if (known && ret.length) {
|
787
788
|
if (Array.isArray(ret[0][0])) {
|
788
789
|
let head = ret[0][0]
|
@@ -796,6 +797,7 @@ const initArrayType = ({ rem, env }) => {
|
|
796
797
|
if (head) subT.add(head[1].types[0])
|
797
798
|
}
|
798
799
|
const [main, sub] = ret[0]
|
800
|
+
if (isSubType(sub) && sub.types.at(-1) === COLLECTION) sub.types.pop()
|
799
801
|
return {
|
800
802
|
[TYPE_PROP]: [APPLY],
|
801
803
|
[RETURNS]: [COLLECTION, new SubType(isSubType(sub) ? [...sub] : [main])]
|
package/src/keywords.js
CHANGED
package/src/types.js
CHANGED
@@ -91,49 +91,39 @@ export const toTypeNames = (type) => {
|
|
91
91
|
return 'Atom'
|
92
92
|
case NUMBER:
|
93
93
|
return 'Number'
|
94
|
-
// case ATOM:
|
95
|
-
// return 'Atom'
|
96
94
|
case UNKNOWN:
|
97
95
|
return 'Unknown'
|
98
96
|
case COLLECTION:
|
99
|
-
// return 'Array'
|
100
97
|
return 'Unknown[]'
|
101
98
|
case ANY:
|
102
99
|
return 'Any'
|
103
100
|
default:
|
104
|
-
|
101
|
+
return 'Unknown'
|
105
102
|
}
|
106
103
|
}
|
104
|
+
|
105
|
+
export const extractArrayType = (type) => {
|
106
|
+
const arr = [...type].filter((x) => x === '[')
|
107
|
+
return [type.split('[')[0], arr.length]
|
108
|
+
}
|
109
|
+
const fillArrayType = (n) => Array.from({ length: n - 1 }).fill(COLLECTION)
|
107
110
|
export const toTypeCodes = (type) => {
|
108
|
-
|
111
|
+
const [t, n] = extractArrayType(type)
|
112
|
+
switch (t) {
|
109
113
|
case 'Abstraction':
|
110
114
|
return [APPLY]
|
111
115
|
case 'Boolean':
|
116
|
+
if (n) return [COLLECTION, new SubType(fillArrayType(n).concat(BOOLEAN))]
|
112
117
|
return [ATOM, BOOLEAN_SUBTYPE()]
|
113
118
|
case 'Atom':
|
119
|
+
if (n) return [COLLECTION, new SubType(fillArrayType(n).concat(ATOM))]
|
114
120
|
return [ATOM]
|
115
121
|
case 'Number':
|
122
|
+
if (n) return [COLLECTION, new SubType(fillArrayType(n).concat(NUMBER))]
|
116
123
|
return [ATOM, NUMBER_SUBTYPE()]
|
117
124
|
case 'Unknown':
|
125
|
+
if (n) return [COLLECTION, new SubType(fillArrayType(n))]
|
118
126
|
return [UNKNOWN]
|
119
|
-
case 'Unknown[]':
|
120
|
-
case 'Unknowns':
|
121
|
-
// case 'Collection':
|
122
|
-
return [COLLECTION, new SubType([ANY])]
|
123
|
-
case 'Numbers':
|
124
|
-
case 'Number[]':
|
125
|
-
return [COLLECTION, NUMBER_SUBTYPE()]
|
126
|
-
case 'Booleans':
|
127
|
-
case 'Boolean[]':
|
128
|
-
return [COLLECTION, BOOLEAN_SUBTYPE()]
|
129
|
-
// case 'Collections':
|
130
|
-
// case 'Collection[]':
|
131
|
-
case 'Unknown[][]':
|
132
|
-
return [COLLECTION, COLLECTION_SUBTYPE()]
|
133
|
-
case 'Boolean[][]':
|
134
|
-
return [COLLECTION, new SubType([COLLECTION, BOOLEAN])]
|
135
|
-
case 'Number[][]':
|
136
|
-
return [COLLECTION, new SubType([COLLECTION, NUMBER])]
|
137
127
|
case 'Any':
|
138
128
|
return [ANY]
|
139
129
|
default:
|
@@ -1539,3 +1529,12 @@ export const filteredDefinedTypes = (program, lib, libT) => {
|
|
1539
1529
|
export const definedTypes = (T) => fromSourceToType(T)
|
1540
1530
|
export const withStdDefinedTypes = (ast) =>
|
1541
1531
|
withCtxTypes(definedTypes(filteredDefinedTypes(ast, std, stdT)))
|
1532
|
+
|
1533
|
+
export const extractTypes = (source) => {
|
1534
|
+
let types
|
1535
|
+
const src = source.replaceAll(/\(the.+\)/g, (match, token) => {
|
1536
|
+
types = match
|
1537
|
+
return ''
|
1538
|
+
})
|
1539
|
+
return [src, types]
|
1540
|
+
}
|
package/src/utils.js
CHANGED
@@ -21,6 +21,7 @@ import { type, typeCheck, withScope } from './check.js'
|
|
21
21
|
import stdT from '../lib/baked/std-T.js'
|
22
22
|
import {
|
23
23
|
definedTypes,
|
24
|
+
extractTypes,
|
24
25
|
filteredDefinedTypes,
|
25
26
|
formatAstTypes,
|
26
27
|
withCtxTypes
|
@@ -380,8 +381,8 @@ export const init = () => {
|
|
380
381
|
console.log('Added directory src in root')
|
381
382
|
writeFileSync('./src/main.lisp', '')
|
382
383
|
console.log('Added file main.lisp in src')
|
383
|
-
writeFileSync('./src/types.lisp', '')
|
384
|
-
console.log('Added file types.lisp in src')
|
384
|
+
// writeFileSync('./src/types.lisp', '')
|
385
|
+
// console.log('Added file types.lisp in src')
|
385
386
|
writeFileSync(
|
386
387
|
'index.js',
|
387
388
|
`import { compile, enhance, parse, LISP, UTILS } from "fez-lisp";
|
@@ -406,16 +407,17 @@ export const dev = (source, types) => {
|
|
406
407
|
};
|
407
408
|
export const comp = (source) => compile(enhance(parse(source)));
|
408
409
|
const file = readFileSync("./src/main.lisp", "utf-8");
|
410
|
+
const [src, typ] = UTILS.extractTypes(file);
|
409
411
|
switch (process.argv[2]) {
|
410
412
|
case "comp":
|
411
413
|
writeFileSync(
|
412
414
|
"./src/main.js",
|
413
|
-
"var _ = " + comp(
|
415
|
+
"var _ = " + comp(src) + "; console.log(_)"
|
414
416
|
);
|
415
417
|
break;
|
416
418
|
case "dev":
|
417
419
|
default:
|
418
|
-
dev(
|
420
|
+
dev(src, typ);
|
419
421
|
break;
|
420
422
|
}
|
421
423
|
`
|
@@ -424,7 +426,7 @@ switch (process.argv[2]) {
|
|
424
426
|
console.log(
|
425
427
|
`Done!
|
426
428
|
|
427
|
-
Write code in main.lisp
|
429
|
+
Write code in main.lisp
|
428
430
|
Run node index.js with the following flags:
|
429
431
|
- dev (static type check and run time validations)
|
430
432
|
- comp (compile Fez to JavaScript file main.js)
|
@@ -440,6 +442,7 @@ That's it! You are all set!
|
|
440
442
|
}
|
441
443
|
|
442
444
|
export const UTILS = {
|
445
|
+
extractTypes,
|
443
446
|
init,
|
444
447
|
debug,
|
445
448
|
startDebug,
|