fez-lisp 1.5.103 → 1.5.105

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.103",
5
+ "version": "1.5.105",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -54,6 +54,11 @@ export const identity = (name) => [
54
54
  [1, 'x']
55
55
  ]
56
56
  ]
57
+ const returnType = (rest) => {
58
+ const body = rest.at(-1)
59
+ const rem = hasBlock(body) ? body.at(-1) : body
60
+ return isLeaf(rem) ? rem : rem[0]
61
+ }
57
62
  const drillReturnType = (rest, condition) => {
58
63
  const body = rest.at(-1)
59
64
  const rem = hasBlock(body) ? body.at(-1) : body
@@ -71,64 +76,111 @@ export const isUnknownNotAnyType = (stats) =>
71
76
  stats && !isAnyType(stats) && isUnknownType(stats)
72
77
  export const isUnknownNotAnyReturn = (stats) =>
73
78
  stats && !isAnyReturn(stats) && isUnknownReturn(stats)
74
- export const castType = (stats, type) =>
75
- (stats[TYPE_PROP][0] = type[RETURNS][0])
76
- export const castReturn = (stats, type) =>
77
- (stats[RETURNS][0] = type[RETURNS][0])
79
+ export const castType = (stats, type) => {
80
+ return (stats[TYPE_PROP][0] = type[RETURNS][0])
81
+ }
82
+ export const castReturn = (stats, type) => {
83
+ return (stats[RETURNS][0] = type[RETURNS][0])
84
+ }
78
85
  export const isTypeAbstraction = (stats) => stats[TYPE_PROP] === APPLY
79
- export const setPropToAtom = (stats, prop) =>
80
- (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
81
- (stats[prop][0] = ATOM)
82
- export const setProp = (stats, prop, value) =>
83
- (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
84
- value[prop][0] !== UNKNOWN &&
85
- (stats[prop][0] = value[prop][0])
86
- export const setPropToReturn = (stats, prop, value) =>
87
- (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
88
- value[RETURNS][0] !== UNKNOWN &&
89
- (stats[prop][0] = value[RETURNS][0])
90
- export const setPropToReturnRef = (stats, prop, value) =>
91
- (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
92
- value[RETURNS][0] !== UNKNOWN &&
93
- (stats[prop] = value[RETURNS])
94
- export const setPropToType = (stats, prop, value) =>
95
- (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
96
- value[UNKNOWN][0] !== UNKNOWN &&
97
- (stats[prop][0] = value[UNKNOWN][0])
98
- export const setPropToTypeRef = (stats, prop, value) =>
99
- (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
100
- value[TYPE_PROP][0] !== UNKNOWN &&
101
- (stats[prop] = value[TYPE_PROP])
102
- export const setReturnToAtom = (stats) =>
103
- isUnknownReturn(stats) && (stats[RETURNS][0] = ATOM)
86
+ export const setPropToAtom = (stats, prop) => {
87
+ return (
88
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
89
+ (stats[prop][0] = ATOM)
90
+ )
91
+ }
92
+ export const setPropToAbstraction = (stats, prop) => {
93
+ return (
94
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
95
+ (stats[prop][0] = APPLY)
96
+ )
97
+ }
98
+ export const setProp = (stats, prop, value) => {
99
+ return (
100
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
101
+ value[prop][0] !== UNKNOWN &&
102
+ (stats[prop][0] = value[prop][0])
103
+ )
104
+ }
105
+ export const setPropToReturn = (stats, prop, value) => {
106
+ return (
107
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
108
+ value[RETURNS][0] !== UNKNOWN &&
109
+ (stats[prop][0] = value[RETURNS][0])
110
+ )
111
+ }
112
+ export const setPropToReturnRef = (stats, prop, value) => {
113
+ return (
114
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
115
+ value[RETURNS][0] !== UNKNOWN &&
116
+ (stats[prop] = value[RETURNS])
117
+ )
118
+ }
119
+ export const setPropToType = (stats, prop, value) => {
120
+ return (
121
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
122
+ (stats[prop][0] = value[TYPE_PROP][0])
123
+ )
124
+ }
125
+ export const setPropToTypeRef = (stats, prop, value) => {
126
+ return (
127
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
128
+ (stats[prop] = value[TYPE_PROP])
129
+ )
130
+ }
131
+ export const setReturnToAtom = (stats) => {
132
+ return (
133
+ (isUnknownReturn(stats) || isAnyReturn(stats)) && (stats[RETURNS][0] = ATOM)
134
+ )
135
+ }
104
136
  export const setTypeToAtom = (stats) =>
105
- isUnknownType(stats) && (stats[TYPE_PROP][0] = ATOM)
137
+ (isUnknownType(stats) || isAnyType(stats)) && (stats[TYPE_PROP][0] = ATOM)
106
138
  export const setReturnToAbbstraction = (stats) =>
107
- isUnknownReturn(stats) && (stats[RETURNS][0] = APPLY)
139
+ (isUnknownReturn(stats) || isAnyReturn(stats)) && (stats[RETURNS][0] = APPLY)
108
140
  export const setTypeRef = (stats, value) =>
109
- isUnknownType(stats) && (stats[TYPE_PROP] = value[TYPE_PROP])
110
- export const setReturnRef = (stats, value) =>
111
- isUnknownReturn(stats) && (stats[RETURNS] = value[RETURNS])
112
- export const setReturnToTypeRef = (stats, value) =>
113
- isUnknownReturn(stats) && (stats[RETURNS] = value[TYPE_PROP])
114
- export const setTypeToReturnRef = (stats, value) =>
115
- isUnknownType(stats) && (stats[TYPE_PROP] = value[RETURNS])
116
- export const setPropRef = (stats, prop, value) =>
117
- stats[prop][0] === UNKNOWN && (stats[prop] = value[prop])
118
- export const setReturn = (stats, value) =>
119
- isUnknownReturn(stats) &&
120
- !isUnknownReturn(value) &&
121
- (stats[RETURNS][0] = value[RETURNS][0])
141
+ (isUnknownType(stats) || isAnyType(stats)) &&
142
+ (stats[TYPE_PROP] = value[TYPE_PROP])
143
+ export const setReturnRef = (stats, value) => {
144
+ return (
145
+ (isUnknownReturn(stats) || isAnyReturn(stats)) &&
146
+ (stats[RETURNS] = value[RETURNS])
147
+ )
148
+ }
149
+ export const setReturnToTypeRef = (stats, value) => {
150
+ return (
151
+ (isUnknownReturn(stats) || isAnyReturn(stats)) &&
152
+ (stats[RETURNS] = value[TYPE_PROP])
153
+ )
154
+ }
155
+ export const setTypeToReturnRef = (stats, value) => {
156
+ return (
157
+ (isUnknownType(stats) || isAnyType(stats)) &&
158
+ (stats[TYPE_PROP] = value[RETURNS])
159
+ )
160
+ }
161
+ export const setPropRef = (stats, prop, value) => {
162
+ return (
163
+ (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
164
+ (stats[prop] = value[prop])
165
+ )
166
+ }
167
+ export const setReturn = (stats, value) => {
168
+ return (
169
+ isUnknownReturn(stats) &&
170
+ !isUnknownReturn(value) &&
171
+ (stats[RETURNS][0] = value[RETURNS][0])
172
+ )
173
+ }
122
174
  export const setType = (stats, value) =>
123
- isUnknownType(stats) &&
175
+ (isUnknownType(stats) || isAnyType(stats)) &&
124
176
  !isUnknownType(value) &&
125
177
  (stats[TYPE_PROP][0] = value[TYPE_PROP][0])
126
178
  export const setTypeToReturn = (stats, value) =>
127
- isUnknownType(stats) &&
179
+ (isUnknownType(stats) || isAnyType(stats)) &&
128
180
  !isUnknownReturn(value) &&
129
181
  (stats[TYPE_PROP][0] = value[RETURNS][0])
130
182
  export const setReturnToType = (stats, value) =>
131
- isUnknownReturn(stats) &&
183
+ (isUnknownReturn(stats) || isAnyReturn(stats)) &&
132
184
  !isUnknownType(value) &&
133
185
  (stats[RETURNS][0] = value[TYPE_PROP][0])
134
186
  export const isAnyReturn = (stats) => stats && stats[RETURNS][0] === ANY
@@ -173,24 +225,18 @@ const checkPredicateName = (exp, rest) => {
173
225
  )
174
226
  } else if (last[0][0] === APPLY) {
175
227
  const application = last[0]
176
- switch (application[VALUE]) {
177
- case KEYWORDS.IF:
178
- // TODO finishthis #1
179
- break
180
- default:
181
- if (
182
- getSuffix(application[VALUE]) !== PREDICATE_SUFFIX &&
183
- !PREDICATES_OUTPUT_SET.has(application[VALUE])
184
- )
185
- throw new TypeError(
186
- `Assigning predicate (ending in ?) variable (${
187
- application[VALUE]
188
- }) to another variable which is not a predicate (also ending in ?) (${stringifyArgs(
189
- exp
190
- )})`
191
- )
192
- break
193
- }
228
+ if (
229
+ application[VALUE] !== KEYWORDS.IF &&
230
+ getSuffix(application[VALUE]) !== PREDICATE_SUFFIX &&
231
+ !PREDICATES_OUTPUT_SET.has(application[VALUE])
232
+ )
233
+ throw new TypeError(
234
+ `Assigning predicate (ending in ?) variable (${
235
+ application[VALUE]
236
+ }) to another variable which is not a predicate (also ending in ?) (${stringifyArgs(
237
+ exp
238
+ )})`
239
+ )
194
240
  }
195
241
  }
196
242
  }
@@ -250,88 +296,109 @@ const retryArgs = (stats, stack, cb) => {
250
296
  stack.prepend(cb)
251
297
  }
252
298
  }
253
- const ifExpression = ({ re, env, ref }) => {
254
- if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) setReturnToAtom(ref[STATS])
299
+ const IfApplyBranch = ({ leaf, branch, re, prop, ref, env }) => {
300
+ switch (leaf[VALUE]) {
301
+ case KEYWORDS.IF:
302
+ return ifExpression({
303
+ re: re.slice(2),
304
+ env,
305
+ ref,
306
+ prop
307
+ })
308
+ case KEYWORDS.ANONYMOUS_FUNCTION:
309
+ setPropToAbstraction(ref[STATS], prop)
310
+ ref[STATS][RETURNS] = [UNKNOWN]
311
+ ref[STATS][ARG_COUNT] = re.length - 2
312
+ ref[STATS][ARGUMENTS] = fillUknownArgs(re.length - 2)
313
+ break
314
+ case KEYWORDS.CALL_FUNCTION:
315
+ if (re.at(-1)[TYPE] === WORD) {
316
+ if (env[re.at(-1)[VALUE]])
317
+ setPropToReturnRef(ref[STATS], prop, env[re.at(-1)[VALUE]][STATS])
318
+ } else {
319
+ const returns = returnType(re.at(-1))
320
+ if (env[returns[VALUE]])
321
+ IfApplyBranch({
322
+ branch: env[returns[VALUE]],
323
+ ref,
324
+ env,
325
+ prop,
326
+ leaf: re.at(-1),
327
+ re: re.at(-1).slice(2)
328
+ })
329
+ }
330
+ break
331
+ default:
332
+ return setPropToReturnRef(ref[STATS], prop, branch[STATS])
333
+ }
334
+ }
335
+ const ifExpression = ({ re, env, ref, prop }) => {
336
+ // console.log(ref, JSON.stringify(env[KEYWORDS.IF][STATS][RETURNS]))
337
+ if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM)
338
+ return setPropToAtom(ref[STATS], prop)
255
339
  // TODO check that both brancehs are predicates if one is
256
340
  else {
257
- const concequent = isLeaf(re[0]) ? env[re[0][VALUE]] : env[re[0][0][VALUE]]
258
- const alternative = isLeaf(re[1]) ? env[re[1][VALUE]] : env[re[1][0][VALUE]]
259
- // todo check if condition matches alternative
341
+ const conc = isLeaf(re[0]) ? re[0] : re[0][0]
342
+ const alt = isLeaf(re[1]) ? re[1] : re[1][0]
343
+ const concequent = env[conc[VALUE]]
344
+ const alternative = env[alt[VALUE]]
260
345
  // TODO make this more simple - it's so many different things just because types are functions or not
261
346
  // WHY not consiter making return types for everything
262
- if (concequent && getType(concequent[STATS]) !== UNKNOWN) {
263
- if (getType(concequent[STATS]) === APPLY)
264
- setReturnRef(ref[STATS], concequent[STATS])
265
- else ref[STATS][RETURNS] = concequent[STATS][TYPE_PROP]
266
- } else if (alternative && isUnknownType(alternative[STATS])) {
267
- if (getType(alternative[STATS]) === APPLY)
268
- setReturnRef(ref[STATS], alternative[STATS])
269
- else setReturnToTypeRef(ref[STATS], alternative[STATS])
270
- } else if (concequent) {
271
- if (getType(concequent[STATS]) === APPLY)
272
- setReturnRef(ref[STATS], concequent[STATS])
273
- else setReturnToTypeRef(ref[STATS], concequent[STATS])
274
- }
275
- }
276
- }
277
- const resolveApplyAssigment = (re, name, env) => {
278
- if (re[0][TYPE] === APPLY) {
279
- switch (re[0][VALUE]) {
280
- case KEYWORDS.ANONYMOUS_FUNCTION:
281
- // FN ASSIGMENT
282
- env[name][STATS][TYPE_PROP] = [APPLY]
283
- env[name][STATS][RETURNS] = [UNKNOWN]
284
- env[name][STATS][ARG_COUNT] = re.length - 2
285
- env[name][STATS][ARGUMENTS] = fillUknownArgs(re.length - 2)
286
- break
347
+ if (concequent)
348
+ if (conc[TYPE] === WORD) {
349
+ return setPropToTypeRef(ref[STATS], prop, concequent[STATS])
350
+ } else if (
351
+ conc[TYPE] === APPLY &&
352
+ getType(concequent[STATS]) === APPLY &&
353
+ // Making sure the recursive function don't look for their own return type
354
+ concequent[STATS][SIGNATURE] !== ref[STATS][SIGNATURE]
355
+ ) {
356
+ return IfApplyBranch({
357
+ leaf: conc,
358
+ branch: concequent,
359
+ re: re[0],
360
+ prop,
361
+ env,
362
+ ref
363
+ })
364
+ }
365
+ if (alternative) {
366
+ if (alt[TYPE] === WORD) {
367
+ return setPropToTypeRef(ref[STATS], prop, alternative[STATS])
368
+ } else if (
369
+ alt[TYPE] === APPLY &&
370
+ getType(alternative[STATS]) === APPLY &&
371
+ // Making sure the recursive function don't look for their own return type
372
+ alternative[STATS][SIGNATURE] !== ref[STATS][SIGNATURE]
373
+ ) {
374
+ return IfApplyBranch({
375
+ leaf: alt,
376
+ branch: alternative,
377
+ re: re[1],
378
+ prop,
379
+ env,
380
+ ref
381
+ })
382
+ }
287
383
  }
288
384
  }
289
385
  }
290
- const resolveIfAssigment = ({ rem, name, env, exp, prop }) => {
291
- const re = rem.slice(2)
292
- checkPredicateName(exp, [[WORD, name], isLeaf(re[0]) ? re[0] : re[0][0]])
293
- checkPredicateName(exp, [[WORD, name], isLeaf(re[1]) ? re[1] : re[1][0]])
294
- if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM)
295
- // ATOM ASSIGMENT
296
- setPropToAtom(env[name][STATS], prop)
297
- else if (
298
- !isLeaf(re[0]) &&
299
- env[re[0][0][VALUE]] &&
300
- !isUnknownReturn(env[re[0][0][VALUE]][STATS])
301
- ) {
302
- setPropToReturnRef(env[name][STATS], prop, env[re[0][0][VALUE]][STATS])
303
- resolveApplyAssigment(re[0], name, env)
304
- // env[name][STATS] = env[re[0][0][VALUE]][STATS]
305
- } else if (
306
- !isLeaf(re[1]) &&
307
- env[re[1][0][VALUE]] &&
308
- !isUnknownReturn(env[re[1][0][VALUE]][STATS])
309
- ) {
310
- setPropToReturnRef(env[name][STATS], prop, env[re[1][0][VALUE]][STATS])
311
- resolveApplyAssigment(re[1], name, env)
312
- } else if (env[re[0][VALUE]])
313
- // ASSIGMENT
314
- setPropRef(env[name][STATS], prop, env[re[0][VALUE]][STATS])
315
- else if (env[re[1][VALUE]])
316
- // ASSIGMENT
317
- setPropRef(env[name][STATS], prop, env[re[1][VALUE]][STATS])
318
- }
319
- const resolveCondition = ({ rem, name, env, exp }) => {
386
+ const resolveCondition = ({ rem, name, env, exp, prop }) => {
320
387
  const ret = rem[0]
321
388
  const re = rem.slice(2)
322
- resolveApplyAssigment(re, name, env)
323
389
  const ref = env[name]
324
390
  checkPredicateName(exp, [[WORD, name], isLeaf(re[0]) ? re[0] : re[0][0]])
325
391
  checkPredicateName(exp, [[WORD, name], isLeaf(re[1]) ? re[1] : re[1][0]])
326
392
  switch (ret[VALUE]) {
327
393
  case KEYWORDS.IF:
328
- ifExpression({ re, env, ref })
394
+ ifExpression({ re, env, ref, prop })
329
395
  break
330
396
  default:
331
- if (env[ret[VALUE]]) setReturnRef(ref[STATS], env[ret[VALUE]][STATS])
397
+ if (env[ret[VALUE]]) setPropRef(ref[STATS], prop, env[ret[VALUE]][STATS])
332
398
  else
333
399
  stack.append(() => {
334
- if (env[ret[VALUE]]) setReturnRef(ref[STATS], env[ret[VALUE]][STATS])
400
+ if (env[ret[VALUE]])
401
+ setPropRef(ref[STATS], prop, env[ret[VALUE]][STATS])
335
402
  })
336
403
  break
337
404
  }
@@ -344,7 +411,7 @@ const resolveRetunType = ({ returns, rem, stack, prop, exp, name, env }) => {
344
411
  } else {
345
412
  switch (returns[VALUE]) {
346
413
  case KEYWORDS.IF:
347
- resolveIfAssigment({ rem, name, env, exp, prop })
414
+ resolveCondition({ rem, name, env, exp, prop })
348
415
  break
349
416
  default:
350
417
  checkPredicateNameDeep(name, exp, exp.slice(1), returns)
@@ -574,28 +641,30 @@ export const typeCheck = (ast, error = true) => {
574
641
  setReturnToType(ref[STATS], copy[returns[VALUE]][STATS])
575
642
  )
576
643
  else {
577
- const ret = returns[0]
578
-
579
- switch (ret[VALUE]) {
580
- case KEYWORDS.IF:
581
- resolveCondition({
582
- rem: returns,
583
- name: ref[STATS][SIGNATURE],
584
- env: copy,
585
- exp,
586
- stack
587
- })
588
- break
589
- default:
590
- if (copy[ret[VALUE]])
591
- setReturnRef(ref[STATS], copy[ret[VALUE]][STATS])
592
- else
593
- stack.append(() => {
594
- if (copy[ret[VALUE]])
595
- setReturnRef(ref[STATS], copy[ret[VALUE]][STATS])
644
+ stack.append(() => {
645
+ const ret = returns[0]
646
+ switch (ret[VALUE]) {
647
+ case KEYWORDS.IF:
648
+ resolveCondition({
649
+ rem: returns,
650
+ name: ref[STATS][SIGNATURE],
651
+ env: copy,
652
+ exp,
653
+ stack,
654
+ prop: RETURNS
596
655
  })
597
- break
598
- }
656
+ break
657
+ default:
658
+ if (copy[ret[VALUE]])
659
+ setReturnRef(ref[STATS], copy[ret[VALUE]][STATS])
660
+ else
661
+ stack.append(() => {
662
+ if (copy[ret[VALUE]])
663
+ setReturnRef(ref[STATS], copy[ret[VALUE]][STATS])
664
+ })
665
+ break
666
+ }
667
+ })
599
668
  }
600
669
  // TODO overwrite return type check here
601
670
  }
@@ -782,10 +851,11 @@ export const typeCheck = (ast, error = true) => {
782
851
  // It turns out it's not possible to determine return type of function here
783
852
  // what if it's a global function used elsewhere where the return type mwould be different
784
853
  // THIS willgive lambda return types but refactor is needed still
785
- setReturn(
786
- env[name][STATS],
787
- expectedArgs[i][STATS]
788
- )
854
+ if (!SPECIAL_FORMS_SET.has(name))
855
+ setReturn(
856
+ env[name][STATS],
857
+ expectedArgs[i][STATS]
858
+ )
789
859
  break
790
860
  }
791
861
  // TODO also handle casting
@@ -849,7 +919,7 @@ export const typeCheck = (ast, error = true) => {
849
919
  getType(args[i][STATS]) !== ATOM
850
920
  ) {
851
921
  throw new TypeError(
852
- `Incorrect type of arguments ${i} for (${
922
+ `Incorrect type of argument (${i}) for (${
853
923
  first[VALUE]
854
924
  }). Expected (${toTypeNames(
855
925
  getType(args[i][STATS])
@@ -863,22 +933,50 @@ export const typeCheck = (ast, error = true) => {
863
933
  !isUnknownType(env[rest[i][VALUE]][STATS]) &&
864
934
  env[rest[i][VALUE]][STATS][ARG_COUNT] !== VARIADIC
865
935
  ) {
866
- // Handles words that are Lambdas
936
+ // if (
937
+ // getType(args[i][STATS]) !==
938
+ // getType(env[rest[i][VALUE]][STATS][ARGUMENTS][i][STATS])
939
+ // )
940
+ // // TODO this should really happen in 10 or 16
941
+ // throw new TypeError(
942
+ // `Incorrect type for argument of (${
943
+ // first[VALUE]
944
+ // }) at position (${i}). Expected (${
945
+ // STATIC_TYPES.ABSTRACTION
946
+ // }) but got (${toTypeNames(
947
+ // getType(
948
+ // env[rest[i][VALUE]][STATS][ARGUMENTS][i][STATS]
949
+ // )
950
+ // )}) (${stringifyArgs(exp)}) (check #111)`
951
+ // )
952
+ // // Handles words that are Lambdas
953
+ // else
867
954
  if (
868
955
  env[rest[i][VALUE]][STATS][ARG_COUNT] !==
869
956
  args[i][STATS][ARG_COUNT]
870
957
  ) {
871
- throw new TypeError(
872
- `Incorrect number of arguments for (${
873
- args[i][STATS][SIGNATURE]
874
- }) the (lambda) argument of (${
875
- first[VALUE]
876
- }) at position (${i}). Expected (= ${
877
- args[i][STATS][ARG_COUNT]
878
- }) but got ${
879
- env[rest[i][VALUE]][STATS][ARG_COUNT]
880
- } (${stringifyArgs(exp)}) (check #778)`
881
- )
958
+ if (args[i][STATS][ARG_COUNT] === undefined)
959
+ throw new TypeError(
960
+ `Incorrect type for argument of (${
961
+ first[VALUE]
962
+ }) at position (${i}). Expected (${
963
+ STATIC_TYPES.ABSTRACTION
964
+ }) but got (${toTypeNames(
965
+ getType(args[i][STATS])
966
+ )}) (${stringifyArgs(exp)}) (check #111)`
967
+ )
968
+ else if (getType(args[i][STATS]) === APPLY)
969
+ throw new TypeError(
970
+ `Incorrect number of arguments for (${
971
+ args[i][STATS][SIGNATURE]
972
+ }) the (lambda) argument of (${
973
+ first[VALUE]
974
+ }) at position (${i}). Expected (= ${
975
+ args[i][STATS][ARG_COUNT]
976
+ }) but got ${
977
+ env[rest[i][VALUE]][STATS][ARG_COUNT]
978
+ } (${stringifyArgs(exp)}) (check #778)`
979
+ )
882
980
  } else {
883
981
  // DEFINED LAMBDAS TYPE CHECKING
884
982
  // #C1
@@ -937,6 +1035,7 @@ export const typeCheck = (ast, error = true) => {
937
1035
  }
938
1036
  }
939
1037
  }
1038
+
940
1039
  if (
941
1040
  T === COLLECTION &&
942
1041
  env[rest[i][VALUE]] &&
@@ -945,7 +1044,7 @@ export const typeCheck = (ast, error = true) => {
945
1044
  !compareTypes(env[rest[i][VALUE]][STATS], args[i][STATS])
946
1045
  ) {
947
1046
  throw new TypeError(
948
- `Incorrect type of arguments ${i} for (${
1047
+ `Incorrect type of argument (${i}) for (${
949
1048
  first[VALUE]
950
1049
  }). Expected (${toTypeNames(
951
1050
  getType(args[i][STATS])
@@ -953,9 +1052,9 @@ export const typeCheck = (ast, error = true) => {
953
1052
  exp
954
1053
  )}) (check #30)`
955
1054
  )
956
- } else if (isUnknownType(args[i][STATS]))
1055
+ } else if (isUnknownType(args[i][STATS])) {
957
1056
  retry(args[i][STATS], stack, () => check(exp, env, scope))
958
- else if (
1057
+ } else if (
959
1058
  env[rest[i][VALUE]] &&
960
1059
  !isUnknownType(args[i][STATS]) &&
961
1060
  isUnknownType(env[rest[i][VALUE]][STATS]) &&
@@ -975,7 +1074,7 @@ export const typeCheck = (ast, error = true) => {
975
1074
  if (!isUnknownType(expected) && !isUnknownReturn(actual))
976
1075
  if (!compareTypeWithReturn(expected, actual))
977
1076
  throw new TypeError(
978
- `Incorrect type of arguments ${i} for (${
1077
+ `Incorrect type of argument (${i}) for (${
979
1078
  first[VALUE]
980
1079
  }). Expected (${toTypeNames(
981
1080
  getType(expected)
@@ -1110,7 +1209,6 @@ export const typeCheck = (ast, error = true) => {
1110
1209
  }
1111
1210
  }
1112
1211
  })
1113
-
1114
1212
  for (let i = 0; i < rest.length; ++i) {
1115
1213
  const r = rest[i]
1116
1214
  if (isLeaf(r) && r[TYPE] !== ATOM)