fez-lisp 1.5.179 → 1.5.181

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.179",
5
+ "version": "1.5.181",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -45,7 +45,8 @@ import {
45
45
  BOOLEAN,
46
46
  IS_ARGUMENT,
47
47
  NUMBER,
48
- NUMBER_SUBTYPE
48
+ NUMBER_SUBTYPE,
49
+ UNKNOWN_SUBTYPE
49
50
  } from './types.js'
50
51
  import {
51
52
  Brr,
@@ -161,6 +162,7 @@ export const setProp = (stats, prop, value) => {
161
162
  return (
162
163
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
163
164
  value[prop][0] !== UNKNOWN &&
165
+ value[prop][0] !== ANY &&
164
166
  ((stats[prop][0] = value[prop][0]),
165
167
  value[prop][1] && (stats[prop][1] = value[prop][1]))
166
168
  )
@@ -169,6 +171,7 @@ export const setPropToReturn = (stats, prop, value) => {
169
171
  return (
170
172
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
171
173
  value[RETURNS][0] !== UNKNOWN &&
174
+ value[RETURNS][0] !== ANY &&
172
175
  ((stats[prop][0] = value[RETURNS][0]),
173
176
  value[RETURNS][1] && (stats[prop][1] = value[RETURNS][1]))
174
177
  )
@@ -178,6 +181,7 @@ export const setPropToReturnRef = (stats, prop, value) => {
178
181
  stats[prop] &&
179
182
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
180
183
  value[RETURNS][0] !== UNKNOWN &&
184
+ value[RETURNS][0] !== ANY &&
181
185
  (stats[prop] = value[RETURNS])
182
186
  )
183
187
  }
@@ -185,6 +189,7 @@ export const setPropToType = (stats, prop, value) => {
185
189
  return (
186
190
  stats[prop] &&
187
191
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
192
+ value[TYPE_PROP][0] !== ANY &&
188
193
  ((stats[prop][0] = value[TYPE_PROP][0]),
189
194
  value[TYPE_PROP][1] && (stats[prop][1] = value[TYPE_PROP][1]))
190
195
  )
@@ -726,7 +731,12 @@ const resolveGetter = ({ rem, prop, name, env }) => {
726
731
  setPropToAtom(env[name][STATS], prop)
727
732
  setPropToSubReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
728
733
  } else if (!isAtom && isCollection) {
729
- setPropToReturn(env[name][STATS], env[array[VALUE]][STATS])
734
+ setPropToReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
735
+ // TODO: handle this nested array overwrite better
736
+ if (getSubReturn(env[array[VALUE]][STATS]).has(COLLECTION))
737
+ setPropToSubReturn(env[name][STATS], prop, {
738
+ [RETURNS]: [COLLECTION, UNKNOWN_SUBTYPE()]
739
+ })
730
740
  } else return false
731
741
  } else return false
732
742
  break
@@ -741,7 +751,12 @@ const resolveGetter = ({ rem, prop, name, env }) => {
741
751
  setPropToAtom(env[name][STATS], prop)
742
752
  setPropToSubType(env[name][STATS], prop, env[array[VALUE]][STATS])
743
753
  } else if (!isAtom && isCollection) {
744
- setPropToType(env[name][STATS], env[array[VALUE]][STATS])
754
+ setPropToType(env[name][STATS], prop, env[array[VALUE]][STATS])
755
+ // TODO: handle this nested array overwrite better
756
+ if (getSubType(env[array[VALUE]][STATS]).has(COLLECTION))
757
+ setPropToSubType(env[name][STATS], prop, {
758
+ [TYPE_PROP]: [COLLECTION, UNKNOWN_SUBTYPE()]
759
+ })
745
760
  } else return false
746
761
  } else return false
747
762
  }
