fez-lisp 1.5.100 → 1.5.101

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/logo.svg CHANGED
@@ -1,5 +1,5 @@
1
- <svg width="61" height="79" viewBox="0 0 61 79" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M58.8257 55.7684C63.4688 62.5468 57.2431 75.2357 42.5 78C34.5 79.5 2.00013 79.4982 2 64.3957C1.99984 45.77 28.6339 50.3503 39.5543 55.7684C56.8985 61.3234 54.329 49.2038 58.8257 55.7684Z" fill="#F9B949"/>
1
+ <svg width="60" height="88" viewBox="0 0 60 88" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M56 58.4998C61.166 60.9107 63.7232 82.5984 43 86.4999C31.755 88.617 1.50018 90.3154 1.5 69C1.49978 42.7121 27.65 50.8529 43 58.4998C52 61 50.834 56.089 56 58.4998Z" fill="#F9B949"/>
3
3
  <circle cx="25.5" cy="35.5" r="25.5" fill="#F9B949"/>
4
4
  <circle cx="36.5" cy="31.5" r="2.5" fill="#1F1B1B"/>
5
5
  <circle cx="9.5" cy="21.5" r="2.5" fill="#1F1B1B"/>
@@ -9,8 +9,8 @@
9
9
  <circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
10
10
  <circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
11
11
  <circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
12
- <path d="M11.6564 26.818C17.5013 31.4502 17.7946 23.2377 23.0134 28.6252C28.2321 34.0127 30.2289 37.3689 19.8597 35.7179C9.49045 34.0669 5.8115 22.1858 11.6564 26.818Z" fill="#B44637"/>
13
- <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.94179 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
14
- <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.94179 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
12
+ <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.9418 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
13
+ <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.9418 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
15
14
  <path d="M51 15C46 13.5 54.6472 7.06417 48.8171 5" stroke="#F9B949" stroke-width="2" stroke-linecap="round"/>
15
+ <path d="M19.5 27.1883C16.1667 26.3396 12 28.635 12 28.635C12 28.635 12.4167 30.7565 17.4167 32.7045C22.4167 34.6525 27 35 27 35C27 35 22.8333 28.037 19.5 27.1883Z" fill="#B44637"/>
16
16
  </svg>
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.100",
5
+ "version": "1.5.101",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -66,6 +66,10 @@ const deepLambdaReturn = (rest, condition) => {
66
66
  const rem = hasBlock(body) ? body.at(-1) : body
67
67
  return condition(rem) ? rem : deepLambdaReturn(rem, condition)
68
68
  }
69
+ export const isUnknownNotAnyType = (stats) =>
70
+ stats && !isAnyType(stats) && isUnknownType(stats)
71
+ export const isUnknownNotAnyReturn = (stats) =>
72
+ stats && !isAnyReturn(stats) && isUnknownReturn(stats)
69
73
  export const castType = (stats, type) =>
70
74
  (stats[TYPE_PROP][0] = type[RETURNS][0])
71
75
  export const castReturn = (stats, type) =>
@@ -234,7 +238,22 @@ const withScope = (name, scope) => {
234
238
  const chain = getScopeNames(scope)
235
239
  return `${chain.length === 1 ? '; ' : ''}${chain.join(' ')} ${name}`
236
240
  }
237
-
241
+ const retry = (stats, stack, errors, cb) => {
242
+ if (
243
+ errors.size === 0 &&
244
+ (isUnknownNotAnyType(stats) || isUnknownNotAnyReturn(stats)) &&
245
+ stats.retried < MAX_RETRY_DEFINITION
246
+ ) {
247
+ stats.retried += 1
248
+ stack.unshift(() => cb())
249
+ }
250
+ }
251
+ const retryArgs = (stats, stack, errors, cb) => {
252
+ if (errors.size === 0 && stats.counter < MAX_ARGUMENT_RETRY) {
253
+ stats.counter++
254
+ stack.unshift(cb)
255
+ }
256
+ }
238
257
  const ifExpression = ({ re, env, ref }) => {
239
258
  if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) setReturnToAtom(ref[STATS])
240
259
  // TODO check that both brancehs are predicates if one is
@@ -259,6 +278,19 @@ const ifExpression = ({ re, env, ref }) => {
259
278
  }
260
279
  }
261
280
  }
