fez-lisp 1.5.107 → 1.5.109

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.107",
5
+ "version": "1.5.109",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -3,6 +3,9 @@ import {
3
3
  ATOM,
4
4
  FALSE,
5
5
  KEYWORDS,
6
+ MULTI_DIMENTIONAL_SETTERS,
7
+ MUTATION_SUFFIX,
8
+ MUTATORS_SET,
6
9
  PLACEHOLDER,
7
10
  PREDICATE_SUFFIX,
8
11
  PREDICATES_INPUT_SET,
@@ -100,14 +103,16 @@ export const setProp = (stats, prop, value) => {
100
103
  return (
101
104
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
102
105
  value[prop][0] !== UNKNOWN &&
103
- (stats[prop][0] = value[prop][0])
106
+ ((stats[prop][0] = value[prop][0]),
107
+ value[prop][1] && (stats[prop][1] = value[prop][1]))
104
108
  )
105
109
  }
106
110
  export const setPropToReturn = (stats, prop, value) => {
107
111
  return (
108
112
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
109
113
  value[RETURNS][0] !== UNKNOWN &&
110
- (stats[prop][0] = value[RETURNS][0])
114
+ ((stats[prop][0] = value[RETURNS][0]),
115
+ value[RETURNS][1] && (stats[prop][1] = value[RETURNS][1]))
111
116
  )
112
117
  }
113
118
  export const setPropToReturnRef = (stats, prop, value) => {
@@ -120,7 +125,8 @@ export const setPropToReturnRef = (stats, prop, value) => {
120
125
  export const setPropToType = (stats, prop, value) => {
121
126
  return (
122
127
  (stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
123
- (stats[prop][0] = value[TYPE_PROP][0])
128
+ ((stats[prop][0] = value[TYPE_PROP][0]),
129
+ value[TYPE_PROP][1] && (stats[prop][1] = value[TYPE_PROP][1]))
124
130
  )
125
131
  }
126
132
  export const setPropToTypeRef = (stats, prop, value) => {
@@ -169,27 +175,33 @@ export const setReturn = (stats, value) => {
169
175
  return (
170
176
  isUnknownReturn(stats) &&
171
177
  !isUnknownReturn(value) &&
172
- (stats[RETURNS][0] = value[RETURNS][0])
178
+ ((stats[RETURNS][0] = value[RETURNS][0]),
179
+ value[RETURNS][1] && (stats[RETURNS][1] = value[RETURNS][1]))
173
180
  )
174
181
  }
175
182
  export const setType = (stats, value) =>
176
183
  (isUnknownType(stats) || isAnyType(stats)) &&
177
184
  !isUnknownType(value) &&
178
- (stats[TYPE_PROP][0] = value[TYPE_PROP][0])
185
+ ((stats[TYPE_PROP][0] = value[TYPE_PROP][0]),
186
+ value[TYPE_PROP][1] && (stats[TYPE_PROP][1] = value[TYPE_PROP][1]))
179
187
  export const setTypeToReturn = (stats, value) =>
180
188
  (isUnknownType(stats) || isAnyType(stats)) &&
181
189
  !isUnknownReturn(value) &&
182
- (stats[TYPE_PROP][0] = value[RETURNS][0])
190
+ ((stats[TYPE_PROP][0] = value[RETURNS][0]),
191
+ value[RETURNS][1] && (stats[TYPE_PROP][1] = value[RETURNS][1]))
183
192
  export const setReturnToType = (stats, value) =>
184
193
  (isUnknownReturn(stats) || isAnyReturn(stats)) &&
185
194
  !isUnknownType(value) &&
186
- (stats[RETURNS][0] = value[TYPE_PROP][0])
195
+ ((stats[RETURNS][0] = value[TYPE_PROP][0]),
196
+ value[TYPE_PROP][1] && (stats[RETURNS][1] = value[TYPE_PROP][1]))
187
197
  export const isAnyReturn = (stats) => stats && stats[RETURNS][0] === ANY
188
198
  export const isAnyType = (stats) => stats && stats[TYPE_PROP][0] === ANY
189
199
  export const isUnknownType = (stats) => stats && stats[TYPE_PROP][0] === UNKNOWN
190
200
  export const isUnknownReturn = (stats) => stats[RETURNS][0] === UNKNOWN
191
201
  export const getType = (stats) => stats && stats[TYPE_PROP][0]
202
+ export const getTypes = (stats) => stats && stats[TYPE_PROP]
192
203
  export const getReturn = (stats) => stats && stats[RETURNS][0]
204
+ export const getReturns = (stats) => stats && stats[RETURNS]
193
205
  export const isAtomType = (stats) =>
194
206
  isAnyType(stats) || stats[TYPE_PROP][0] === ATOM
195
207
  export const isAtomReturn = (stats) =>
@@ -628,10 +640,15 @@ export const typeCheck = (ast, error = true) => {
628
640
  const ref = env[copy[SCOPE_NAME]]
629
641
  if (!ref) continue
630
642
  ref[STATS][ARGUMENTS][i] = copy[param[VALUE]]
631
- const returns = deepLambdaReturn(
632
- hasBlock(exp) ? exp.at(-1) : exp,
633
- (result) => result[VALUE] !== KEYWORDS.IF
634
- )
643
+
644
+ // TODO overwrite return type check here
645
+ }
646
+ const returns = deepLambdaReturn(
647
+ hasBlock(exp) ? exp.at(-1) : exp,
648
+ (result) => result[VALUE] !== KEYWORDS.IF
649
+ )
650
+ const ref = env[copy[SCOPE_NAME]]
651
+ if (ref)
635
652
  if (isLeaf(returns))
636
653
  // TODO figure out what we do here
637
654
  // this here is a variable WORD
@@ -667,8 +684,6 @@ export const typeCheck = (ast, error = true) => {
667
684
  }
668
685
  })
669
686
  }
670
- // TODO overwrite return type check here
671
- }
672
687
  check(rest.at(-1), copy, copy)
673
688
  break
674
689
  case STATIC_TYPES.ABSTRACTION:
@@ -1207,6 +1222,48 @@ export const typeCheck = (ast, error = true) => {
1207
1222
  }
1208
1223
  match()
1209
1224
  }
