fez-lisp 1.5.75 → 1.5.78

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.75",
5
+ "version": "1.5.78",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -20,7 +20,7 @@ import { isLeaf } from './parser.js'
20
20
  import {
21
21
  SPECIAL_FORM_TYPES,
22
22
  toTypeNames,
23
- ARGS_COUNT,
23
+ ARG_COUNT,
24
24
  VARIADIC,
25
25
  STATS,
26
26
  ARGUMENTS,
@@ -65,15 +65,28 @@ const deepLambdaReturn = (rest, condition) => {
65
65
  const rem = hasBlock(body) ? body.at(-1) : body
66
66
  return condition(rem) ? rem : deepLambdaReturn(rem, condition)
67
67
  }
68
- const assign = (a, b, i) => {
69
- a[i] = b[i]
70
- }
68
+ // const assign = (a, b, i) => {
69
+ // a[i] = b[i]
70
+ // }
71
+ const fillUknownArgs = (n) =>
72
+ Array.from({ length: n })
73
+ .fill(null)
74
+ .map(() => ({
75
+ [STATS]: {
76
+ retried: 0,
77
+ [SIGNATURE]: PLACEHOLDER,
78
+ [TYPE_PROP]: [UNKNOWN],
79
+ [RETURNS]: [UNKNOWN],
80
+ [ARGUMENTS]: [],
81
+ [ARG_COUNT]: 0
82
+ }
83
+ }))
71
84
  export const formatType = (name, env) => {
72
85
  const stats = env[name][STATS]
73
86
  return stats
74
87
  ? stats[TYPE_PROP][0] === APPLY
75
88
  ? `${name} (${
76
- stats[ARGS_COUNT] === VARIADIC
89
+ stats[ARG_COUNT] === VARIADIC
77
90
  ? '... ' + STATIC_TYPES.UNKNOWN
78
91
  : (stats[ARGUMENTS] ?? [])
79
92
  .map(
@@ -227,8 +240,10 @@ export const typeCheck = (ast) => {
227
240
  case KEYWORDS.ANONYMOUS_FUNCTION:
228
241
  // FN UKNONW ASSIGMENT
229
242
  env[name][STATS][RETURNS] = [UNKNOWN]
230
- env[name][STATS][ARGS_COUNT] =
243
+ env[name][STATS][ARG_COUNT] = re[0].length - 2
244
+ env[name][STATS][ARGUMENTS] = fillUknownArgs(
231
245
  re[0].length - 2
246
+ )
232
247
  break
233
248
  }
234
249
  }
@@ -251,8 +266,10 @@ export const typeCheck = (ast) => {
251
266
  // FN ASSIGMENT
252
267
  env[name][STATS][TYPE_PROP] = [APPLY]
253
268
  env[name][STATS][RETURNS] = [UNKNOWN]
254
- env[name][STATS][ARGS_COUNT] =
269
+ env[name][STATS][ARG_COUNT] = re[1].length - 2
270
+ env[name][STATS][ARGUMENTS] = fillUknownArgs(
255
271
  re[1].length - 2
272
+ )
256
273
  break
257
274
  }
258
275
  }
@@ -393,8 +410,8 @@ export const typeCheck = (ast) => {
393
410
  retried: 0,
394
411
  counter: 0,
395
412
  [VARIABLE_ORDER_INDEX]: env[ORDER],
396
- [ARGS_COUNT]: n - 2,
397
- [ARGUMENTS]: [],
413
+ [ARG_COUNT]: n - 2,
414
+ [ARGUMENTS]: fillUknownArgs(n - 2),
398
415
  [RETURNS]: [UNKNOWN]
399
416
  }
400
417
  }
@@ -687,14 +704,14 @@ export const typeCheck = (ast) => {
687
704
  )
688
705
  else if (
689
706
  env[first[VALUE]][STATS][TYPE_PROP][0] === APPLY &&
690
- env[first[VALUE]][STATS][ARGS_COUNT] !== VARIADIC &&
691
- env[first[VALUE]][STATS][ARGS_COUNT] !== rest.length
707
+ env[first[VALUE]][STATS][ARG_COUNT] !== VARIADIC &&
708
+ env[first[VALUE]][STATS][ARG_COUNT] !== rest.length
692
709
  ) {
693
710
  errorStack.add(
694
711
  `Incorrect number of arguments for (${
695
712
  first[VALUE]
696
713
  }). Expected (= ${
697
- env[first[VALUE]][STATS][ARGS_COUNT]
714
+ env[first[VALUE]][STATS][ARG_COUNT]
698
715
  }) but got ${rest.length} (${stringifyArgs(exp)}) (check #15)`
699
716
  )
700
717
  } else {
@@ -705,14 +722,40 @@ export const typeCheck = (ast) => {
705
722
  exp
706
723
  )}) (check #12)`
707
724
  )