281
+ const resolveApplyAssigment = (re, name, env) => {
282
+ if (re[0][TYPE] === APPLY) {
283
+ switch (re[0][VALUE]) {
284
+ case KEYWORDS.ANONYMOUS_FUNCTION:
285
+ // FN ASSIGMENT
286
+ env[name][STATS][TYPE_PROP] = [APPLY]
287
+ env[name][STATS][RETURNS] = [UNKNOWN]
288
+ env[name][STATS][ARG_COUNT] = re.length - 2
289
+ env[name][STATS][ARGUMENTS] = fillUknownArgs(re.length - 2)
290
+ break
291
+ }
292
+ }
293
+ }
262
294
  const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
263
295
  const re = rem.slice(2)
264
296
  checkPredicateName(
@@ -280,17 +312,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
280
312
  !isUnknownReturn(env[re[0][0][VALUE]][STATS])
281
313
  ) {
282
314
  setPropToReturnRef(env[name][STATS], prop, env[re[0][0][VALUE]][STATS])
283
- if (re[0][0][TYPE] === APPLY) {
284
- switch (re[0][0][VALUE]) {
285
- case KEYWORDS.ANONYMOUS_FUNCTION:
286
- // FN UKNONW ASSIGMENT
287
- env[name][STATS][TYPE_PROP] = [APPLY]
288
- env[name][STATS][RETURNS] = [UNKNOWN]
289
- env[name][STATS][ARG_COUNT] = re[0].length - 2
290
- env[name][STATS][ARGUMENTS] = fillUknownArgs(re[0].length - 2)
291
- break
292
- }
293
- }
315
+ resolveApplyAssigment(re[0], name, env)
294
316
  // env[name][STATS] = env[re[0][0][VALUE]][STATS]
295
317
  } else if (
296
318
  !isLeaf(re[1]) &&
@@ -298,17 +320,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
298
320
  !isUnknownReturn(env[re[1][0][VALUE]][STATS])
299
321
  ) {
300
322
  setPropToReturnRef(env[name][STATS], prop, env[re[1][0][VALUE]][STATS])
301
- if (re[1][0][TYPE] === APPLY) {
302
- switch (re[1][0][VALUE]) {
303
- case KEYWORDS.ANONYMOUS_FUNCTION:
304
- // FN ASSIGMENT
305
- env[name][STATS][TYPE_PROP] = [APPLY]
306
- env[name][STATS][RETURNS] = [UNKNOWN]
307
- env[name][STATS][ARG_COUNT] = re[1].length - 2
308
- env[name][STATS][ARGUMENTS] = fillUknownArgs(re[1].length - 2)
309
- break
310
- }
311
- }
323
+ resolveApplyAssigment(re[1], name, env)
312
324
  } else if (env[re[0][VALUE]])
313
325
  // ASSIGMENT
314
326
  setPropRef(env[name][STATS], prop, env[re[0][VALUE]][STATS])