@@ -824,10 +839,11 @@ const resolveReturnType = ({
824
839
  default:
825
840
  {
826
841
  if (
842
+ !GETTERS_SET.has(name) &&
827
843
  GETTERS_SET.has(returns[VALUE]) &&
828
844
  !resolveGetter({ rem, prop, name, env })
829
845
  )
830
- return once(env[name][STATS], [returns, env], stack, () => {
846
+ return retry(env[name][STATS], [returns, env], stack, () => {
831
847
  resolveReturnType({
832
848
  returns,
833
849
  rem,
@@ -1215,10 +1231,10 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
1215
1231
  }
1216
1232
  // Predicate name consistency
1217
1233
  const rightHand = rest.at(-1)
1234
+ const isApply =
1235
+ rightHand && rightHand[0] && rightHand[0][TYPE] === APPLY
1218
1236
  if (
1219
- rightHand &&
1220
- rightHand[0] &&
1221
- rightHand[0][TYPE] === APPLY &&
1237
+ isApply &&
1222
1238
  rightHand[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
1223
1239
  ) {
1224
1240
  validateLambda(rightHand, name)
@@ -1239,6 +1255,49 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
1239
1255
  retry(env[name][STATS], exp, stack, () =>
1240
1256
  check(rightHand, env, exp)
1241
1257
  )
1258
+ } else if (
1259
+ isApply &&
1260
+ rightHand[0][VALUE] === KEYWORDS.CREATE_ARRAY
1261
+ ) {
1262
+ const right = rightHand[0]
1263
+ env[name] = {
1264
+ [STATS]: {
1265
+ [TYPE_PROP]: [COLLECTION],
1266
+ [RETURNS]: [UNKNOWN],
1267
+ [SIGNATURE]: name,
1268
+ retried: 0,
1269
+ counter: 0
1270
+ }
1271
+ }
1272
+ setTypeToReturn(env[name][STATS], env[right[VALUE]][STATS])
1273
+ const resolve = () => {
1274
+ const body = rightHand
1275
+ const rem = hasBlock(body) ? body.at(-1) : body
1276
+ const returns = isLeaf(rem) ? rem : rem[0]
1277
+ resolveReturnType({
1278
+ stack,
1279
+ returns,
1280
+ rem,
1281
+ prop: TYPE_PROP,
1282
+ exp,
1283
+ env,
1284
+ name,
1285
+ check
1286
+ })
1287
+ }
1288
+ resolve()
1289
+ if (isUknownSubType(env[name][STATS]))
1290
+ stagger(stack, 'prepend', exp, () => {
1291
+ once(env[name][STATS], exp, stack, () => {
1292
+ setPropToCollection(env[name][STATS], TYPE_PROP)
1293
+ setPropToSubReturn(
1294
+ env[name][STATS],
1295
+ TYPE_PROP,
1296
+ initArrayType({ rem: rightHand, env })
1297
+ )
1298
+ })
1299
+ })
1300
+ check(rightHand, env, scope)
1242
1301
  } else {
1243
1302
  checkPredicateName(exp, rest)
1244
1303
  const isLeafNode = isLeaf(rightHand)
@@ -1455,7 +1514,7 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
1455
1514
  resolveSetter(first, rest, env, stack)
1456
1515
  // end of Var ---------------
1457
1516
  // Judgement
1458
- stagger(stack, 'append', [first, env], () => {
1517
+ const judge = () => {
1459
1518
  if (!isSpecial && env[first[VALUE]] === undefined)
1460
1519
  throw new TypeError(
1461
1520
  `Trying to call undefined (${KEYWORDS.ANONYMOUS_FUNCTION}) ${first[VALUE]} (check #9)`
@@ -1745,7 +1804,9 @@ export const typeCheck = (ast, ctx = SPECIAL_FORM_TYPES) => {
1745
1804
  }
1746
1805
  }
1747
1806
  }
1748
- })
1807
+ }
1808
+ stagger(stack, 'append', [first, env], judge)
1809
+ stagger(stack, 'prepend', [first, env], judge)
1749
1810
  for (let i = 0; i < rest.length; ++i) {
1750
1811
  const r = rest[i]
1751
1812
  if (isLeaf(r) && r[TYPE] !== ATOM)
package/src/types.js CHANGED
@@ -36,6 +36,7 @@ export const BOOLEAN_SUBTYPE = () => new Set([BOOLEAN])
36
36
  export const COLLECTION_SUBTYPE = () => new Set([COLLECTION])
37
37
  export const NUMBER_SUBTYPE = () => new Set([NUMBER])
38
38
  export const ABSTRACTION_SUBTYPE = () => new Set([APPLY])
39
+ export const UNKNOWN_SUBTYPE = () => new Set([UNKNOWN])
39
40
 
40
41
  const SPECIAL_BOOLEAN = BOOLEAN_SUBTYPE()
41
42
  const SPECIAL_COLLECTION = COLLECTION_SUBTYPE()
@@ -56,7 +57,7 @@ export const toTypeNames = (type) => {
56
57
  return 'Unknown'
57
58
  case COLLECTION:
58
59
  // return 'Array'
59
- return 'Unknowns'
60
+ return 'Unknown[]'
60
61
  case ANY:
61
62
  return 'Any'
62
63
  default:
@@ -75,13 +76,20 @@ export const toTypeCodes = (type) => {
75
76
  return [ATOM, NUMBER_SUBTYPE()]
76
77
  case 'Unknown':
77
78
  return [UNKNOWN]
79
+ case 'Unknown[]':
78
80
  case 'Unknowns':
79
81
  case 'Collection':
80
82
  return [COLLECTION, new Set([ANY])]
81
83
  case 'Numbers':
84
+ case 'Number[]':
82
85
  return [COLLECTION, NUMBER_SUBTYPE()]
83
86
  case 'Booleans':
87
+ case 'Boolean[]':
84
88
  return [COLLECTION, BOOLEAN_SUBTYPE()]
89
+ case 'Collections':
90
+ case 'Collection[]':
91
+ case 'Unknown[][]':
92
+ return [COLLECTION, COLLECTION_SUBTYPE()]
85
93
  case 'Any':
86
94
  return [ANY]
87
95
  default:
@@ -1300,7 +1308,7 @@ export const formatSubType = (T) => {
1300
1308
  )
1301
1309
  .join(' ') || toTypeNames(UNKNOWN)
1302
1310
  : toTypeNames(UNKNOWN)
1303
- }s`
1311
+ }[]`
1304
1312
  case ATOM:
1305
1313
  return `${
1306
1314
  T[1] instanceof Set