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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +271 -173
package/package.json
CHANGED
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
|
-
|
77
|
-
|
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
|
-
(
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
export const
|
99
|
-
(
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
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)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
)
|
185
|
-
|
186
|
-
|
187
|
-
|
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
|
254
|
-
|
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
|
258
|
-
const
|
259
|
-
|
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
|
263
|
-
if (
|
264
|
-
|
265
|
-
else
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
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
|
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]])
|
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]])
|
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
|
-
|
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
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
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
|
-
|
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
|
-
|
786
|
-
|
787
|
-
|
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
|
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
|
-
//
|
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
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
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
|
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
|
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)
|