fez-lisp 1.5.99 → 1.5.101

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/logo.svg CHANGED
@@ -1,5 +1,5 @@
1
- <svg width="61" height="79" viewBox="0 0 61 79" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M58.8257 55.7684C63.4688 62.5468 57.2431 75.2357 42.5 78C34.5 79.5 2.00013 79.4982 2 64.3957C1.99984 45.77 28.6339 50.3503 39.5543 55.7684C56.8985 61.3234 54.329 49.2038 58.8257 55.7684Z" fill="#F9B949"/>
1
+ <svg width="60" height="88" viewBox="0 0 60 88" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M56 58.4998C61.166 60.9107 63.7232 82.5984 43 86.4999C31.755 88.617 1.50018 90.3154 1.5 69C1.49978 42.7121 27.65 50.8529 43 58.4998C52 61 50.834 56.089 56 58.4998Z" fill="#F9B949"/>
3
3
  <circle cx="25.5" cy="35.5" r="25.5" fill="#F9B949"/>
4
4
  <circle cx="36.5" cy="31.5" r="2.5" fill="#1F1B1B"/>
5
5
  <circle cx="9.5" cy="21.5" r="2.5" fill="#1F1B1B"/>
@@ -9,8 +9,8 @@
9
9
  <circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
10
10
  <circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
11
11
  <circle cx="37" cy="31" r="1" fill="#EBEBEB"/>
12
- <path d="M11.6564 26.818C17.5013 31.4502 17.7946 23.2377 23.0134 28.6252C28.2321 34.0127 30.2289 37.3689 19.8597 35.7179C9.49045 34.0669 5.8115 22.1858 11.6564 26.818Z" fill="#B44637"/>
13
- <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.94179 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
14
- <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.94179 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
12
+ <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.9418 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
13
+ <path d="M49.8808 7.37404C50.5137 5.27388 40.491 0.514532 39.3766 1.22816C38.2623 1.9418 33.2308 11.7323 33.2308 11.7323L43.7349 17.8782C43.7349 17.8782 49.2479 9.47421 49.8808 7.37404Z" fill="#B44637"/>
15
14
  <path d="M51 15C46 13.5 54.6472 7.06417 48.8171 5" stroke="#F9B949" stroke-width="2" stroke-linecap="round"/>
15
+ <path d="M19.5 27.1883C16.1667 26.3396 12 28.635 12 28.635C12 28.635 12.4167 30.7565 17.4167 32.7045C22.4167 34.6525 27 35 27 35C27 35 22.8333 28.037 19.5 27.1883Z" fill="#B44637"/>
16
16
  </svg>
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.99",
5
+ "version": "1.5.101",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -66,6 +66,10 @@ const deepLambdaReturn = (rest, condition) => {
66
66
  const rem = hasBlock(body) ? body.at(-1) : body
67
67
  return condition(rem) ? rem : deepLambdaReturn(rem, condition)
68
68
  }
69
+ export const isUnknownNotAnyType = (stats) =>
70
+ stats && !isAnyType(stats) && isUnknownType(stats)
71
+ export const isUnknownNotAnyReturn = (stats) =>
72
+ stats && !isAnyReturn(stats) && isUnknownReturn(stats)
69
73
  export const castType = (stats, type) =>
70
74
  (stats[TYPE_PROP][0] = type[RETURNS][0])
71
75
  export const castReturn = (stats, type) =>
@@ -234,7 +238,22 @@ const withScope = (name, scope) => {
234
238
  const chain = getScopeNames(scope)
235
239
  return `${chain.length === 1 ? '; ' : ''}${chain.join(' ')} ${name}`
236
240
  }
