fez-lisp 1.5.108 → 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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/check.js +70 -13
- package/src/enchance.js +2 -2
- package/src/keywords.js +31 -0
- package/src/macros.js +13 -6
- package/src/types.js +60 -45
- package/src/utils.js +1 -0
package/package.json
CHANGED
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
|
-
|
632
|
-
|
633
|
-
|
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
|
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,
|
156
|
-
|
157
|
-
|
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 =
|
23
|
-
export const ANY =
|
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 '
|
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
|
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
|
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
|
337
|
-
[RETURNS]: [ATOM
|
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
|
841
|
-
[RETURNS]: [ATOM
|
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
|
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
|
885
|
-
[RETURNS]: [ATOM
|
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
|
891
|
+
[RETURNS]: [ATOM]
|
893
892
|
}
|
894
893
|
},
|
895
894
|
[KEYWORDS.EQUAL]: {
|
896
895
|
[STATS]: {
|
897
|
-
[TYPE_PROP]: [APPLY
|
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
|
924
|
+
[RETURNS]: [ATOM]
|
926
925
|
}
|
927
926
|
},
|
928
927
|
[KEYWORDS.LESS_THAN]: {
|
929
928
|
[STATS]: {
|
930
|
-
[TYPE_PROP]: [APPLY
|
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
|
957
|
+
[RETURNS]: [ATOM]
|
959
958
|
}
|
960
959
|
},
|
961
960
|
[KEYWORDS.GREATHER_THAN]: {
|
962
961
|
[STATS]: {
|
963
|
-
[TYPE_PROP]: [APPLY
|
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
|
990
|
+
[RETURNS]: [ATOM]
|
992
991
|
}
|
993
992
|
},
|
994
993
|
[KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
|
995
994
|
[STATS]: {
|
996
|
-
[TYPE_PROP]: [APPLY
|
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
|
1023
|
+
[RETURNS]: [ATOM]
|
1025
1024
|
}
|
1026
1025
|
},
|
1027
1026
|
[KEYWORDS.LESS_THAN_OR_EQUAL]: {
|
1028
1027
|
[STATS]: {
|
1029
|
-
[TYPE_PROP]: [APPLY
|
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
|
1056
|
+
[RETURNS]: [ATOM]
|
1058
1057
|
}
|
1059
1058
|
},
|
1060
1059
|
[KEYWORDS.AND]: {
|
1061
1060
|
[STATS]: {
|
1062
|
-
[TYPE_PROP]: [APPLY
|
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
|
1072
|
-
[RETURNS]: [ATOM
|
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
|
1083
|
-
[RETURNS]: [ATOM
|
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
|
1089
|
+
[RETURNS]: [ATOM]
|
1091
1090
|
}
|
1092
1091
|
},
|
1093
1092
|
[KEYWORDS.OR]: {
|
1094
1093
|
[STATS]: {
|
1095
|
-
[TYPE_PROP]: [APPLY
|
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
|
1105
|
-
[RETURNS]: [ATOM
|
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
|
1116
|
-
[RETURNS]: [ATOM
|
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
|
1122
|
+
[RETURNS]: [ATOM]
|
1124
1123
|
}
|
1125
1124
|
},
|
1126
1125
|
[KEYWORDS.IS_ATOM]: {
|
1127
1126
|
[STATS]: {
|
1128
|
-
[TYPE_PROP]: [APPLY
|
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
|
1144
|
+
[RETURNS]: [ATOM]
|
1146
1145
|
}
|
1147
1146
|
},
|
1148
1147
|
[KEYWORDS.IS_LAMBDA]: {
|
1149
1148
|
[STATS]: {
|
1150
|
-
[TYPE_PROP]: [APPLY
|
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
|
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
|
-
: `${
|
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} ${
|
1228
|
+
}(${KEYWORDS.BLOCK} ${formatSubType(getReturns(stats))})${
|
1214
1229
|
isAnonymous ? '' : ')'
|
1215
1230
|
})`
|
1216
|
-
: `(let ${name} ${
|
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, '')
|