fez-lisp 1.5.98 → 1.5.100
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 +94 -96
- package/src/types.js +1 -1
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -443,117 +443,115 @@ export const typeCheck = (ast, error = true) => {
|
|
443
443
|
exp
|
444
444
|
)})`
|
445
445
|
)
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
446
|
+
const name = rest[0][VALUE]
|
447
|
+
// Predicate name consistency
|
448
|
+
const rightHand = rest.at(-1)
|
449
|
+
if (
|
450
|
+
rightHand &&
|
451
|
+
rightHand[0] &&
|
452
|
+
rightHand[0][TYPE] === APPLY &&
|
453
|
+
rightHand[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
|
454
|
+
) {
|
455
|
+
validateLambda(rightHand, name)
|
456
|
+
const n = rightHand.length
|
457
|
+
env[name] = {
|
458
|
+
[STATS]: {
|
459
|
+
[TYPE_PROP]: [APPLY],
|
460
|
+
[SIGNATURE]: name,
|
461
|
+
retried: 0,
|
462
|
+
counter: 0,
|
463
|
+
[ARG_COUNT]: n - 2,
|
464
|
+
[ARGUMENTS]: fillUknownArgs(n - 2),
|
465
|
+
[RETURNS]: [UNKNOWN]
|
466
|
+
}
|
467
|
+
}
|
450
468
|
if (
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
469
|
+
!checkReturnType({
|
470
|
+
stack,
|
471
|
+
exp,
|
472
|
+
env,
|
473
|
+
name,
|
474
|
+
errors
|
475
|
+
}) ||
|
476
|
+
(isUnknownReturn(env[name][STATS]) &&
|
477
|
+
env[name][STATS].retried < MAX_RETRY_DEFINITION)
|
455
478
|
) {
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
[STATS]: {
|
460
|
-
[TYPE_PROP]: [APPLY],
|
461
|
-
[SIGNATURE]: name,
|
462
|
-
retried: 0,
|
463
|
-
counter: 0,
|
464
|
-
[ARG_COUNT]: n - 2,
|
465
|
-
[ARGUMENTS]: fillUknownArgs(n - 2),
|
466
|
-
[RETURNS]: [UNKNOWN]
|
467
|
-
}
|
468
|
-
}
|
469
|
-
if (
|
470
|
-
!checkReturnType({
|
479
|
+
env[name][STATS].retried += 1
|
480
|
+
stack.unshift(() => {
|
481
|
+
checkReturnType({
|
471
482
|
stack,
|
472
483
|
exp,
|
473
484
|
env,
|
474
485
|
name,
|
475
486
|
errors
|
476
|
-
}) ||
|
477
|
-
(isUnknownReturn(env[name][STATS]) &&
|
478
|
-
env[name][STATS].retried < MAX_RETRY_DEFINITION)
|
479
|
-
) {
|
480
|
-
env[name][STATS].retried += 1
|
481
|
-
stack.unshift(() => {
|
482
|
-
checkReturnType({
|
483
|
-
stack,
|
484
|
-
exp,
|
485
|
-
env,
|
486
|
-
name,
|
487
|
-
errors
|
488
|
-
})
|
489
|
-
check(rightHand, env, exp)
|
490
487
|
})
|
491
488
|
check(rightHand, env, exp)
|
492
|
-
}
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
489
|
+
})
|
490
|
+
check(rightHand, env, exp)
|
491
|
+
} else check(rightHand, env, exp)
|
492
|
+
} else {
|
493
|
+
checkPredicateName(exp, rest, errors)
|
494
|
+
const isLeafNode = isLeaf(rightHand)
|
495
|
+
if (isLeafNode && rightHand[TYPE] === WORD) {
|
496
|
+
// TODO make sure this prevents the assigment all together
|
497
|
+
if (env[rest[1][VALUE]] === undefined)
|
498
|
+
errors.add(
|
499
|
+
`Trying to access undefined variable ${rest[1][VALUE]} (check #22)`
|
500
|
+
)
|
502
501
|
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
}
|
502
|
+
// Used to be checkin if it's an assigment to a special form
|
503
|
+
// but this should not cause problems
|
504
|
+
// env[name] = SPECIAL_FORMS_SET.has(rest[1][VALUE])
|
505
|
+
// ? structuredClone(env[rest[1][VALUE]])
|
506
|
+
// : env[rest[1][VALUE]]
|
507
|
+
// FULL REFF ASSIGMENT
|
508
|
+
env[name] = env[rest[1][VALUE]]
|
509
|
+
} else if (isLeafNode && rightHand[TYPE] === ATOM) {
|
510
|
+
// DECLARATION of ATOM
|
511
|
+
env[name] = {
|
512
|
+
[STATS]: {
|
513
|
+
[SIGNATURE]: name,
|
514
|
+
retried: 0,
|
515
|
+
counter: 0,
|
516
|
+
[TYPE_PROP]: [ATOM],
|
517
|
+
[RETURNS]: [ATOM]
|
520
518
|
}
|
521
|
-
}
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
519
|
+
}
|
520
|
+
} else if (rightHand[0]) {
|
521
|
+
const right = rightHand[0]
|
522
|
+
//DECLARATION
|
523
|
+
env[name] = {
|
524
|
+
[STATS]: {
|
525
|
+
retried: 0,
|
526
|
+
counter: 0,
|
527
|
+
[SIGNATURE]: name,
|
528
|
+
[TYPE_PROP]: [
|
529
|
+
isLeafNode
|
530
|
+
? right[TYPE]
|
531
|
+
: env[right[VALUE]] == undefined
|
532
|
+
? UNKNOWN
|
533
|
+
: env[right[VALUE]][STATS][RETURNS][0]
|
534
|
+
],
|
535
|
+
[RETURNS]: [UNKNOWN]
|
538
536
|
}
|
539
|
-
const body = rightHand
|
540
|
-
const rem = hasBlock(body) ? body.at(-1) : body
|
541
|
-
const returns = isLeaf(rem) ? rem : rem[0]
|
542
|
-
resolveRetunType({
|
543
|
-
stack,
|
544
|
-
returns,
|
545
|
-
rem,
|
546
|
-
prop: TYPE_PROP,
|
547
|
-
exp,
|
548
|
-
env,
|
549
|
-
name,
|
550
|
-
errors
|
551
|
-
})
|
552
537
|
}
|
553
|
-
|
538
|
+
const body = rightHand
|
539
|
+
const rem = hasBlock(body) ? body.at(-1) : body
|
540
|
+
const returns = isLeaf(rem) ? rem : rem[0]
|
541
|
+
resolveRetunType({
|
542
|
+
stack,
|
543
|
+
returns,
|
544
|
+
rem,
|
545
|
+
prop: TYPE_PROP,
|
546
|
+
exp,
|
547
|
+
env,
|
548
|
+
name,
|
549
|
+
errors
|
550
|
+
})
|
554
551
|
}
|
555
|
-
|
552
|
+
check(rightHand, env, scope)
|
556
553
|
}
|
554
|
+
Types.set(withScope(name, env), () => formatType(name, env))
|
557
555
|
break
|
558
556
|
case KEYWORDS.ANONYMOUS_FUNCTION:
|
559
557
|
validateLambda(exp)
|
package/src/types.js
CHANGED
@@ -1189,7 +1189,7 @@ export const formatType = (name, env) => {
|
|
1189
1189
|
? getType(stats) === APPLY
|
1190
1190
|
? `${isAnonymous ? '' : `(let ${name} `}(lambda ${
|
1191
1191
|
stats[ARG_COUNT] === VARIADIC
|
1192
|
-
? '... '
|
1192
|
+
? '... '
|
1193
1193
|
: stats[ARGUMENTS]?.length
|
1194
1194
|
? stats[ARGUMENTS].map(
|
1195
1195
|
(x, i) =>
|