fez-lisp 1.5.76 → 1.5.79

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.76",
5
+ "version": "1.5.79",
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
 
@@ -993,8 +1036,30 @@ export const typeCheck = (ast) => {
993
1036
  exp
994
1037
  )}) (check #13)`
995
1038
  )
1039
+ } else if (
1040
+ T === APPLY &&
1041
+ args[i][STATS][TYPE_PROP][0] !== UNKNOWN &&
1042
+ env[rest[i][VALUE]][STATS][TYPE_PROP][0] !== UNKNOWN &&
1043
+ env[rest[i][VALUE]][STATS][ARG_COUNT] !== VARIADIC
1044
+ ) {
1045
+ // Handles words that are Lambdas
1046
+ if (
1047
+ env[rest[i][VALUE]][STATS][ARG_COUNT] !==
1048
+ args[i][STATS][ARG_COUNT]
1049
+ ) {
1050
+ errorStack.add(
1051
+ `Incorrect number of arguments for (${
1052
+ args[i][STATS][SIGNATURE]
1053
+ }) the (lambda) argument of (${
1054
+ first[VALUE]
1055
+ }) at position (${i}). Expected (= ${
1056
+ args[i][STATS][ARG_COUNT]
1057
+ }) but got ${
1058
+ env[rest[i][VALUE]][STATS][ARG_COUNT]
1059
+ } (${stringifyArgs(exp)}) (check #778)`
1060
+ )
1061
+ }
996
1062
  }
997
-
998
1063
  if (
999
1064
  env[rest[i][VALUE]] &&
1000
1065
  env[rest[i][VALUE]][STATS][TYPE_PROP][0] !== UNKNOWN &&
@@ -1031,11 +1096,7 @@ export const typeCheck = (ast) => {
1031
1096
  args[i][STATS][RETURNS]
1032
1097
  }
1033
1098
  }
1034
- } else if (
1035
- rest[i].length &&
1036
- rest[i][0][TYPE] === APPLY &&
1037
- env[rest[i][0][VALUE]]
1038
- ) {
1099
+ } else if (env[rest[i][0][VALUE]]) {
1039
1100
  const match = () => {
1040
1101
  const actual = env[rest[i][0][VALUE]][STATS][RETURNS]
1041
1102
  const expected = args[i][STATS][TYPE_PROP]
@@ -1054,6 +1115,39 @@ export const typeCheck = (ast) => {
1054
1115
  actual[0]
1055
1116
  )}) (${stringifyArgs(exp)}) (check #16)`
1056
1117
  )
1118
+ else {
1119
+ switch (expected[0]) {
1120
+ // almost exclusively for anonymous lambdas
1121
+ case APPLY:
1122
+ {
1123
+ const argsN = rest[i].length - 2
1124
+ if (
1125
+ env[rest[i][0][VALUE]][STATS][SIGNATURE] ===
1126
+ KEYWORDS.ANONYMOUS_FUNCTION
1127
+ ) {
1128
+ if (argsN !== args[i][STATS][ARG_COUNT]) {
1129
+ errorStack.add(
1130
+ `Incorrect number of arguments for (${
1131
+ args[i][STATS][SIGNATURE]
1132
+ }) the (lambda) argument of (${
1133
+ first[VALUE]
1134
+ }) at position (${i}). Expected (= ${
1135
+ args[i][STATS][ARG_COUNT]
1136
+ }) but got ${argsN} (${stringifyArgs(
1137
+ exp
1138
+ )}) (check #777)`
1139
+ )
1140
+ }
1141
+ } else {
1142
+ // TODO fix curry: lambdas enter here as undefined
1143
+ }
1144
+ }
1145
+ break
1146
+ // case ATOM:
1147
+ // case COLLECTION:
1148
+ // break
1149
+ }
1150
+ }
1057
1151
  } else if (
1058
1152
  expected[0] === UNKNOWN &&
1059
1153
  args[i][STATS].retried < MAX_RETRY_DEFINITION
@@ -1062,7 +1156,6 @@ export const typeCheck = (ast) => {
1062
1156
  stack.unshift(() => match())
1063
1157
  }
1064
1158
  }
1065
-
1066
1159
  match()
1067
1160
  }
1068
1161
  }
@@ -1081,7 +1174,6 @@ export const typeCheck = (ast) => {
1081
1174
  )
1082
1175
  }
1083
1176
  }
1084
-
1085
1177
  check(r, env, scope)
1086
1178
  }
1087
1179
  break