fez-lisp 1.5.56 → 1.5.58
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.js +1 -1
- package/package.json +1 -1
- package/src/check.js +44 -6
- package/src/compiler.js +1 -1
- package/src/interpreter.js +1 -1
- package/src/keywords.js +1 -1
- package/src/utils.js +1 -1
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -8,6 +8,7 @@ import {
|
|
8
8
|
PLACEHOLDER,
|
9
9
|
PREDICATE_SUFFIX,
|
10
10
|
SPECIAL_FORMS_SET,
|
11
|
+
STATIC_TYPES,
|
11
12
|
STATIC_TYPES_SET,
|
12
13
|
TRUE,
|
13
14
|
TYPE,
|
@@ -80,12 +81,20 @@ const formatType = (name, env) => {
|
|
80
81
|
? `${name} (${(stats[ARGUMENTS] ?? [])
|
81
82
|
.map(
|
82
83
|
(x) =>
|
83
|
-
`${x[STATS][SIGNATURE]} ${
|
84
|
+
`${x[STATS][SIGNATURE]} ${x[STATS][TYPE_PROP].map(
|
85
|
+
toTypeNames
|
86
|
+
).join(' ')}${
|
87
|
+
x[STATS][TYPE_PROP][0] === APPLY
|
88
|
+
? ` ${toTypeNames(
|
89
|
+
x[STATS][RETURNS][1] ?? x[STATS][RETURNS][0]
|
90
|
+
)}`
|
91
|
+
: ''
|
92
|
+
}`
|
84
93
|
)
|
85
94
|
.join(' ')}) -> ${toTypeNames(
|
86
95
|
stats[RETURNS][1] ?? stats[RETURNS][0]
|
87
96
|
)}`
|
88
|
-
: `${name} ${
|
97
|
+
: `${name} ${stats[TYPE_PROP].map(toTypeNames).join(' ')}`
|
89
98
|
: name
|
90
99
|
}
|
91
100
|
const formatTypes = (env) => {
|
@@ -108,7 +117,9 @@ const getScopeNames = (scope) => {
|
|
108
117
|
}
|
109
118
|
const withScope = (name, scope) => {
|
110
119
|
const chain = getScopeNames(scope)
|
111
|
-
return `${chain
|
120
|
+
return `${chain
|
121
|
+
.map((x) => (Number.isInteger(+x) ? '~' : x))
|
122
|
+
.join(' ')} ${name}`
|
112
123
|
}
|
113
124
|
export const typeCheck = (ast) => {
|
114
125
|
const root = {
|
@@ -1245,6 +1256,32 @@ export const typeCheck = (ast) => {
|
|
1245
1256
|
errorStack.add(
|
1246
1257
|
`Trying to access undefined variable ${first[VALUE]} (check #11)`
|
1247
1258
|
)
|
1259
|
+
} else {
|
1260
|
+
const T = env[first[VALUE]][STATS]
|
1261
|
+
const isKnown = T[TYPE_PROP][0] !== UNKNOWN
|
1262
|
+
switch (first[VALUE]) {
|
1263
|
+
case 'xs':
|
1264
|
+
if (isKnown && T[TYPE_PROP][0] !== COLLECTION) {
|
1265
|
+
warningStack.add(
|
1266
|
+
`A variable named xs must be of type (${
|
1267
|
+
STATIC_TYPES.COLLECTION
|
1268
|
+
}) but got type (${toTypeNames(
|
1269
|
+
T[TYPE_PROP][0]
|
1270
|
+
)}) (check #32)`
|
1271
|
+
)
|
1272
|
+
} else T[TYPE_PROP] = [COLLECTION]
|
1273
|
+
break
|
1274
|
+
default:
|
1275
|
+
{
|
1276
|
+
const isPredicate =
|
1277
|
+
getSuffix(first[VALUE]) === PREDICATE_SUFFIX
|
1278
|
+
if (isPredicate) {
|
1279
|
+
if (isKnown) T[TYPE_PROP][1] = PREDICATE
|
1280
|
+
T[RETURNS] = [ATOM, PREDICATE]
|
1281
|
+
}
|
1282
|
+
}
|
1283
|
+
break
|
1284
|
+
}
|
1248
1285
|
}
|
1249
1286
|
})
|
1250
1287
|
}
|
@@ -1360,7 +1397,7 @@ export const typeCheck = (ast) => {
|
|
1360
1397
|
fn[STATS][RETURNS][1] !== PREDICATE
|
1361
1398
|
) {
|
1362
1399
|
warningStack.add(
|
1363
|
-
`${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (
|
1400
|
+
`${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (check #25)`
|
1364
1401
|
)
|
1365
1402
|
}
|
1366
1403
|
env[name][STATS][TYPE_PROP][0] =
|
@@ -1402,7 +1439,7 @@ export const typeCheck = (ast) => {
|
|
1402
1439
|
env[name][STATS][RETURNS][1] !== PREDICATE
|
1403
1440
|
) {
|
1404
1441
|
warningStack.add(
|
1405
|
-
`${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (
|
1442
|
+
`${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (check #7)`
|
1406
1443
|
)
|
1407
1444
|
} else if (
|
1408
1445
|
!isPredicate &&
|
@@ -1550,7 +1587,7 @@ export const typeCheck = (ast) => {
|
|
1550
1587
|
fn[STATS][RETURNS][1] !== PREDICATE
|
1551
1588
|
) {
|
1552
1589
|
warningStack.add(
|
1553
|
-
`${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (
|
1590
|
+
`${name} ends in (${PREDICATE_SUFFIX}) and is expected to return (Predicate) but it doesn't (check #25)`
|
1554
1591
|
)
|
1555
1592
|
}
|
1556
1593
|
env[name][STATS][TYPE_PROP] = fn[STATS][RETURNS]
|
@@ -1743,6 +1780,7 @@ export const typeCheck = (ast) => {
|
|
1743
1780
|
if (isLeaf(rest[i])) {
|
1744
1781
|
if (rest[i][TYPE] === WORD) {
|
1745
1782
|
if (
|
1783
|
+
!isSpecial &&
|
1746
1784
|
env[rest[i][VALUE]] &&
|
1747
1785
|
PRED_TYPE !==
|
1748
1786
|
env[rest[i][VALUE]][STATS][RETURNS][1]
|
package/src/compiler.js
CHANGED
@@ -264,7 +264,7 @@ const comp = (tree, Drill) => {
|
|
264
264
|
return `__error(${compile(tail[0], Drill)})`
|
265
265
|
}
|
266
266
|
|
267
|
-
case STATIC_TYPES.
|
267
|
+
case STATIC_TYPES.ABSTRACTION:
|
268
268
|
case STATIC_TYPES.COLLECTION:
|
269
269
|
case STATIC_TYPES.UNKNOWN:
|
270
270
|
case STATIC_TYPES.ATOM:
|
package/src/interpreter.js
CHANGED
@@ -833,7 +833,7 @@ export const keywords = {
|
|
833
833
|
throw new Error(expression.map((x) => String.fromCharCode(x)).join(''))
|
834
834
|
},
|
835
835
|
|
836
|
-
[STATIC_TYPES.
|
836
|
+
[STATIC_TYPES.ABSTRACTION]: (args, env) => evaluate(args[0], env),
|
837
837
|
[STATIC_TYPES.ATOM]: (args, env) => evaluate(args[0], env),
|
838
838
|
[STATIC_TYPES.COLLECTION]: (args, env) => evaluate(args[0], env),
|
839
839
|
[STATIC_TYPES.PREDICATE]: (args, env) => evaluate(args[0], env),
|
package/src/keywords.js
CHANGED
@@ -9,7 +9,7 @@ export const PLACEHOLDER = '.'
|
|
9
9
|
export const MUTATION_SUFFIX = '!'
|
10
10
|
export const PREDICATE_SUFFIX = '?'
|
11
11
|
export const STATIC_TYPES = {
|
12
|
-
|
12
|
+
ABSTRACTION: 'Abstraction',
|
13
13
|
UNKNOWN: 'Unknown',
|
14
14
|
ATOM: 'Atom',
|
15
15
|
COLLECTION: 'Collection',
|
package/src/utils.js
CHANGED
@@ -321,7 +321,7 @@ export const addTypeIdentities = (ast) => {
|
|
321
321
|
const temp = block.shift()
|
322
322
|
block.unshift(
|
323
323
|
temp,
|
324
|
-
identity(STATIC_TYPES.
|
324
|
+
identity(STATIC_TYPES.ABSTRACTION),
|
325
325
|
identity(STATIC_TYPES.ATOM),
|
326
326
|
identity(STATIC_TYPES.COLLECTION),
|
327
327
|
identity(STATIC_TYPES.PREDICATE),
|