237
-
241
+ const retry = (stats, stack, errors, cb) => {
242
+ if (
243
+ errors.size === 0 &&
244
+ (isUnknownNotAnyType(stats) || isUnknownNotAnyReturn(stats)) &&
245
+ stats.retried < MAX_RETRY_DEFINITION
246
+ ) {
247
+ stats.retried += 1
248
+ stack.unshift(() => cb())
249
+ }
250
+ }
251
+ const retryArgs = (stats, stack, errors, cb) => {
252
+ if (errors.size === 0 && stats.counter < MAX_ARGUMENT_RETRY) {
253
+ stats.counter++
254
+ stack.unshift(cb)
255
+ }
256
+ }
238
257
  const ifExpression = ({ re, env, ref }) => {
239
258
  if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) setReturnToAtom(ref[STATS])
240
259
  // TODO check that both brancehs are predicates if one is
@@ -259,6 +278,19 @@ const ifExpression = ({ re, env, ref }) => {
259
278
  }
260
279
  }
261
280
  }
281
+ const resolveApplyAssigment = (re, name, env) => {
282
+ if (re[0][TYPE] === APPLY) {
283
+ switch (re[0][VALUE]) {
284
+ case KEYWORDS.ANONYMOUS_FUNCTION:
285
+ // FN ASSIGMENT
286
+ env[name][STATS][TYPE_PROP] = [APPLY]
287
+ env[name][STATS][RETURNS] = [UNKNOWN]
288
+ env[name][STATS][ARG_COUNT] = re.length - 2
289
+ env[name][STATS][ARGUMENTS] = fillUknownArgs(re.length - 2)
290
+ break
291
+ }
292
+ }
293
+ }
262
294
  const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
263
295
  const re = rem.slice(2)
264
296
  checkPredicateName(
@@ -280,17 +312,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
280
312
  !isUnknownReturn(env[re[0][0][VALUE]][STATS])
281
313
  ) {
282
314
  setPropToReturnRef(env[name][STATS], prop, env[re[0][0][VALUE]][STATS])
283
- if (re[0][0][TYPE] === APPLY) {
284
- switch (re[0][0][VALUE]) {
285
- case KEYWORDS.ANONYMOUS_FUNCTION:
286
- // FN UKNONW ASSIGMENT
287
- env[name][STATS][TYPE_PROP] = [APPLY]
288
- env[name][STATS][RETURNS] = [UNKNOWN]
289
- env[name][STATS][ARG_COUNT] = re[0].length - 2
290
- env[name][STATS][ARGUMENTS] = fillUknownArgs(re[0].length - 2)
291
- break
292
- }
293
- }
315
+ resolveApplyAssigment(re[0], name, env)
294
316
  // env[name][STATS] = env[re[0][0][VALUE]][STATS]
295
317
  } else if (
296
318
  !isLeaf(re[1]) &&
@@ -298,17 +320,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
298
320
  !isUnknownReturn(env[re[1][0][VALUE]][STATS])
299
321
  ) {
300
322
  setPropToReturnRef(env[name][STATS], prop, env[re[1][0][VALUE]][STATS])
301
- if (re[1][0][TYPE] === APPLY) {
302
- switch (re[1][0][VALUE]) {
303
- case KEYWORDS.ANONYMOUS_FUNCTION:
304
- // FN ASSIGMENT
305
- env[name][STATS][TYPE_PROP] = [APPLY]
306
- env[name][STATS][RETURNS] = [UNKNOWN]
307
- env[name][STATS][ARG_COUNT] = re[1].length - 2
308
- env[name][STATS][ARGUMENTS] = fillUknownArgs(re[1].length - 2)
309
- break
310
- }
311
- }
323
+ resolveApplyAssigment(re[1], name, env)
312
324
  } else if (env[re[0][VALUE]])
313
325
  // ASSIGMENT
314
326
  setPropRef(env[name][STATS], prop, env[re[0][VALUE]][STATS])