1225
+
1226
+ // handly typehints for arrays
1227
+ if (
1228
+ first[TYPE] === APPLY &&
1229
+ MUTATORS_SET.has(first[VALUE]) &&
1230
+ env[first[VALUE]]
1231
+ ) {
1232
+ const current = env[rest[i][VALUE]]
1233
+ if (current) {
1234
+ if (rest[i][TYPE] === WORD) {
1235
+ if (!current[STATS][TYPE_PROP][1]) {
1236
+ current[STATS][TYPE_PROP][1] = new Set()
1237
+ }
1238
+ if (MULTI_DIMENTIONAL_SETTERS.has(first[VALUE])) {
1239
+ current[STATS][TYPE_PROP][1].add(COLLECTION)
1240
+ } else {
1241
+ const right = isLeaf(rest.at(-1))
1242
+ ? rest.at(-1)
1243
+ : rest.at(-1)[0]
1244
+ switch (right[TYPE]) {
1245
+ case ATOM:
1246
+ current[STATS][TYPE_PROP][1].add(ATOM)
1247
+ break
1248
+ case WORD:
1249
+ if (env[right[VALUE]]) {
1250
+ current[STATS][TYPE_PROP][1].add(
1251
+ ...env[right[VALUE]][STATS][TYPE_PROP]
1252
+ )
1253
+ }
1254
+ break
1255
+ case APPLY:
1256
+ if (env[right[VALUE]])
1257
+ current[STATS][TYPE_PROP][1].add(
1258
+ ...env[right[VALUE]][STATS][RETURNS]
1259
+ )
1260
+ break
1261
+ }
1262
+ }
1263
+ }
1264
+ }
1265
+ }
1266
+ // handly typehints for arrays
1210
1267
  }
1211
1268
  }
