fez-lisp 1.5.136 → 1.5.138

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.136",
5
+ "version": "1.5.138",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -45,7 +45,8 @@ import {
45
45
  PREDICATE,
46
46
  IS_ARGUMENT,
47
47
  NUMBER,
48
- SETTER
48
+ SETTER,
49
+ NUMBER_SUBTYPE
49
50
  } from './types.js'
50
51
  import {
51
52
  Brr,
@@ -129,14 +130,14 @@ export const isTypeAbstraction = (stats) => stats[TYPE_PROP] === APPLY
129
130
  export const setPropToAtom = (stats, prop) => {
130
131
  return (
131
132
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
132
- (stats[prop][0] = ATOM)
133
+ ((stats[prop][0] = ATOM), (stats[prop][1] = NUMBER_SUBTYPE()))
133
134
  )
134
135
  }
135
136
  export const setPropToPredicate = (stats, prop) => {
136
137
  return (stats[prop][1] = BOOLEAN_SUBTYPE())
137
138
  }
138
139
  export const setReturnToPredicate = (stats) => {
139
- return (stats[RETURNS][0] = BOOLEAN_SUBTYPE())
140
+ return (stats[RETURNS][1] = BOOLEAN_SUBTYPE())
140
141
  }
141
142
  export const setTypeToPredicate = (stats) => {
142
143
  return (stats[RETURNS][1] = BOOLEAN_SUBTYPE())
@@ -194,11 +195,13 @@ export const setPropToTypeRef = (stats, prop, value) => {
194
195
  }
195
196
  export const setReturnToAtom = (stats) => {
196
197
  return (
197
- (isUnknownReturn(stats) || isAnyReturn(stats)) && (stats[RETURNS][0] = ATOM)
198
+ (isUnknownReturn(stats) || isAnyReturn(stats)) &&
199
+ ((stats[RETURNS][0] = ATOM), (stats[RETURNS][1] = NUMBER_SUBTYPE()))
198
200
  )
199
201
  }
200
202
  export const setTypeToAtom = (stats) =>
201
- (isUnknownType(stats) || isAnyType(stats)) && (stats[TYPE_PROP][0] = ATOM)
203
+ (isUnknownType(stats) || isAnyType(stats)) &&
204
+ ((stats[TYPE_PROP][0] = ATOM), (stats[TYPE_PROP][1] = NUMBER_SUBTYPE()))
202
205
  export const setTypeToCollection = (stats) =>
203
206
  (isUnknownType(stats) || isAnyType(stats)) &&
204
207
  (stats[TYPE_PROP][0] = COLLECTION)
@@ -221,10 +224,13 @@ export const setReturnToTypeRef = (stats, value) => {
221
224
  }
222
225
  export const setStatsRef = (a, b) => (a[STATS] = b[STATS])
223
226
  export const setTypeToReturnRef = (stats, value) => {
224
- return (
225
- (isUnknownType(stats) || isAnyType(stats)) &&
226
- (stats[TYPE_PROP] = value[RETURNS])
227
- )
227
+ // To prevent getters overwritting the array subtype
228
+ // Change main type if uknown
229
+ if (isUnknownType(stats) || isAnyType(stats))
230
+ stats[TYPE_PROP][0] = value[RETURNS][0]
231
+ // cange sub type if it doesn't have
232
+ if (!hasSubType(stats) || getSubType(stats).has(UNKNOWN))
233
+ stats[TYPE_PROP][1] = value[RETURNS][1]
228
234
  }
229
235
  export const setPropRef = (stats, prop, value) => {
230
236
  return (
@@ -421,16 +427,15 @@ const withScope = (name, scope) => {
421
427
  const chain = getScopeNames(scope)
422
428
  return `${chain.length === 1 ? '; ' : ''}${chain.join(' ')} ${name}`
423
429
  }
424
- const retry = (stats, ctx, stack, cb) => {
430
+ const retry = (stats, ctx, stack, cb, method = 'prepend') => {
425
431
  if (
426
432
  (isUnknownNotAnyType(stats) || isUnknownNotAnyReturn(stats)) &&
427
433
  stats.retried < MAX_RETRY_DEFINITION
428
434
  ) {
429
435
  stats.retried += 1
430
- stagger(stack, 'prepend', ctx, cb)
436
+ stagger(stack, method, ctx, cb)
431
437
  }
432
438
  }
433
-
434
439
  const retryArgs = (stats, ctx, stack, cb) => {
435
440
  if (stats.counter < MAX_ARGUMENT_RETRY) {
436
441
  stats.counter++
@@ -547,7 +552,7 @@ const resolveCondition = ({ rem, name, env, exp, prop }) => {
547
552
  break
548
553
  }
549
554
  }
550
- const resolveSetter = (first, rest, env) => {
555
+ const resolveSetter = (first, rest, env, stack) => {
551
556
  if (
552
557
  getSuffix(first[VALUE]) === MUTATION_SUFFIX &&
553
558
  MUTATORS_SET.has(first[VALUE]) &&
@@ -561,7 +566,7 @@ const resolveSetter = (first, rest, env) => {
561
566
  const right = isLeaf(rest.at(-1)) ? rest.at(-1) : rest.at(-1)[0]
562
567
  switch (right[TYPE]) {
563
568
  case ATOM:
564
- current[STATS][TYPE_PROP][1] = new Set([NUMBER])
569
+ current[STATS][TYPE_PROP][1] = NUMBER_SUBTYPE()
565
570
  break
566
571
  case WORD:
567
572
  if (env[right[VALUE]]) {
@@ -596,6 +601,11 @@ const resolveSetter = (first, rest, env) => {
596
601
  break
597
602
  }
598
603
  setTypeToCollection(current[STATS])
604
+ // Retry setting the sub-type if infered it out later
605
+ if (!hasSubType(current[STATS]) || getSubType(current[STATS]).has(UNKNOWN))
606
+ retry(current[STATS], [first[VALUE], rest], stack, () =>
607
+ resolveSetter(first, rest, env, stack)
608
+ )
599
609
  }
600
610
  }
601
611
  const resolveGetter = ({ rem, prop, name, env }) => {
@@ -667,11 +677,9 @@ const initArrayType = ({ rem, env }) => {
667
677
  [RETURNS]: [COLLECTION, new Set([])]
668
678
  }
669
679
  }
670
- const resolveRetunType = ({ returns, rem, stack, prop, exp, name, env }) => {
671
- if (returns[TYPE] === ATOM) {
672
- // ATOM ASSIGMENT
673
- setPropToAtom(env[name][STATS], prop)
674
- } else {
680
+ const resolveReturnType = ({ returns, rem, stack, prop, exp, name, env }) => {
681
+ if (returns[TYPE] === ATOM) setPropToAtom(env[name][STATS], prop)
682
+ else {
675
683
  switch (returns[VALUE]) {
676
684
  case KEYWORDS.CREATE_ARRAY:
677
685
  setPropToSubReturn(env[name][STATS], prop, initArrayType({ rem, env }))
@@ -686,7 +694,7 @@ const resolveRetunType = ({ returns, rem, stack, prop, exp, name, env }) => {
686
694
  !resolveGetter({ rem, prop, name, env })
687
695
  )
688
696
  return retry(env[name][STATS], [returns, env], stack, () => {
689
- resolveRetunType({
697
+ resolveReturnType({
690
698
  returns,
691
699
  rem,
692
700
  stack,
@@ -726,7 +734,7 @@ const checkReturnType = ({ exp, stack, name, env }) => {
726
734
  const body = hasApplyLambdaBlock(last) ? last.at(-1).at(-1) : last
727
735
  const rem = hasBlock(body) ? body.at(-1) : body
728
736
  const returns = isLeaf(rem) ? rem : rem[0]
729
- return resolveRetunType({
737
+ return resolveReturnType({
730
738
  returns,
731
739
  rem,
732
740
  prop: RETURNS,
@@ -1044,7 +1052,7 @@ export const typeCheck = (ast) => {
1044
1052
  const body = rightHand
1045
1053
  const rem = hasBlock(body) ? body.at(-1) : body
1046
1054
  const returns = isLeaf(rem) ? rem : rem[0]
1047
- resolveRetunType({
1055
+ resolveReturnType({
1048
1056
  stack,
1049
1057
  returns,
1050
1058
  rem,
@@ -1161,7 +1169,7 @@ export const typeCheck = (ast) => {
1161
1169
  default:
1162
1170
  // Setters are just like DEFINE_VARIABLE as they are essentially the Var case for Collections
1163
1171
  // So they MUST happen before Judgement
1164
- resolveSetter(first, rest, env)
1172
+ resolveSetter(first, rest, env, stack)
1165
1173
  // end of Var ---------------
1166
1174
  // Judgement
1167
1175
  stagger(stack, 'append', [first, env], () => {
@@ -1242,8 +1250,6 @@ export const typeCheck = (ast) => {
1242
1250
  // const PRED_TYPE = args[i][STATS][TYPE_PROP][1]
1243
1251
  const MAIN_TYPE = getType(args[i][STATS])
1244
1252
  if (MAIN_TYPE === ANY) continue
1245
- // TODO - try to merge special and non special
1246
- // REFACTORING
1247
1253
  if (first[TYPE] === APPLY) {
1248
1254
  if (isLeaf(rest[i])) {
1249
1255
  switch (rest[i][TYPE]) {
@@ -1322,7 +1328,6 @@ export const typeCheck = (ast) => {
1322
1328
  // check(exp, env, scope)
1323
1329
  // )
1324
1330
  // }
1325
-
1326
1331
  if (isSpecial)
1327
1332
  setType(env[name][STATS], args[i][STATS])
1328
1333
  }
@@ -1531,11 +1536,9 @@ export const typeCheck = (ast) => {
1531
1536
  setReturnRef(env[name][STATS], args[i][STATS])
1532
1537
  break
1533
1538
  }
1534
-
1535
1539
  match({ rest, args, i, env, scope, exp })
1536
1540
  }
1537
1541
  }
1538
- // REFACTORING
1539
1542
  }
1540
1543
  }
1541
1544
  })