@@ -319,6 +331,7 @@ const resolveIfAssigment = ({ rem, name, env, exp, errors, prop }) => {
319
331
  const resolveCondition = ({ rem, name, env, exp, errors }) => {
320
332
  const ret = rem[0]
321
333
  const re = rem.slice(2)
334
+ resolveApplyAssigment(re, name, env)
322
335
  const ref = env[name]
323
336
  checkPredicateName(
324
337
  exp,
@@ -443,117 +456,112 @@ export const typeCheck = (ast, error = true) => {
443
456
  exp
444
457
  )})`
445
458
  )
446
- else {
447
- const name = rest[0][VALUE]
448
- // Predicate name consistency
449
- const rightHand = rest.at(-1)
459
+ const name = rest[0][VALUE]
460
+ // Predicate name consistency
461
+ const rightHand = rest.at(-1)
462
+ if (
463
+ rightHand &&
464
+ rightHand[0] &&
465
+ rightHand[0][TYPE] === APPLY &&
466
+ rightHand[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
467
+ ) {
468
+ validateLambda(rightHand, name)
469
+ const n = rightHand.length
470
+ env[name] = {
471
+ [STATS]: {
472
+ [TYPE_PROP]: [APPLY],
473
+ [SIGNATURE]: name,
474
+ retried: 0,
475
+ counter: 0,
476
+ [ARG_COUNT]: n - 2,
477
+ [ARGUMENTS]: fillUknownArgs(n - 2),
478
+ [RETURNS]: [UNKNOWN]
479
+ }
480
+ }
450
481
  if (
451
- rightHand &&
452
- rightHand[0] &&
453
- rightHand[0][TYPE] === APPLY &&
454
- rightHand[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
482
+ !checkReturnType({
483
+ stack,
484
+ exp,
485
+ env,
486
+ name,
487
+ errors
488
+ }) ||
489
+ isUnknownReturn(env[name][STATS])
455
490
  ) {
456
- validateLambda(rightHand, name)
457
- const n = rightHand.length
458
- env[name] = {
459
- [STATS]: {
460
- [TYPE_PROP]: [APPLY],
461
- [SIGNATURE]: name,
462
- retried: 0,
463
- counter: 0,
464
- [ARG_COUNT]: n - 2,
465
- [ARGUMENTS]: fillUknownArgs(n - 2),
466
- [RETURNS]: [UNKNOWN]
467
- }
468
- }
469
- if (
470
- !checkReturnType({
491
+ retry(env[name][STATS], stack, errors, () => {
492
+ checkReturnType({
471
493
  stack,
472
494
  exp,
473
495
  env,
474
496
  name,
475
497
  errors
476
- }) ||
477
- (isUnknownReturn(env[name][STATS]) &&
478
- env[name][STATS].retried < MAX_RETRY_DEFINITION)
479
- ) {
480
- env[name][STATS].retried += 1
481
- stack.unshift(() => {
482
- checkReturnType({
483
- stack,
484
- exp,
485
- env,
486
- name,
487
- errors
488
- })
489
- check(rightHand, env, exp)
490
498
  })
491
499
  check(rightHand, env, exp)
492
- } else check(rightHand, env, exp)
493
- } else {
494
- checkPredicateName(exp, rest, errors)
495
- const isLeafNode = isLeaf(rightHand)
496
- if (isLeafNode && rightHand[TYPE] === WORD) {
497
- // TODO make sure this prevents the assigment all together
498
- if (env[rest[1][VALUE]] === undefined)
499
- errors.add(
500
- `Trying to access undefined variable ${rest[1][VALUE]} (check #22)`
501
- )
502
-
503
- // Used to be checkin if it's an assigment to a special form
504
- // but this should not cause problems
505
- // env[name] = SPECIAL_FORMS_SET.has(rest[1][VALUE])
506
- // ? structuredClone(env[rest[1][VALUE]])
507
- // : env[rest[1][VALUE]]
508
- // FULL REFF ASSIGMENT
509
- env[name] = env[rest[1][VALUE]]
510
- } else if (isLeafNode && rightHand[TYPE] === ATOM) {
511
- // DECLARATION of ATOM
512
- env[name] = {
513
- [STATS]: {
514
- [SIGNATURE]: name,
515
- retried: 0,
516
- counter: 0,
517
- [TYPE_PROP]: [ATOM],
518
- [RETURNS]: [ATOM]
519
- }
500
+ })
501
+ check(rightHand, env, exp)
502
+ } else check(rightHand, env, exp)
503
+ } else {
504
+ checkPredicateName(exp, rest, errors)
505
+ const isLeafNode = isLeaf(rightHand)
506
+ if (isLeafNode && rightHand[TYPE] === WORD) {
507
+ // TODO make sure this prevents the assigment all together
508
+ if (env[rest[1][VALUE]] === undefined)
509
+ errors.add(
510
+ `Trying to access undefined variable ${rest[1][VALUE]} (check #22)`
511
+ )
512
+ // Used to be checkin if it's an assigment to a special form
513
+ // but this should not cause problems
514
+ // env[name] = SPECIAL_FORMS_SET.has(rest[1][VALUE])
515
+ // ? structuredClone(env[rest[1][VALUE]])
516
+ // : env[rest[1][VALUE]]
517
+ // FULL REFF ASSIGMENT
518
+ env[name] = env[rest[1][VALUE]]
519
+ } else if (isLeafNode && rightHand[TYPE] === ATOM) {
520
+ // DECLARATION of ATOM
521
+ env[name] = {
522
+ [STATS]: {
523
+ [SIGNATURE]: name,
524
+ retried: 0,
525
+ counter: 0,
526
+ [TYPE_PROP]: [ATOM],
527
+ [RETURNS]: [ATOM]
520
528
  }
521
- } else if (rightHand[0]) {
522
- const right = rightHand[0]
523
- //DECLARATION
524
- env[name] = {
525
- [STATS]: {
526
- retried: 0,
527
- counter: 0,
528
- [SIGNATURE]: name,
529
- [TYPE_PROP]: [
530
- isLeafNode
531
- ? right[TYPE]
532
- : env[right[VALUE]] == undefined
533
- ? UNKNOWN
534
- : env[right[VALUE]][STATS][RETURNS][0]
535
- ],
536
- [RETURNS]: [UNKNOWN]
537
- }
529
+ }
530
+ } else if (rightHand[0]) {
531
+ const right = rightHand[0]
532
+ // DECLARATION
533
+ env[name] = {
534
+ [STATS]: {
535
+ retried: 0,
536
+ counter: 0,
537
+ [SIGNATURE]: name,
538
+ [TYPE_PROP]: [
539
+ isLeafNode
540
+ ? right[TYPE]
541
+ : env[right[VALUE]] == undefined
542
+ ? UNKNOWN
543
+ : env[right[VALUE]][STATS][RETURNS][0]
544
+ ],
545
+ [RETURNS]: [UNKNOWN]
538
546
  }
539
- const body = rightHand
540
- const rem = hasBlock(body) ? body.at(-1) : body
541
- const returns = isLeaf(rem) ? rem : rem[0]
542
- resolveRetunType({
543
- stack,
544
- returns,
545
- rem,
546
- prop: TYPE_PROP,
547
- exp,
548
- env,
549
- name,
550
- errors
551
- })
552
547
  }
553
- check(rightHand, env, scope)
548
+ const body = rightHand
549
+ const rem = hasBlock(body) ? body.at(-1) : body
550
+ const returns = isLeaf(rem) ? rem : rem[0]
551
+ resolveRetunType({
552
+ stack,
553
+ returns,
554
+ rem,
555
+ prop: TYPE_PROP,
556
+ exp,
557
+ env,
558
+ name,
559
+ errors
560
+ })
554
561
  }
555
- Types.set(withScope(name, env), () => formatType(name, env))
562
+ check(rightHand, env, scope)
556
563
  }
564
+ Types.set(withScope(name, env), () => formatType(name, env))
557
565
  break
558
566
  case KEYWORDS.ANONYMOUS_FUNCTION:
559
567
  validateLambda(exp)
@@ -621,7 +629,6 @@ export const typeCheck = (ast, error = true) => {
621
629
  if (copy[ret[VALUE]])
622
630
  setReturnRef(ref[STATS], copy[ret[VALUE]][STATS])
623
631
  })