1212
1269
  })
package/src/enchance.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  VALUE,
9
9
  WORD
10
10
  } from './keywords.js'
11
- import { getSuffix, shake, wrapInBlock } from './utils.js'
11
+ import { getPrefix, getSuffix, shake, wrapInBlock } from './utils.js'
12
12
  import std from '../lib/baked/std.js'
13
13
  export const OPTIMIZATIONS = {
14
14
  RECURSION: 'recursive',
@@ -47,7 +47,7 @@ export const enhance = (ast) => {
47
47
  last[0][VALUE] === KEYWORDS.ANONYMOUS_FUNCTION
48
48
  ) {
49
49
  const name = exp[1][VALUE]
50
- const prefix = name.split(':')[0]
50
+ const prefix = getPrefix(name)
51
51
  if (prefix === OPTIMIZATIONS.RECURSION) {
52
52
  const args = last.slice(1, -1)
53
53
  const newName = `${OPTIMIZED_PREFIX}${name}::*${performance
package/src/keywords.js CHANGED
@@ -97,3 +97,34 @@ export const PREDICATES_OUTPUT_SET = new Set([
97
97
  KEYWORDS.IS_ATOM,
98
98
  KEYWORDS.IS_LAMBDA
99
99
  ])
100
+ export const MUTATORS_SET = new Set([
101
+ KEYWORDS.SET_ARRAY,
102
+ 'set:with!',
103
+ 'map:with!',
104
+ 'matrix:set!',
105
+ 'matrix:set-and-get!',
106
+ 'array:set-and-get!',
107
+ 'var:set-and-get!',
108
+ 'map:set-and-get!',
109
+ 'set:add-and-get!',
110
+ 'set:add!',
111
+ 'map:set!',
112
+ 'array:set!',
113
+ 'array:append!',
114
+ 'array:push!',
115
+ 'var:set!',
116
+ 'array:merge!',
117
+ 'list:merge!',
118
+ 'list:concat!'
119
+ ])
120
+ export const MULTI_DIMENTIONAL_SETTERS = new Set([
121
+ 'set:with!',
122
+ 'map:with!',
123
+ 'matrix:set!',
124
+ 'matrix:set-and-get!',
125
+ 'array:set-and-get!',
126
+ 'set:add!',
127
+ 'map:set!',
128
+ 'list:merge!',
129
+ 'list:concat!'
130
+ ])
package/src/macros.js CHANGED
@@ -10,6 +10,7 @@ import {
10
10
  FALSE,
11
11
  KEYWORDS,
12
12
  PLACEHOLDER,
13
+ STATIC_TYPES,
13
14
  TRUE,
14
15
  TYPE,
15
16
  VALUE,
@@ -77,6 +78,14 @@ export const deSuggarAst = (ast, scope) => {
77
78
  // break
78
79
  case KEYWORDS.BLOCK:
79
80
  {
81
+ if (rest.length === 0)
82
+ throw new RangeError(
83
+ `Invalid number of arguments for (${
84
+ KEYWORDS.BLOCK
85
+ }), expected (>= 1) but got (0) (${
86
+ KEYWORDS.BLOCK
87
+ } ${stringifyArgs(rest)})`
88
+ )
80
89
  if (
81
90
  prev &&
82
91
  prev[TYPE] === APPLY &&
@@ -151,12 +160,10 @@ export const deSuggarAst = (ast, scope) => {
151
160
  let temp = exp
152
161
  for (let i = 0; i < rest.length; i += 2) {
153
162
  if (i === rest.length - 2) {
154
- temp.push(
155
- [APPLY, KEYWORDS.IF],
156
- rest[i],
157
- rest.at(-1),
158
- rest.at(-1)
159
- )
163
+ temp.push([APPLY, KEYWORDS.IF], rest[i], rest.at(-1), [
164
+ [APPLY, STATIC_TYPES.ANY],
165
+ [WORD, NIL]
166
+ ])
160
167
  } else {
161
168
  temp.push([APPLY, KEYWORDS.IF], rest[i], rest[i + 1], [])
162
169
  temp = temp.at(-1)
package/src/types.js CHANGED
@@ -1,4 +1,4 @@
1
- import { getReturn, getType } from './check.js'
1
+ import { getReturn, getReturns, getType, getTypes } from './check.js'
2
2
  import {
3
3
  APPLY,
4
4
  ATOM,
@@ -19,8 +19,8 @@ export const TYPE_PROP = 'type'
19
19
  export const SIGNATURE = 'name'
20
20
  export const UNKNOWN = -1
21
21
  export const COLLECTION = 3
22
- export const PREDICATE = 4
23
- export const ANY = 5
22
+ export const PREDICATE = 5
23
+ export const ANY = 4
24
24
  export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
25
25
  export const MAX_ARGUMENT_RETRY = 1
26
26
  export const MAX_RETRY_DEFINITION = 100
@@ -29,14 +29,13 @@ export const toTypeNames = (type) => {
29
29
  switch (type) {
30
30
  case APPLY:
31
31
  return 'Abstraction'
32
+ case PREDICATE:
32
33
  case ATOM:
33
34
  return 'Atom'
34
35
  case UNKNOWN:
35
36
  return 'Unknown'
36
- case PREDICATE:
37
- return 'Predicate'
38
37
  case COLLECTION:
39
- return 'Collection'
38
+ return '[]'
40
39
  case ANY:
41
40
  return 'Any'
42
41
  default:
@@ -100,7 +99,7 @@ export const SPECIAL_FORM_TYPES = {
100
99
  },
101
100
  [STATIC_TYPES.PREDICATE]: {
102
101
  [STATS]: {
103
- [TYPE_PROP]: [APPLY, PREDICATE],
102
+ [TYPE_PROP]: [APPLY],
104
103
  [SIGNATURE]: STATIC_TYPES.PREDICATE,
105
104
  retried: Infinity,
106
105
  [ARG_COUNT]: 1,
@@ -117,7 +116,7 @@ export const SPECIAL_FORM_TYPES = {
117
116
  }
118
117
  }
119
118
  ],
120
- [RETURNS]: [ATOM, PREDICATE]
119
+ [RETURNS]: [ATOM]
121
120
  }
122
121
  },
123
122
  [STATIC_TYPES.COLLECTION]: {
@@ -333,8 +332,8 @@ export const SPECIAL_FORM_TYPES = {
333
332
  [STATS]: {
334
333
  retried: 0,
335
334
  [SIGNATURE]: PLACEHOLDER,
336
- [TYPE_PROP]: [ATOM, PREDICATE],
337
- [RETURNS]: [ATOM, PREDICATE],
335
+ [TYPE_PROP]: [ATOM],
336
+ [RETURNS]: [ATOM],
338
337
 
339
338
  [ARGUMENTS]: [],
340
339
  [ARG_COUNT]: 0
@@ -837,8 +836,8 @@ export const SPECIAL_FORM_TYPES = {
837
836
  [STATS]: {
838
837
  retried: 0,
839
838
  [SIGNATURE]: PLACEHOLDER,
840
- [TYPE_PROP]: [ATOM, PREDICATE],
841
- [RETURNS]: [ATOM, PREDICATE],
839
+ [TYPE_PROP]: [ATOM],
840
+ [RETURNS]: [ATOM],
842
841
 
843
842
  [ARGUMENTS]: [],
844
843
  [ARG_COUNT]: 0
@@ -872,7 +871,7 @@ export const SPECIAL_FORM_TYPES = {
872
871
  },
873
872
  [KEYWORDS.NOT]: {
874
873
  [STATS]: {
875
- [TYPE_PROP]: [APPLY, PREDICATE],
874
+ [TYPE_PROP]: [APPLY],
876
875
  [SIGNATURE]: KEYWORDS.NOT,
877
876
  retried: Infinity,
878
877
  [ARG_COUNT]: 1,
@@ -881,20 +880,20 @@ export const SPECIAL_FORM_TYPES = {
881
880
  [STATS]: {
882
881
  retried: Infinity,
883
882
  [SIGNATURE]: PLACEHOLDER,
884
- [TYPE_PROP]: [ATOM, PREDICATE],
885
- [RETURNS]: [ATOM, PREDICATE],
883
+ [TYPE_PROP]: [ATOM],
884
+ [RETURNS]: [ATOM],
886
885
 
887
886
  [ARGUMENTS]: [],
888
887
  [ARG_COUNT]: 0
889
888
  }
890
889
  }
891
890
  ],
892
- [RETURNS]: [ATOM, PREDICATE]
891
+ [RETURNS]: [ATOM]
893
892
  }
894
893
  },
895
894
  [KEYWORDS.EQUAL]: {
896
895
  [STATS]: {
897
- [TYPE_PROP]: [APPLY, PREDICATE],
896
+ [TYPE_PROP]: [APPLY],
898
897
  [SIGNATURE]: KEYWORDS.EQUAL,
899
898
  retried: Infinity,
900
899
  [ARG_COUNT]: 2,
@@ -922,12 +921,12 @@ export const SPECIAL_FORM_TYPES = {
922
921
  }
923
922
  }
924
923
  ],
925
- [RETURNS]: [ATOM, PREDICATE]
924
+ [RETURNS]: [ATOM]
926
925
  }
927
926
  },
928
927
  [KEYWORDS.LESS_THAN]: {
929
928
  [STATS]: {
930
- [TYPE_PROP]: [APPLY, PREDICATE],
929
+ [TYPE_PROP]: [APPLY],
931
930
  retried: Infinity,
932
931
  [SIGNATURE]: KEYWORDS.LESS_THAN,
933
932
  [ARG_COUNT]: 2,
@@ -955,12 +954,12 @@ export const SPECIAL_FORM_TYPES = {
955
954
  }
956
955
  }
957
956
  ],
958
- [RETURNS]: [ATOM, PREDICATE]
957
+ [RETURNS]: [ATOM]
959
958
  }
960
959
  },
961
960
  [KEYWORDS.GREATHER_THAN]: {
962
961
  [STATS]: {
963
- [TYPE_PROP]: [APPLY, PREDICATE],
962
+ [TYPE_PROP]: [APPLY],
964
963
  [SIGNATURE]: KEYWORDS.GREATHER_THAN,
965
964
  retried: Infinity,
966
965
  [ARG_COUNT]: 2,
@@ -988,12 +987,12 @@ export const SPECIAL_FORM_TYPES = {
988
987
  }
989
988
  }
990
989
  ],
991
- [RETURNS]: [ATOM, PREDICATE]
990
+ [RETURNS]: [ATOM]
992
991
  }
993
992
  },
994
993
  [KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
995
994
  [STATS]: {
996
- [TYPE_PROP]: [APPLY, PREDICATE],
995
+ [TYPE_PROP]: [APPLY],
997
996
  [SIGNATURE]: KEYWORDS.GREATHER_THAN_OR_EQUAL,
998
997
  retried: Infinity,
999
998
  [ARG_COUNT]: 2,
@@ -1021,12 +1020,12 @@ export const SPECIAL_FORM_TYPES = {
1021
1020
  }
1022
1021
  }
1023
1022
  ],
1024
- [RETURNS]: [ATOM, PREDICATE]
1023
+ [RETURNS]: [ATOM]
1025
1024
  }
1026
1025
  },
1027
1026
  [KEYWORDS.LESS_THAN_OR_EQUAL]: {
1028
1027
  [STATS]: {
1029
- [TYPE_PROP]: [APPLY, PREDICATE],
1028
+ [TYPE_PROP]: [APPLY],
1030
1029
  [SIGNATURE]: KEYWORDS.LESS_THAN_OR_EQUAL,
1031
1030
  retried: Infinity,
1032
1031
  [ARG_COUNT]: 2,
@@ -1054,12 +1053,12 @@ export const SPECIAL_FORM_TYPES = {
1054
1053
  }
1055
1054
  }
1056
1055
  ],
1057
- [RETURNS]: [ATOM, PREDICATE]
1056
+ [RETURNS]: [ATOM]
1058
1057
  }
1059
1058
  },
1060
1059
  [KEYWORDS.AND]: {
1061
1060
  [STATS]: {
1062
- [TYPE_PROP]: [APPLY, PREDICATE],
1061
+ [TYPE_PROP]: [APPLY],
1063
1062
  [SIGNATURE]: KEYWORDS.AND,
1064
1063
  retried: Infinity,
1065
1064
  [ARG_COUNT]: 2,
@@ -1068,8 +1067,8 @@ export const SPECIAL_FORM_TYPES = {
1068
1067
  [STATS]: {
1069
1068
  retried: Infinity,
1070
1069
  [SIGNATURE]: PLACEHOLDER,
1071
- [TYPE_PROP]: [ATOM, PREDICATE],
1072
- [RETURNS]: [ATOM, PREDICATE],
1070
+ [TYPE_PROP]: [ATOM],
1071
+ [RETURNS]: [ATOM],
1073
1072
 
1074
1073
  [ARGUMENTS]: [],
1075
1074
  [ARG_COUNT]: 0
@@ -1079,20 +1078,20 @@ export const SPECIAL_FORM_TYPES = {
1079
1078
  [STATS]: {
1080
1079
  retried: Infinity,
1081
1080
  [SIGNATURE]: PLACEHOLDER,
1082
- [TYPE_PROP]: [ATOM, PREDICATE],
1083
- [RETURNS]: [ATOM, PREDICATE],
1081
+ [TYPE_PROP]: [ATOM],
1082
+ [RETURNS]: [ATOM],
1084
1083
 
1085
1084
  [ARGUMENTS]: [],
1086
1085
  [ARG_COUNT]: 0
1087
1086
  }
1088
1087
  }
1089
1088
  ],
1090
- [RETURNS]: [ATOM, PREDICATE]
1089
+ [RETURNS]: [ATOM]
1091
1090
  }
1092
1091
  },
1093
1092
  [KEYWORDS.OR]: {
1094
1093
  [STATS]: {
1095
- [TYPE_PROP]: [APPLY, PREDICATE],
1094
+ [TYPE_PROP]: [APPLY],
1096
1095
  [SIGNATURE]: KEYWORDS.OR,
1097
1096
  retried: Infinity,
1098
1097
  [ARG_COUNT]: 2,
@@ -1101,8 +1100,8 @@ export const SPECIAL_FORM_TYPES = {
1101
1100
  [STATS]: {
1102
1101
  retried: Infinity,
1103
1102
  [SIGNATURE]: PLACEHOLDER,
1104
- [TYPE_PROP]: [ATOM, PREDICATE],
1105
- [RETURNS]: [ATOM, PREDICATE],
1103
+ [TYPE_PROP]: [ATOM],
1104
+ [RETURNS]: [ATOM],
1106
1105
 
1107
1106
  [ARGUMENTS]: [],
1108
1107
  [ARG_COUNT]: 0
@@ -1112,20 +1111,20 @@ export const SPECIAL_FORM_TYPES = {
1112
1111
  [STATS]: {
1113
1112
  retried: Infinity,
1114
1113
  [SIGNATURE]: PLACEHOLDER,
1115
- [TYPE_PROP]: [ATOM, PREDICATE],
1116
- [RETURNS]: [ATOM, PREDICATE],
1114
+ [TYPE_PROP]: [ATOM],
1115
+ [RETURNS]: [ATOM],
1117
1116
 
1118
1117
  [ARGUMENTS]: [],
1119
1118
  [ARG_COUNT]: 0
1120
1119
  }
1121
1120
  }
1122
1121
  ],
1123
- [RETURNS]: [ATOM, PREDICATE]
1122
+ [RETURNS]: [ATOM]
1124
1123
  }
1125
1124
  },
1126
1125
  [KEYWORDS.IS_ATOM]: {
1127
1126
  [STATS]: {
1128
- [TYPE_PROP]: [APPLY, PREDICATE],
1127
+ [TYPE_PROP]: [APPLY],
1129
1128
  [SIGNATURE]: KEYWORDS.IS_ATOM,
1130
1129
  retried: Infinity,
1131
1130
  [ARG_COUNT]: 1,
@@ -1142,12 +1141,12 @@ export const SPECIAL_FORM_TYPES = {
1142
1141
  }
1143
1142
  }
1144
1143
  ],
1145
- [RETURNS]: [ATOM, PREDICATE]
1144
+ [RETURNS]: [ATOM]
1146
1145
  }
1147
1146
  },
1148
1147
  [KEYWORDS.IS_LAMBDA]: {
1149
1148
  [STATS]: {
1150
- [TYPE_PROP]: [APPLY, PREDICATE],
1149
+ [TYPE_PROP]: [APPLY],
1151
1150
  [SIGNATURE]: KEYWORDS.IS_LAMBDA,
1152
1151
  retried: Infinity,
1153
1152
  [ARG_COUNT]: 1,
@@ -1164,7 +1163,7 @@ export const SPECIAL_FORM_TYPES = {
1164
1163
  }
1165
1164
  }
1166
1165
  ],
1167
- [RETURNS]: [ATOM, PREDICATE]
1166
+ [RETURNS]: [ATOM]
1168
1167
  }
1169
1168
  },
1170
1169
  [KEYWORDS.ERROR]: {
@@ -1191,6 +1190,22 @@ export const SPECIAL_FORM_TYPES = {
1191
1190
  }
1192
1191
  }
1193
1192
 
1193
+ const formatSubType = (T) => {
1194
+ switch (T[0]) {
1195
+ case COLLECTION:
1196
+ return `[${
1197
+ T[1] instanceof Set
1198
+ ? [...T[1]]
1199
+ .map((x) =>
1200
+ x === COLLECTION ? formatSubType([x]) : toTypeNames(x)
1201
+ )
1202
+ .join(' ')
1203
+ : toTypeNames(ANY)
1204
+ }]`
1205
+ default:
1206
+ return toTypeNames(T[0])
1207
+ }
1208
+ }
1194
1209
  export const formatType = (name, env) => {
1195
1210
  const stats = env[name][STATS]
1196
1211
  const isAnonymous = typeof name === 'number'
@@ -1205,15 +1220,15 @@ export const formatType = (name, env) => {
1205
1220
  `${
1206
1221
  getType(x[STATS]) === APPLY
1207
1222
  ? `${formatType(i, stats[ARGUMENTS])}`
1208
- : `${toTypeNamesAnyToUknown(getType(x[STATS]))}`
1223
+ : `${formatSubType(getTypes(x[STATS]))}`
1209
1224
  }`
1210
1225
  ).join(' ') + ' '
1211
1226
  : ''
1212
1227
  // TODO format returned functions when type support is added
1213
- }(${KEYWORDS.BLOCK} ${toTypeNamesAnyToUknown(getReturn(stats))})${
1228
+ }(${KEYWORDS.BLOCK} ${formatSubType(getReturns(stats))})${
1214
1229
  isAnonymous ? '' : ')'
1215
1230
  })`
1216
- : `(let ${name} ${toTypeNamesAnyToUknown(getType(stats))})`
1231
+ : `(let ${name} ${formatSubType(getTypes(stats))})`
1217
1232
  : name
1218
1233
  }
1219
1234
 
package/src/utils.js CHANGED
@@ -33,6 +33,7 @@ export const formatErrorWithCallstack = (error, callstack) =>
33
33
  `${error.message}\n${formatCallstack(callstack)}`
34
34
  // TODO figure out why name is sometimes undefined
35
35
  export const getSuffix = (str) => (str ? str[str.length - 1] : '')
36
+ export const getPrefix = (str) => str?.split(':')[0]
36
37
  export const removeNoCode = (source) =>
37
38
  source
38
39
  .replace(/(;.+|;)/g, '')