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 CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "fez-lisp",
3
3
  "description": "Lisp interpreted & compiled to JavaScript",
4
4
  "author": "AT290690",
5
- "version": "1.5.34",
5
+ "version": "1.5.35",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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
- if (name[name.length - 1] === PREDICATE_SUFFIX)
449
- env[name][STATS][SUBTYPE] = PREDICATE
450
- check(rest.at(-1), env, exp)
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
- const hasBlock = (body) =>
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) => {