624
-
625
632
  break
626
633
  }
627
634
  }
@@ -931,12 +938,8 @@ export const typeCheck = (ast, error = true) => {
931
938
  getReturn(actual[STATS])
932
939
  )}) (${stringifyArgs(exp)}) (check #782)`
933
940
  )
934
- } else if (
935
- actual[STATS].retried < MAX_RETRY_DEFINITION
936
- ) {
937
- actual[STATS].retried += 1
938
- stack.unshift(() => match1())
939
- }
941
+ } else
942
+ retry(actual[STATS], stack, errors, () => match1())
940
943
  }
941
944
  match1()
942
945
  for (
@@ -964,12 +967,14 @@ export const typeCheck = (ast, error = true) => {
964
967
  getType(actual[STATS])
965
968
  )}) (${stringifyArgs(exp)}) (check #781)`
966
969
  )
967
- else if (
968
- actual[STATS].retried < MAX_RETRY_DEFINITION
969
- ) {
970
- actual[STATS].retried += 1
971
- stack.unshift(() => match2())
972
- }
970
+ else
971
+ retry(
972
+ actual[STATS],
973
+ stack,
974
+ errors,
975
+
976
+ () => match2()
977
+ )
973
978
  }
974
979
  match2()
975
980
  }
@@ -991,34 +996,27 @@ export const typeCheck = (ast, error = true) => {
991
996
  exp
992
997
  )}) (check #30)`
993
998
  )
