fez-lisp 1.5.94 → 1.5.95
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 +29 -23
- package/src/types.js +12 -12
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -32,7 +32,8 @@ import {
|
|
32
32
|
MAX_ARGUMENT_RETRY,
|
33
33
|
COLLECTION,
|
34
34
|
ANY,
|
35
|
-
formatType
|
35
|
+
formatType,
|
36
|
+
ANONYMOUS_FUNCTION_TYPE_PREFIX
|
36
37
|
} from './types.js'
|
37
38
|
import {
|
38
39
|
getSuffix,
|
@@ -89,9 +90,11 @@ export const setPropToTypeRef = (stats, prop, value) =>
|
|
89
90
|
value[TYPE_PROP][0] !== UNKNOWN &&
|
90
91
|
(stats[prop] = value[TYPE_PROP])
|
91
92
|
export const setReturnToAtom = (stats) =>
|
92
|
-
isUnknownReturn(stats) && (stats[RETURNS] = ATOM)
|
93
|
+
isUnknownReturn(stats) && (stats[RETURNS][0] = ATOM)
|
93
94
|
export const setTypeToAtom = (stats) =>
|
94
|
-
isUnknownType(stats) && (stats[TYPE_PROP] = ATOM)
|
95
|
+
isUnknownType(stats) && (stats[TYPE_PROP][0] = ATOM)
|
96
|
+
export const setReturnToAbbstraction = (stats) =>
|
97
|
+
isUnknownReturn(stats) && (stats[RETURNS][0] = APPLY)
|
95
98
|
export const setTypeRef = (stats, value) =>
|
96
99
|
isUnknownType(stats) && (stats[TYPE_PROP] = value[TYPE_PROP])
|
97
100
|
export const setReturnRef = (stats, value) =>
|
@@ -228,9 +231,7 @@ const getScopeNames = (scope) => {
|
|
228
231
|
}
|
229
232
|
const withScope = (name, scope) => {
|
230
233
|
const chain = getScopeNames(scope)
|
231
|
-
return `${chain.length === 1 ? '; ' : ''}${chain
|
232
|
-
.map((x) => (Number.isInteger(+x) ? '::' : x))
|
233
|
-
.join(' ')} ${name}`
|
234
|
+
return `${chain.length === 1 ? '; ' : ''}${chain.join(' ')} ${name}`
|
234
235
|
}
|
235
236
|
export const typeCheck = (ast, error = true) => {
|
236
237
|
let scopeIndex = 0
|
@@ -369,25 +370,30 @@ export const typeCheck = (ast, error = true) => {
|
|
369
370
|
)
|
370
371
|
if (!env[returns[VALUE]]) return false
|
371
372
|
else if (getType(env[returns[VALUE]][STATS]) === APPLY) {
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
373
|
+
if (returns[TYPE] === WORD)
|
374
|
+
setReturnToAbbstraction(env[name][STATS])
|
375
|
+
else {
|
376
|
+
// ALWAYS APPLY
|
377
|
+
// rest.at(-1)[0][TYPE] === APPLY
|
378
|
+
// Here is upon application to store the result in the variable
|
379
|
+
if (isUnknownType(env[name][STATS]))
|
380
|
+
stack.unshift(() => {
|
381
|
+
setTypeToReturn(
|
382
|
+
env[name][STATS],
|
383
|
+
env[returns[VALUE]][STATS]
|
384
|
+
)
|
385
|
+
// env[name][STATS][TYPE_PROP][0] =
|
386
|
+
// env[returns[VALUE]][STATS][RETURNS][0]
|
387
|
+
// this seems to be able to be deleted
|
388
|
+
// env[name][STATS][TYPE_PROP][1] =
|
389
|
+
// env[returns[VALUE]][STATS][RETURNS][1]
|
390
|
+
})
|
391
|
+
else
|
392
|
+
setReturnRef(
|
378
393
|
env[name][STATS],
|
379
394
|
env[returns[VALUE]][STATS]
|
380
395
|
)
|
381
|
-
|
382
|
-
// env[returns[VALUE]][STATS][RETURNS][0]
|
383
|
-
// this seems to be able to be deleted
|
384
|
-
// env[name][STATS][TYPE_PROP][1] =
|
385
|
-
// env[returns[VALUE]][STATS][RETURNS][1]
|
386
|
-
})
|
387
|
-
setReturnRef(
|
388
|
-
env[name][STATS],
|
389
|
-
env[returns[VALUE]][STATS]
|
390
|
-
)
|
396
|
+
}
|
391
397
|
}
|
392
398
|
break
|
393
399
|
}
|
@@ -1035,7 +1041,7 @@ export const typeCheck = (ast, error = true) => {
|
|
1035
1041
|
else {
|
1036
1042
|
// ANONYMOUS LAMBDAS TYPE CHECKING
|
1037
1043
|
const local = Object.create(env)
|
1038
|
-
const lambdaName =
|
1044
|
+
const lambdaName = `${ANONYMOUS_FUNCTION_TYPE_PREFIX}${i}::${++scopeIndex}`
|
1039
1045
|
check(
|
1040
1046
|
[
|
1041
1047
|
[APPLY, KEYWORDS.DEFINE_VARIABLE],
|
package/src/types.js
CHANGED
@@ -19,7 +19,7 @@ export const UNKNOWN = -1
|
|
19
19
|
export const COLLECTION = 3
|
20
20
|
export const PREDICATE = 4
|
21
21
|
export const ANY = 5
|
22
|
-
|
22
|
+
export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
|
23
23
|
export const MAX_ARGUMENT_RETRY = 1
|
24
24
|
export const MAX_RETRY_DEFINITION = 10
|
25
25
|
export const toTypeNames = (type) => {
|
@@ -1167,18 +1167,18 @@ export const formatType = (name, env) => {
|
|
1167
1167
|
? `${isAnonymous ? '' : `(let ${name} `}(lambda ${
|
1168
1168
|
stats[ARG_COUNT] === VARIADIC
|
1169
1169
|
? '... ' + STATIC_TYPES.UNKNOWN
|
1170
|
-
:
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1170
|
+
: stats[ARGUMENTS]?.length
|
1171
|
+
? stats[ARGUMENTS].map(
|
1172
|
+
(x, i) =>
|
1173
|
+
`${
|
1174
|
+
getType(x[STATS]) === APPLY
|
1175
|
+
? `${formatType(i, stats[ARGUMENTS])}`
|
1176
|
+
: `${toTypeNames(getType(x[STATS]))}`
|
1177
|
+
}`
|
1178
|
+
).join(' ') + ' '
|
1179
|
+
: ''
|
1180
1180
|
// TODO format returned functions when type support is added
|
1181
|
-
}
|
1181
|
+
}(${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
|
1182
1182
|
isAnonymous ? '' : ')'
|
1183
1183
|
})`
|
1184
1184
|
: `(let ${name} ${toTypeNames(getType(stats))})`
|