fez-lisp 1.5.104 → 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.104",
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
@@ -863,33 +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
- if (getType(args[i][STATS]) !== APPLY)
867
- // TODO this should really happen in 10 or 16
868
- throw new TypeError(
869
- `Incorrect type for argument of (${
870
- first[VALUE]
871
- }) at position (${i}). Expected (${
872
- STATIC_TYPES.ABSTRACTION
873
- }) but got (${toTypeNames(
874
- getType(args[i][STATS])
875
- )}) (${stringifyArgs(exp)}) (check #111)`
876
- )
877
- // Handles words that are Lambdas
878
- else if (
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
954
+ if (
879
955
  env[rest[i][VALUE]][STATS][ARG_COUNT] !==
880
956
  args[i][STATS][ARG_COUNT]
881
957
  ) {
882
- throw new TypeError(
883
- `Incorrect number of arguments for (${
884
- args[i][STATS][SIGNATURE]
885
- }) the (lambda) argument of (${
886
- first[VALUE]
887
- }) at position (${i}). Expected (= ${
888
- args[i][STATS][ARG_COUNT]
889
- }) but got ${
890
- env[rest[i][VALUE]][STATS][ARG_COUNT]
891
- } (${stringifyArgs(exp)}) (check #778)`
892
- )
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
+ )
893
980
  } else {
894
981
  // DEFINED LAMBDAS TYPE CHECKING
895
982
  // #C1
@@ -1122,7 +1209,6 @@ export const typeCheck = (ast, error = true) => {
1122
1209
  }
1123
1210
  }
1124
1211
  })
1125
-
1126
1212
  for (let i = 0; i < rest.length; ++i) {
1127
1213
  const r = rest[i]
1128
1214
  if (isLeaf(r) && r[TYPE] !== ATOM)