994
- } else if (
995
- isUnknownType(args[i][STATS]) &&
996
- args[i][STATS].retried < MAX_RETRY_DEFINITION
999
+ } else if (isUnknownType(args[i][STATS]))
1000
+ retry(args[i][STATS], stack, errors, () =>
1001
+ check(exp, env, scope)
1002
+ )
1003
+ else if (
1004
+ env[rest[i][VALUE]] &&
1005
+ !isUnknownType(args[i][STATS]) &&
1006
+ isUnknownType(env[rest[i][VALUE]][STATS]) &&
1007
+ getType(args[i][STATS]) !== APPLY
997
1008
  ) {
998
- args[i][STATS].retried += 1
999
- stack.unshift(() => check(exp, env, scope))
1000
- } else {
1001
- if (
1002
- env[rest[i][VALUE]] &&
1003
- !isUnknownType(args[i][STATS]) &&
1004
- isUnknownType(env[rest[i][VALUE]][STATS]) &&
1005
- getType(args[i][STATS]) !== APPLY
1006
- ) {
1007
- // REFF ASSIGMENT
1008
- env[rest[i][VALUE]][STATS][TYPE_PROP] =
1009
- args[i][STATS][TYPE_PROP]
1010
- env[rest[i][VALUE]][STATS][RETURNS] =
1011
- args[i][STATS][RETURNS]
1012
- }
1009
+ // REFF ASSIGMENT
1010
+ env[rest[i][VALUE]][STATS][TYPE_PROP] =
1011
+ args[i][STATS][TYPE_PROP]
1012
+ env[rest[i][VALUE]][STATS][RETURNS] =
1013
+ args[i][STATS][RETURNS]
1013
1014
  }
1014
1015
  } else if (env[rest[i][0][VALUE]]) {
1015
1016
  const match = () => {
1016
1017
  const actual = env[rest[i][0][VALUE]][STATS]
1017
1018
  const expected = args[i][STATS]
1018
- if (args[i][STATS].counter < MAX_ARGUMENT_RETRY) {
1019
- args[i][STATS].counter++
1020
- stack.unshift(() => match())
1021
- }
1019
+ retryArgs(args[i][STATS], stack, errors, () => match())
1022
1020
  if (!isUnknownType(expected) && !isUnknownReturn(actual))
1023
1021
  if (!compareTypeWithReturn(expected, actual))
1024
1022
  errors.add(
@@ -1092,13 +1090,14 @@ export const typeCheck = (ast, error = true) => {
1092
1090
  exp
1093
1091
  )}) (check #779)`
1094
1092
  )
1095
- else if (
1096
- actual[STATS].retried <
1097
- MAX_RETRY_DEFINITION
1098
- ) {
1099
- actual[STATS].retried += 1
1100
- stack.unshift(() => match1())
1101
- }
1093
+ else
1094
+ retry(
1095
+ actual[STATS],
1096
+ stack,
1097
+ errors,
1098
+
1099
+ () => match1()
1100
+ )
1102
1101
  }