@@ -319,6 +331,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
319
331
  const resolveCondition = ({ rem, name, env, exp, errors }) => {
320
332
  const ret = rem[0]
321
333
  const re = rem.slice(2)
334
+ resolveApplyAssigment(re, name, env)
322
335
  const ref = env[name]
323
336
  checkPredicateName(
324
337
  exp,
@@ -473,11 +486,9 @@ export const typeCheck = (ast, error = true) => {
473
486
  name,
474
487
  errors
475
488
  }) ||
476
- (isUnknownReturn(env[name][STATS]) &&
477
- env[name][STATS].retried < MAX_RETRY_DEFINITION)
489
+ isUnknownReturn(env[name][STATS])
478
490
  ) {
479
- env[name][STATS].retried += 1
480
- stack.unshift(() => {
491
+ retry(env[name][STATS], stack, errors, () => {
481
492
  checkReturnType({
482
493
  stack,
483
494
  exp,
@@ -498,7 +509,6 @@ export const typeCheck = (ast, error = true) => {
498
509
  errors.add(
499
510
  `Trying to access undefined variable ${rest[1][VALUE]} (check #22)`
500
511
  )
501
-
502
512
  // Used to be checkin if it's an assigment to a special form
503
513
  // but this should not cause problems
504
514
  // env[name] = SPECIAL_FORMS_SET.has(rest[1][VALUE])
@@ -519,7 +529,7 @@ export const typeCheck = (ast, error = true) => {
519
529
  }
520
530
  } else if (rightHand[0]) {
521
531
  const right = rightHand[0]
522
- //DECLARATION
532
+ // DECLARATION
523
533
  env[name] = {
524
534
  [STATS]: {
525
535
  retried: 0,
@@ -619,7 +629,6 @@ export const typeCheck = (ast, error = true) => {
619
629
  if (copy[ret[VALUE]])
620
630
  setReturnRef(ref[STATS], copy[ret[VALUE]][STATS])
621
631
  })
622
-
623
632
  break
624
633
  }
625
634
  }
@@ -929,12 +938,8 @@ export const typeCheck = (ast, error = true) => {
929
938
  getReturn(actual[STATS])
930
939
  )}) (${stringifyArgs(exp)}) (check #782)`
931
940
  )
932
- } else if (
933
- actual[STATS].retried < MAX_RETRY_DEFINITION
934
- ) {
935
- actual[STATS].retried += 1
936
- stack.unshift(() => match1())
937
- }
941
+ } else
942
+ retry(actual[STATS], stack, errors, () => match1())
938
943
  }
939
944
  match1()
940
945
  for (
@@ -962,12 +967,14 @@ export const typeCheck = (ast, error = true) => {
962
967
  getType(actual[STATS])
963
968
  )}) (${stringifyArgs(exp)}) (check #781)`
964
969
  )
965
- else if (
966
- actual[STATS].retried < MAX_RETRY_DEFINITION
967
- ) {
968
- actual[STATS].retried += 1
969
- stack.unshift(() => match2())
970
- }
970
+ else
971
+ retry(
972
+ actual[STATS],
973
+ stack,
974
+ errors,
975
+
976
+ () => match2()
977
+ )
971
978
  }
972
979
  match2()
973
980
  }
@@ -989,34 +996,27 @@ export const typeCheck = (ast, error = true) => {
989
996
  exp
990
997
  )}) (check #30)`
991
998
  )
992
- } else if (
993
- isUnknownType(args[i][STATS]) &&
994
- args[i][STATS].retried < MAX_RETRY_DEFINITION
999
+ } else if (isUnknownType(args[i][STATS]))
1000
+ retry(args[i][STATS], stack, errors, () =>
1001
+ check(exp, env, scope)
1002
+ )
1003
+ else if (
1004
+ env[rest[i][VALUE]] &&
1005
+ !isUnknownType(args[i][STATS]) &&
1006
+ isUnknownType(env[rest[i][VALUE]][STATS]) &&
1007
+ getType(args[i][STATS]) !== APPLY
995
1008
  ) {
996
- args[i][STATS].retried += 1
997
- stack.unshift(() => check(exp, env, scope))
998
- } else {
999
- if (
1000
- env[rest[i][VALUE]] &&
1001
- !isUnknownType(args[i][STATS]) &&
1002
- isUnknownType(env[rest[i][VALUE]][STATS]) &&
1003
- getType(args[i][STATS]) !== APPLY
1004
- ) {
1005
- // REFF ASSIGMENT
1006
- env[rest[i][VALUE]][STATS][TYPE_PROP] =
1007
- args[i][STATS][TYPE_PROP]
1008
- env[rest[i][VALUE]][STATS][RETURNS] =
1009
- args[i][STATS][RETURNS]
1010
- }
1009
+ // REFF ASSIGMENT
1010
+ env[rest[i][VALUE]][STATS][TYPE_PROP] =
1011
+ args[i][STATS][TYPE_PROP]
1012
+ env[rest[i][VALUE]][STATS][RETURNS] =
1013
+ args[i][STATS][RETURNS]
1011
1014
  }