708
- } else if (!env[first[VALUE]][STATS][ARGS_COUNT]) {
725
+ } else if (!env[first[VALUE]][STATS][ARG_COUNT]) {
709
726
  // TODO recursively take return type of applicaion
710
727
  if (env[first[VALUE]][STATS][RETURNS][0] === APPLY) {
711
728
  env[first[VALUE]][STATS][RETURNS] = [UNKNOWN]
712
729
  }
713
730
  // FN ASSIGMENT
714
731
  env[first[VALUE]][STATS][TYPE_PROP] = [APPLY]
715
- env[first[VALUE]][STATS][ARGS_COUNT] = rest.length
732
+ env[first[VALUE]][STATS][ARG_COUNT] = rest.length
733
+ env[first[VALUE]][STATS][ARGUMENTS] = fillUknownArgs(
734
+ rest.length
735
+ )
736
+ // ASSIGMENT of paramaters of lambda that are a lambda
737
+ for (let i = 0; i < rest.length; ++i) {
738
+ const arg = env[first[VALUE]][STATS][ARGUMENTS]
739
+ arg[i] = {
740
+ [STATS]: {
741
+ retried: 0,
742
+ [SIGNATURE]: PLACEHOLDER,
743
+ [TYPE_PROP]: [UNKNOWN],
744
+ [RETURNS]: [UNKNOWN],
745
+ [ARGUMENTS]: [],
746
+ [ARG_COUNT]: 0
747
+ }
748
+ }
749
+ switch (rest[i][TYPE]) {
750
+ case ATOM:
751
+ arg[i][STATS][TYPE_PROP][0] = ATOM
752
+ break
753
+ case WORD:
754
+ case APPLY:
755
+ arg[i][STATS] = env[rest[i][VALUE]][STATS]
756
+ break
757
+ }
758
+ }
716
759
  }
717
760
  }
718
761
 
@@ -1054,6 +1097,31 @@ export const typeCheck = (ast) => {
1054
1097
  actual[0]
1055
1098
  )}) (${stringifyArgs(exp)}) (check #16)`
1056
1099
  )
1100
+ else {
1101
+ switch (expected[0]) {
1102
+ case APPLY:
1103
+ {
1104
+ const argsN = rest[i].length - 2
1105
+ if (
1106
+ env[rest[i][0][VALUE]][STATS][SIGNATURE] ===
1107
+ KEYWORDS.ANONYMOUS_FUNCTION
1108
+ ) {
1109
+ if (argsN !== args[i][STATS][ARG_COUNT]) {
1110
+ errorStack.add(
1111
+ `Incorrect number of arguments for (${
1112
+ first[VALUE]
1113
+ }). Expected (= ${
1114
+ env[first[VALUE]][STATS][ARG_COUNT]
1115
+ }) but got ${
1116
+ rest.length
1117
+ } (${stringifyArgs(exp)}) (check #777)`
1118
+ )
1119
+ }
1120
+ }
1121
+ }
1122
+ break
1123
+ }
1124
+ }
1057
1125
  } else if (
1058
1126
  expected[0] === UNKNOWN &&
1059
1127
  args[i][STATS].retried < MAX_RETRY_DEFINITION