1103
1102
  match1()
1104
1103
  for (
@@ -1134,13 +1133,14 @@ export const typeCheck = (ast, error = true) => {
1134
1133
  exp
1135
1134
  )}) (check #780)`
1136
1135
  )
1137
- else if (
1138
- actual[STATS].retried <
1139
- MAX_RETRY_DEFINITION
1140
- ) {
1141
- actual[STATS].retried += 1
1142
- stack.unshift(() => match2())
1143
- }
1136
+ else
1137
+ retry(
1138
+ actual[STATS],
1139
+ stack,
1140
+ errors,
1141
+
1142
+ () => match2()
1143
+ )
1144
1144
  }
1145
1145
  match2()
1146
1146
  }
@@ -1155,19 +1155,15 @@ export const typeCheck = (ast, error = true) => {
1155
1155
  // break
1156
1156
  }
1157
1157
  }
1158
- else if (
1159
- isUnknownType(expected) &&
1160
- args[i][STATS].retried < MAX_RETRY_DEFINITION
1161
- ) {
1162
- args[i][STATS].retried += 1
1163
- stack.unshift(() => match())
1164
- }
1158
+ else if (isUnknownType(expected))
1159
+ retry(args[i][STATS], stack, errors, () => match())
1165
1160
  }
1166
1161
  match()
1167
1162
  }
1168
1163
  }
1169
1164
  }
1170
1165
  })
1166
+
1171
1167
  for (let i = 0; i < rest.length; ++i) {
1172
1168
  const r = rest[i]
1173
1169
  if (isLeaf(r) && r[TYPE] !== ATOM)
package/src/types.js CHANGED
@@ -23,7 +23,7 @@ export const PREDICATE = 4
23
23
  export const ANY = 5
24
24
  export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
25
25
  export const MAX_ARGUMENT_RETRY = 1
26
- export const MAX_RETRY_DEFINITION = 10
26
+ export const MAX_RETRY_DEFINITION = 100
27
27
  export const toTypeNames = (type) => {
28
28
  switch (type) {
29
29
  case APPLY:
@@ -42,6 +42,14 @@ export const toTypeNames = (type) => {
42
42
  break
43
43
  }
44
44
  }
45
+ export const toTypeNamesAnyToUknown = (type) => {
46
+ switch (type) {
47
+ case ANY:
48
+ return toTypeNames(UNKNOWN)
49
+ default:
50
+ return toTypeNames(type)
51
+ }
52
+ }
45
53
  export const SPECIAL_FORM_TYPES = {
46
54
  [SCOPE_NAME]: ';',
47
55
  // [ORDER]: 0,
@@ -1196,15 +1204,15 @@ export const formatType = (name, env) => {
1196
1204
  `${
1197
1205
  getType(x[STATS]) === APPLY
1198
1206
  ? `${formatType(i, stats[ARGUMENTS])}`
1199
- : `${toTypeNames(getType(x[STATS]))}`
1207
+ : `${toTypeNamesAnyToUknown(getType(x[STATS]))}`
1200
1208
  }`
1201
1209
  ).join(' ') + ' '
1202
1210
  : ''
1203
1211
  // TODO format returned functions when type support is added
1204
- }(${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
1212
+ }(${KEYWORDS.BLOCK} ${toTypeNamesAnyToUknown(getReturn(stats))})${
1205
1213
  isAnonymous ? '' : ')'
1206
1214
  })`
1207
- : `(let ${name} ${toTypeNames(getType(stats))})`
1215
+ : `(let ${name} ${toTypeNamesAnyToUknown(getType(stats))})`
1208
1216
  : name
1209
1217
  }
1210
1218