1012
1015
  } else if (env[rest[i][0][VALUE]]) {
1013
1016
  const match = () => {
1014
1017
  const actual = env[rest[i][0][VALUE]][STATS]
1015
1018
  const expected = args[i][STATS]
1016
- if (args[i][STATS].counter < MAX_ARGUMENT_RETRY) {
1017
- args[i][STATS].counter++
1018
- stack.unshift(() => match())
1019
- }
1019
+ retryArgs(args[i][STATS], stack, errors, () => match())
1020
1020
  if (!isUnknownType(expected) && !isUnknownReturn(actual))
1021
1021
  if (!compareTypeWithReturn(expected, actual))
1022
1022
  errors.add(
@@ -1090,13 +1090,14 @@ export const typeCheck = (ast, error = true) => {
1090
1090
  exp
1091
1091
  )}) (check #779)`
1092
1092
  )
1093
- else if (
1094
- actual[STATS].retried <
1095
- MAX_RETRY_DEFINITION
1096
- ) {
1097
- actual[STATS].retried += 1
1098
- stack.unshift(() => match1())
1099
- }
1093
+ else
1094
+ retry(
1095
+ actual[STATS],
1096
+ stack,
1097
+ errors,
1098
+
1099
+ () => match1()
1100
+ )
1100
1101
  }
1101
1102
  match1()
1102
1103
  for (
@@ -1132,13 +1133,14 @@ export const typeCheck = (ast, error = true) => {
1132
1133
  exp
1133
1134
  )}) (check #780)`
1134
1135
  )
1135
- else if (
1136
- actual[STATS].retried <
1137
- MAX_RETRY_DEFINITION
1138
- ) {
1139
- actual[STATS].retried += 1
1140
- stack.unshift(() => match2())
1141
- }
1136
+ else
1137
+ retry(
1138
+ actual[STATS],
1139
+ stack,
1140
+ errors,
1141
+
1142
+ () => match2()
1143
+ )
1142
1144
  }
1143
1145
  match2()
1144
1146
  }
@@ -1153,19 +1155,15 @@ export const typeCheck = (ast, error = true) => {
1153
1155
  // break
1154
1156
  }
1155
1157
  }
1156
- else if (
1157
- isUnknownType(expected) &&
1158
- args[i][STATS].retried < MAX_RETRY_DEFINITION
1159
- ) {
1160
- args[i][STATS].retried += 1
1161
- stack.unshift(() => match())
1162
- }
1158
+ else if (isUnknownType(expected))
1159
+ retry(args[i][STATS], stack, errors, () => match())
1163
1160
  }
1164
1161
  match()
1165
1162
  }
1166
1163
  }
1167
1164
  }
1168
1165
  })
1166
+
1169
1167
  for (let i = 0; i < rest.length; ++i) {
1170
1168
  const r = rest[i]
1171
1169
  if (isLeaf(r) && r[TYPE] !== ATOM)
package/src/types.js CHANGED
@@ -23,7 +23,7 @@ export const PREDICATE = 4
23
23
  export const ANY = 5
24
24
  export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
25
25
  export const MAX_ARGUMENT_RETRY = 1
26
- export const MAX_RETRY_DEFINITION = 10
26
+ export const MAX_RETRY_DEFINITION = 100
27
27
  export const toTypeNames = (type) => {
28
28
  switch (type) {
29
29
  case APPLY:
@@ -42,6 +42,14 @@ export const toTypeNames = (type) => {
42
42
  break
43
43
  }
44
44
  }
45
+ export const toTypeNamesAnyToUknown = (type) => {
46
+ switch (type) {
47
+ case ANY:
48
+ return toTypeNames(UNKNOWN)
49
+ default:
50
+ return toTypeNames(type)
51
+ }
52
+ }
45
53
  export const SPECIAL_FORM_TYPES = {
46
54
  [SCOPE_NAME]: ';',
47
55
  // [ORDER]: 0,
@@ -1196,15 +1204,15 @@ export const formatType = (name, env) => {
1196
1204
  `${
1197
1205
  getType(x[STATS]) === APPLY
1198
1206
  ? `${formatType(i, stats[ARGUMENTS])}`
1199
- : `${toTypeNames(getType(x[STATS]))}`
1207
+ : `${toTypeNamesAnyToUknown(getType(x[STATS]))}`
1200
1208
  }`
1201
1209
  ).join(' ') + ' '
1202
1210
  : ''
1203
1211
  // TODO format returned functions when type support is added
1204
- }(${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
1212
+ }(${KEYWORDS.BLOCK} ${toTypeNamesAnyToUknown(getReturn(stats))})${
1205
1213
  isAnonymous ? '' : ')'
1206
1214
  })`
1207
- : `(let ${name} ${toTypeNames(getType(stats))})`
1215
+ : `(let ${name} ${toTypeNamesAnyToUknown(getType(stats))})`
1208
1216
  : name
1209
1217
  }
1210
1218