fez-lisp 1.5.34 → 1.5.35
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 +60 -5
- package/src/macros.js +2 -3
- package/src/utils.js +5 -0
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -11,7 +11,7 @@ import {
|
|
11
11
|
WORD
|
12
12
|
} from './keywords.js'
|
13
13
|
import { isLeaf } from './parser.js'
|
14
|
-
import { stringifyArgs } from './utils.js'
|
14
|
+
import { hasBlock, stringifyArgs } from './utils.js'
|
15
15
|
const ARGS_COUNT = 'n'
|
16
16
|
const VARIADIC = '...'
|
17
17
|
const STATS = '__stats__'
|
@@ -395,7 +395,6 @@ export const typeCheck = (ast) => {
|
|
395
395
|
const withScope = (name, scope) => {
|
396
396
|
const chain = getScopeNames(scope)
|
397
397
|
const str = `${chain.join('_')}_${name}`
|
398
|
-
// console.log({ str })
|
399
398
|
return { str, chain }
|
400
399
|
}
|
401
400
|
|
@@ -445,9 +444,65 @@ export const typeCheck = (ast) => {
|
|
445
444
|
[ARGS]: []
|
446
445
|
}
|
447
446
|
}
|
448
|
-
|
449
|
-
|
450
|
-
|
447
|
+
const checkReturnType = () => {
|
448
|
+
if (name[name.length - 1] === PREDICATE_SUFFIX) {
|
449
|
+
env[name][STATS][RETURNS] = ATOM
|
450
|
+
env[name][STATS][SUBTYPE] = PREDICATE
|
451
|
+
} else {
|
452
|
+
const body = rest.at(-1).at(-1)
|
453
|
+
const rem = hasBlock(body) ? body.at(-1) : body
|
454
|
+
const returns = isLeaf(rem) ? rem : rem[0]
|
455
|
+
if (returns[TYPE] === ATOM) {
|
456
|
+
env[name][STATS][RETURNS] = ATOM
|
457
|
+
} else {
|
458
|
+
switch (returns[VALUE]) {
|
459
|
+
case KEYWORDS.IF:
|
460
|
+
const re = rem.slice(2)
|
461
|
+
if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM)
|
462
|
+
env[name][STATS][RETURNS] = ATOM
|
463
|
+
else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
|
464
|
+
env[name][STATS][RETURNS] =
|
465
|
+
env[re[0][0][VALUE]][STATS][RETURNS]
|
466
|
+
} else {
|
467
|
+
if (env[re[0][VALUE]])
|
468
|
+
env[name][STATS][RETURNS] =
|
469
|
+
env[re[0][VALUE]][STATS].type
|
470
|
+
else env[name][STATS][RETURNS] = UNKNOWN
|
471
|
+
}
|
472
|
+
break
|
473
|
+
default:
|
474
|
+
if (env[returns[VALUE]]) {
|
475
|
+
if (env[returns[VALUE]][STATS].type === APPLY) {
|
476
|
+
env[name][STATS][RETURNS] =
|
477
|
+
env[returns[VALUE]][STATS][RETURNS]
|
478
|
+
// env[name][STATS][SUBTYPE] =
|
479
|
+
// env[returns[VALUE]][STATS][SUBTYPE]
|
480
|
+
} else {
|
481
|
+
env[name][STATS][RETURNS] =
|
482
|
+
env[returns[VALUE]].type
|
483
|
+
}
|
484
|
+
} else {
|
485
|
+
env[name][STATS][RETURNS] = UNKNOWN
|
486
|
+
}
|
487
|
+
break
|
488
|
+
}
|
489
|
+
}
|
490
|
+
}
|
491
|
+
}
|
492
|
+
checkReturnType()
|
493
|
+
if (
|
494
|
+
env[name][STATS][RETURNS] === UNKNOWN &&
|
495
|
+
!env[name].retried
|
496
|
+
) {
|
497
|
+
env[name].retried = true
|
498
|
+
stack.unshift(() => {
|
499
|
+
checkReturnType()
|
500
|
+
check(rest.at(-1), env, exp)
|
501
|
+
})
|
502
|
+
check(rest.at(-1), env, exp)
|
503
|
+
} else {
|
504
|
+
check(rest.at(-1), env, exp)
|
505
|
+
}
|
451
506
|
} else {
|
452
507
|
if (!(name in env)) {
|
453
508
|
if (rest[1][TYPE] === WORD)
|
package/src/macros.js
CHANGED
@@ -15,7 +15,7 @@ import {
|
|
15
15
|
VALUE,
|
16
16
|
WORD
|
17
17
|
} from './keywords.js'
|
18
|
-
import { stringifyArgs } from './utils.js'
|
18
|
+
import { hasBlock, stringifyArgs } from './utils.js'
|
19
19
|
export const SUGGAR = {
|
20
20
|
// Syntactic suggars
|
21
21
|
PIPE: '|>',
|
@@ -821,8 +821,7 @@ export const replaceStrings = (source) => {
|
|
821
821
|
)
|
822
822
|
return source
|
823
823
|
}
|
824
|
-
|
825
|
-
body[0] && body[0][TYPE] === APPLY && body[0][VALUE] === KEYWORDS.BLOCK
|
824
|
+
|
826
825
|
const iron = (scope) => {
|
827
826
|
const indecies = scope
|
828
827
|
.map((x, i) => {
|
package/src/utils.js
CHANGED
@@ -190,11 +190,16 @@ const deepShake = (tree, deps, visited = new Set(), ignored = new Set()) => {
|
|
190
190
|
deepShake(deps.get(value).value, deps, visited, ignored)
|
191
191
|
}
|
192
192
|
}
|
193
|
+
|
194
|
+
export const hasBlock = (body) =>
|
195
|
+
body[0] && body[0][TYPE] === APPLY && body[0][VALUE] === KEYWORDS.BLOCK
|
196
|
+
|
193
197
|
const extractDeps = (visited, deps) =>
|
194
198
|
[...visited]
|
195
199
|
.map((x) => deps.get(x))
|
196
200
|
.sort((a, b) => a.index - b.index)
|
197
201
|
.map((x) => x.value)
|
202
|
+
|
198
203
|
const toIgnore = (ast) => {
|
199
204
|
const out = []
|
200
205
|
const dfs = (exp) => {
|