fez-lisp 1.5.109 → 1.5.110
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 +65 -106
- package/src/compiler.js +5 -0
- package/src/macros.js +3 -2
- package/src/types.js +35 -39
package/package.json
CHANGED
package/src/check.js
CHANGED
@@ -38,7 +38,10 @@ import {
|
|
38
38
|
formatType,
|
39
39
|
ANONYMOUS_FUNCTION_TYPE_PREFIX,
|
40
40
|
validateLambda,
|
41
|
-
NIL
|
41
|
+
NIL,
|
42
|
+
TRUE_WORD,
|
43
|
+
FALSE_WORD,
|
44
|
+
BOOLEAN_SUBTYPE
|
42
45
|
} from './types.js'
|
43
46
|
import {
|
44
47
|
Brr,
|
@@ -93,6 +96,15 @@ export const setPropToAtom = (stats, prop) => {
|
|
93
96
|
(stats[prop][0] = ATOM)
|
94
97
|
)
|
95
98
|
}
|
99
|
+
export const setPropToPredicate = (stats, prop) => {
|
100
|
+
return (stats[prop][1] = BOOLEAN_SUBTYPE())
|
101
|
+
}
|
102
|
+
export const setReturnToPredicate = (stats) => {
|
103
|
+
return (stats[RETURNS][1] = BOOLEAN_SUBTYPE())
|
104
|
+
}
|
105
|
+
export const setTypeToPredicate = (stats) => {
|
106
|
+
return (stats[RETURNS][1] = BOOLEAN_SUBTYPE())
|
107
|
+
}
|
96
108
|
export const setPropToAbstraction = (stats, prop) => {
|
97
109
|
return (
|
98
110
|
(stats[prop][0] === UNKNOWN || stats[prop][0] === ANY) &&
|
@@ -212,59 +224,56 @@ export const compareReturns = (a, b) =>
|
|
212
224
|
isAnyReturn(a) || isAnyReturn(b) || a[RETURNS][0] === b[RETURNS][0]
|
213
225
|
export const compareTypeWithReturn = (a, b) =>
|
214
226
|
isAnyType(a) || isAnyReturn(b) || a[TYPE_PROP][0] === b[RETURNS][0]
|
227
|
+
const IsPredicate = (leaf) =>
|
228
|
+
(leaf[TYPE] === ATOM && (leaf[VALUE] === TRUE || leaf[VALUE] === FALSE)) ||
|
229
|
+
(leaf[TYPE] === WORD &&
|
230
|
+
(leaf[VALUE] === TRUE_WORD ||
|
231
|
+
leaf[VALUE] === FALSE_WORD ||
|
232
|
+
leaf[VALUE] === NIL ||
|
233
|
+
getSuffix(leaf[VALUE]) === PREDICATE_SUFFIX)) ||
|
234
|
+
(leaf[TYPE] === APPLY &&
|
235
|
+
(PREDICATES_OUTPUT_SET.has(leaf[VALUE]) ||
|
236
|
+
getSuffix(leaf[VALUE]) === PREDICATE_SUFFIX))
|
215
237
|
const checkPredicateName = (exp, rest) => {
|
216
238
|
if (getSuffix(rest[0][VALUE]) === PREDICATE_SUFFIX) {
|
217
239
|
const last = rest.at(-1)
|
218
|
-
if (isLeaf(last)) {
|
219
|
-
if (last
|
240
|
+
if (last[TYPE] !== APPLY && isLeaf(last) && !IsPredicate(last)) {
|
241
|
+
if (!IsPredicate(last))
|
220
242
|
throw new TypeError(
|
221
|
-
`Assigning predicate (ending in ?) variable
|
243
|
+
`Assigning predicate (ending in ?) variable (${
|
222
244
|
rest[0][VALUE]
|
223
245
|
}) to an (${
|
224
246
|
STATIC_TYPES.ATOM
|
225
|
-
}) that is not (or ${TRUE} ${FALSE}) (${stringifyArgs(
|
226
|
-
)
|
227
|
-
else if (
|
228
|
-
last[TYPE] === WORD &&
|
229
|
-
getSuffix(last[VALUE]) !== PREDICATE_SUFFIX &&
|
230
|
-
!PREDICATES_OUTPUT_SET.has(last[VALUE])
|
231
|
-
)
|
232
|
-
throw new TypeError(
|
233
|
-
`Assigning predicate (ending in ?) variable (${
|
234
|
-
rest[0][VALUE]
|
235
|
-
}) to another variable which is not a predicate (also ending in ?) (${stringifyArgs(
|
247
|
+
}) that is not (or ${TRUE} ${FALSE}) or to another variable which is not a predicate (also ending in ?) or to a variable that is not (or true false nil) (${stringifyArgs(
|
236
248
|
exp
|
237
|
-
)})`
|
249
|
+
)}) (check #100)`
|
238
250
|
)
|
239
251
|
} else if (last[0][0] === APPLY) {
|
240
252
|
const application = last[0]
|
241
|
-
if (
|
242
|
-
application[VALUE] !== KEYWORDS.IF &&
|
243
|
-
getSuffix(application[VALUE]) !== PREDICATE_SUFFIX &&
|
244
|
-
!PREDICATES_OUTPUT_SET.has(application[VALUE])
|
245
|
-
)
|
253
|
+
if (application[VALUE] !== KEYWORDS.IF && !IsPredicate(application))
|
246
254
|
throw new TypeError(
|
247
255
|
`Assigning predicate (ending in ?) variable (${
|
248
256
|
application[VALUE]
|
249
|
-
})
|
257
|
+
}) to another variable which is not a predicate (also ending in ?) or to a variable that is not (or true false nil) (${stringifyArgs(
|
250
258
|
exp
|
251
|
-
)})`
|
259
|
+
)}) (check #101)`
|
252
260
|
)
|
253
261
|
}
|
262
|
+
return true
|
254
263
|
}
|
264
|
+
return false
|
255
265
|
}
|
256
266
|
const checkPredicateNameDeep = (name, exp, rest, returns) => {
|
257
267
|
if (returns[VALUE] === KEYWORDS.CALL_FUNCTION) {
|
258
268
|
const fn = rest.at(-1).at(-1).at(-1)
|
259
|
-
checkPredicateName(exp, [
|
269
|
+
return checkPredicateName(exp, [
|
260
270
|
[WORD, name],
|
261
271
|
isLeaf(fn)
|
262
272
|
? fn // when apply is a word (let x? (lambda (apply [] array:empty!)))
|
263
273
|
: drillReturnType(fn, (r) => r[VALUE] === KEYWORDS.CALL_FUNCTION) // when apply is an annonymous lambda // (let fn? (lambda x (apply x (lambda x (array:empty! [])))))
|
264
274
|
])
|
265
|
-
} else {
|
266
|
-
checkPredicateName(exp, [[WORD, name], returns])
|
267
275
|
}
|
276
|
+
return checkPredicateName(exp, [[WORD, name], returns])
|
268
277
|
}
|
269
278
|
const fillUknownArgs = (n) =>
|
270
279
|
Array.from({ length: n })
|
@@ -420,31 +429,33 @@ const resolveRetunType = ({ returns, rem, stack, prop, exp, name, env }) => {
|
|
420
429
|
if (returns[TYPE] === ATOM) {
|
421
430
|
// ATOM ASSIGMENT
|
422
431
|
setPropToAtom(env[name][STATS], prop)
|
423
|
-
checkPredicateName(exp, [[WORD, name], returns])
|
424
432
|
} else {
|
425
433
|
switch (returns[VALUE]) {
|
426
434
|
case KEYWORDS.IF:
|
427
435
|
resolveCondition({ rem, name, env, exp, prop })
|
428
436
|
break
|
429
437
|
default:
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
if (returns[
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
438
|
+
{
|
439
|
+
checkPredicateNameDeep(name, exp, exp.slice(1), returns)
|
440
|
+
if (!env[returns[VALUE]]) return false
|
441
|
+
else if (getType(env[returns[VALUE]][STATS]) === APPLY) {
|
442
|
+
if (returns[TYPE] === WORD)
|
443
|
+
setReturnToAbbstraction(env[name][STATS])
|
444
|
+
else {
|
445
|
+
// ALWAYS APPLY
|
446
|
+
// rest.at(-1)[0][TYPE] === APPLY
|
447
|
+
// Here is upon application to store the result in the variable
|
448
|
+
if (isUnknownType(env[name][STATS]))
|
449
|
+
stack.prepend(() => {
|
450
|
+
setTypeToReturn(env[name][STATS], env[returns[VALUE]][STATS])
|
451
|
+
// env[name][STATS][TYPE_PROP][0] =
|
452
|
+
// env[returns[VALUE]][STATS][RETURNS][0]
|
453
|
+
// this seems to be able to be deleted
|
454
|
+
// env[name][STATS][TYPE_PROP][1] =
|
455
|
+
// env[returns[VALUE]][STATS][RETURNS][1]
|
456
|
+
})
|
457
|
+
else setReturnRef(env[name][STATS], env[returns[VALUE]][STATS])
|
458
|
+
}
|
448
459
|
}
|
449
460
|
}
|
450
461
|
break
|
@@ -582,16 +593,18 @@ export const typeCheck = (ast, error = true) => {
|
|
582
593
|
retried: 0,
|
583
594
|
counter: 0,
|
584
595
|
[SIGNATURE]: name,
|
585
|
-
[TYPE_PROP]: [
|
586
|
-
isLeafNode
|
587
|
-
? right[TYPE]
|
588
|
-
: env[right[VALUE]] == undefined
|
589
|
-
? UNKNOWN
|
590
|
-
: env[right[VALUE]][STATS][RETURNS][0]
|
591
|
-
],
|
596
|
+
[TYPE_PROP]: [UNKNOWN],
|
592
597
|
[RETURNS]: [UNKNOWN]
|
593
598
|
}
|
594
599
|
}
|
600
|
+
const type = isLeafNode
|
601
|
+
? right[TYPE]
|
602
|
+
: env[right[VALUE]] == undefined
|
603
|
+
? UNKNOWN
|
604
|
+
: env[right[VALUE]][STATS][RETURNS][0]
|
605
|
+
if (type !== UNKNOWN)
|
606
|
+
setTypeToReturn(env[name][STATS], env[right[VALUE]][STATS])
|
607
|
+
|
595
608
|
const body = rightHand
|
596
609
|
const rem = hasBlock(body) ? body.at(-1) : body
|
597
610
|
const returns = isLeaf(rem) ? rem : rem[0]
|
@@ -783,60 +796,6 @@ export const typeCheck = (ast, error = true) => {
|
|
783
796
|
const MAIN_TYPE = getType(args[i][STATS])
|
784
797
|
if (MAIN_TYPE === ANY) continue
|
785
798
|
if (first[TYPE] === APPLY && isSpecial) {
|
786
|
-
if (
|
787
|
-
MAIN_TYPE === ATOM &&
|
788
|
-
PREDICATES_INPUT_SET.has(first[VALUE])
|
789
|
-
) {
|
790
|
-
if (
|
791
|
-
!isRestILeaf &&
|
792
|
-
rest[i][0][TYPE] === APPLY &&
|
793
|
-
rest[i][0][VALUE] === KEYWORDS.CALL_FUNCTION
|
794
|
-
) {
|
795
|
-
if (isLeaf(rest[i].at(-1))) {
|
796
|
-
const fnName = rest[i].at(-1)[VALUE]
|
797
|
-
const fn = env[fnName]
|
798
|
-
if (fn && getReturn(fn[STATS]) !== ATOM)
|
799
|
-
throw new TypeError(
|
800
|
-
`Incorrect type of argument (${i}) for (${
|
801
|
-
first[VALUE]
|
802
|
-
}). Expected (${toTypeNames(
|
803
|
-
ATOM
|
804
|
-
)}) but got an (${toTypeNames(
|
805
|
-
getReturn(fn[STATS])
|
806
|
-
)}) (${stringifyArgs(exp)}) (check #26)`
|
807
|
-
)
|
808
|
-
} else {
|
809
|
-
const body = rest[i].at(-1).at(-1)
|
810
|
-
const rem = hasBlock(body) ? body.at(-1) : body
|
811
|
-
const returns = isLeaf(rem) ? rem : rem[0]
|
812
|
-
if (returns[TYPE] === ATOM) {
|
813
|
-
if (MAIN_TYPE !== ATOM)
|
814
|
-
throw new TypeError(
|
815
|
-
`Incorrect type of argument ${i} for (${
|
816
|
-
first[VALUE]
|
817
|
-
}). Expected (${toTypeNames(
|
818
|
-
MAIN_TYPE
|
819
|
-
)}) but got an (${toTypeNames(
|
820
|
-
ATOM
|
821
|
-
)}) (${stringifyArgs(exp)}) (check #27)`
|
822
|
-
)
|
823
|
-
} else if (
|
824
|
-
env[returns[VALUE]] &&
|
825
|
-
!isUnknownReturn(env[returns[VALUE]][STATS]) &&
|
826
|
-
getReturn(env[returns[VALUE]][STATS]) !== ATOM
|
827
|
-
)
|
828
|
-
throw new TypeError(
|
829
|
-
`Incorrect type of argument ${i} for (${
|
830
|
-
first[VALUE]
|
831
|
-
}). Expected (${toTypeNames(
|
832
|
-
ATOM
|
833
|
-
)}) but got (${toTypeNames(
|
834
|
-
getReturn(env[returns[VALUE]][STATS])
|
835
|
-
)}) (${stringifyArgs(exp)}) (check #29)`
|
836
|
-
)
|
837
|
-
}
|
838
|
-
}
|
839
|
-
}
|
840
799
|
const expectedArgs = env[first[VALUE]][STATS][ARGUMENTS]
|
841
800
|
if (!isRestILeaf) {
|
842
801
|
const name = rest[i][0][VALUE]
|
package/src/compiler.js
CHANGED
@@ -9,6 +9,7 @@ import {
|
|
9
9
|
STATIC_TYPES
|
10
10
|
} from './keywords.js'
|
11
11
|
import { leaf, isLeaf, AST } from './parser.js'
|
12
|
+
import { FALSE_WORD, TRUE_WORD } from './types.js'
|
12
13
|
const deepRename = (name, newName, tree) => {
|
13
14
|
if (!isLeaf(tree))
|
14
15
|
for (const leaf of tree) {
|
@@ -40,6 +41,10 @@ const toCamelCase = (name) => {
|
|
40
41
|
const dashToLodashes = (name) => name.replace(new RegExp(/-/g), '_')
|
41
42
|
const keywordToHelper = (name) => {
|
42
43
|
switch (name) {
|
44
|
+
case TRUE_WORD:
|
45
|
+
return '__true'
|
46
|
+
case FALSE_WORD:
|
47
|
+
return '__false'
|
43
48
|
case KEYWORDS.ADDITION:
|
44
49
|
return '__add'
|
45
50
|
case KEYWORDS.MULTIPLICATION:
|
package/src/macros.js
CHANGED
@@ -246,8 +246,9 @@ export const deSuggarAst = (ast, scope) => {
|
|
246
246
|
break
|
247
247
|
case KEYWORDS.MULTIPLICATION:
|
248
248
|
if (!rest.length) {
|
249
|
-
exp[0][TYPE] = ATOM
|
250
|
-
exp[0][VALUE] =
|
249
|
+
// exp[0][TYPE] = ATOM
|
250
|
+
exp[0][VALUE] = KEYWORDS.NOT
|
251
|
+
exp[1] = [ATOM, FALSE]
|
251
252
|
} else if (rest.length > 2) {
|
252
253
|
exp.length = 0
|
253
254
|
let temp = exp
|
package/src/types.js
CHANGED
@@ -20,16 +20,23 @@ export const SIGNATURE = 'name'
|
|
20
20
|
export const UNKNOWN = -1
|
21
21
|
export const COLLECTION = 3
|
22
22
|
export const PREDICATE = 5
|
23
|
+
export const NUMBER = 6
|
23
24
|
export const ANY = 4
|
24
25
|
export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
|
25
26
|
export const MAX_ARGUMENT_RETRY = 1
|
26
27
|
export const MAX_RETRY_DEFINITION = 100
|
27
28
|
export const NIL = 'nil'
|
29
|
+
export const TRUE_WORD = 'true'
|
30
|
+
export const FALSE_WORD = 'false'
|
31
|
+
export const BOOLEAN_SUBTYPE = () => new Set([PREDICATE])
|
28
32
|
export const toTypeNames = (type) => {
|
29
33
|
switch (type) {
|
30
34
|
case APPLY:
|
31
35
|
return 'Abstraction'
|
32
36
|
case PREDICATE:
|
37
|
+
return 'Boolean'
|
38
|
+
case NUMBER:
|
39
|
+
return 'Number'
|
33
40
|
case ATOM:
|
34
41
|
return 'Atom'
|
35
42
|
case UNKNOWN:
|
@@ -110,13 +117,12 @@ export const SPECIAL_FORM_TYPES = {
|
|
110
117
|
[SIGNATURE]: PLACEHOLDER,
|
111
118
|
[TYPE_PROP]: [UNKNOWN],
|
112
119
|
[RETURNS]: [UNKNOWN],
|
113
|
-
|
114
120
|
[ARGUMENTS]: [],
|
115
121
|
[ARG_COUNT]: 0
|
116
122
|
}
|
117
123
|
}
|
118
124
|
],
|
119
|
-
[RETURNS]: [ATOM]
|
125
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
120
126
|
}
|
121
127
|
},
|
122
128
|
[STATIC_TYPES.COLLECTION]: {
|
@@ -836,7 +842,7 @@ export const SPECIAL_FORM_TYPES = {
|
|
836
842
|
[STATS]: {
|
837
843
|
retried: 0,
|
838
844
|
[SIGNATURE]: PLACEHOLDER,
|
839
|
-
[TYPE_PROP]: [ATOM],
|
845
|
+
[TYPE_PROP]: [ATOM, BOOLEAN_SUBTYPE()],
|
840
846
|
[RETURNS]: [ATOM],
|
841
847
|
|
842
848
|
[ARGUMENTS]: [],
|
@@ -849,7 +855,6 @@ export const SPECIAL_FORM_TYPES = {
|
|
849
855
|
[SIGNATURE]: PLACEHOLDER,
|
850
856
|
[TYPE_PROP]: [ANY],
|
851
857
|
[RETURNS]: [ANY],
|
852
|
-
|
853
858
|
[ARGUMENTS]: [],
|
854
859
|
[ARG_COUNT]: 0
|
855
860
|
}
|
@@ -860,7 +865,6 @@ export const SPECIAL_FORM_TYPES = {
|
|
860
865
|
[SIGNATURE]: PLACEHOLDER,
|
861
866
|
[TYPE_PROP]: [ANY],
|
862
867
|
[RETURNS]: [ANY],
|
863
|
-
|
864
868
|
[ARGUMENTS]: [],
|
865
869
|
[ARG_COUNT]: 0
|
866
870
|
}
|
@@ -880,15 +884,14 @@ export const SPECIAL_FORM_TYPES = {
|
|
880
884
|
[STATS]: {
|
881
885
|
retried: Infinity,
|
882
886
|
[SIGNATURE]: PLACEHOLDER,
|
883
|
-
[TYPE_PROP]: [ATOM],
|
884
|
-
[RETURNS]: [ATOM],
|
885
|
-
|
887
|
+
[TYPE_PROP]: [ATOM, BOOLEAN_SUBTYPE()],
|
888
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()],
|
886
889
|
[ARGUMENTS]: [],
|
887
890
|
[ARG_COUNT]: 0
|
888
891
|
}
|
889
892
|
}
|
890
893
|
],
|
891
|
-
[RETURNS]: [ATOM]
|
894
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
892
895
|
}
|
893
896
|
},
|
894
897
|
[KEYWORDS.EQUAL]: {
|
@@ -904,7 +907,6 @@ export const SPECIAL_FORM_TYPES = {
|
|
904
907
|
[SIGNATURE]: PLACEHOLDER,
|
905
908
|
[TYPE_PROP]: [ATOM],
|
906
909
|
[RETURNS]: [ATOM],
|
907
|
-
|
908
910
|
[ARGUMENTS]: [],
|
909
911
|
[ARG_COUNT]: 0
|
910
912
|
}
|
@@ -915,13 +917,12 @@ export const SPECIAL_FORM_TYPES = {
|
|
915
917
|
[SIGNATURE]: PLACEHOLDER,
|
916
918
|
[TYPE_PROP]: [ATOM],
|
917
919
|
[RETURNS]: [ATOM],
|
918
|
-
|
919
920
|
[ARGUMENTS]: [],
|
920
921
|
[ARG_COUNT]: 0
|
921
922
|
}
|
922
923
|
}
|
923
924
|
],
|
924
|
-
[RETURNS]: [ATOM]
|
925
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
925
926
|
}
|
926
927
|
},
|
927
928
|
[KEYWORDS.LESS_THAN]: {
|
@@ -937,7 +938,6 @@ export const SPECIAL_FORM_TYPES = {
|
|
937
938
|
[SIGNATURE]: PLACEHOLDER,
|
938
939
|
[TYPE_PROP]: [ATOM],
|
939
940
|
[RETURNS]: [ATOM],
|
940
|
-
|
941
941
|
[ARGUMENTS]: [],
|
942
942
|
[ARG_COUNT]: 0
|
943
943
|
}
|
@@ -948,13 +948,12 @@ export const SPECIAL_FORM_TYPES = {
|
|
948
948
|
[SIGNATURE]: PLACEHOLDER,
|
949
949
|
[TYPE_PROP]: [ATOM],
|
950
950
|
[RETURNS]: [ATOM],
|
951
|
-
|
952
951
|
[ARGUMENTS]: [],
|
953
952
|
[ARG_COUNT]: 0
|
954
953
|
}
|
955
954
|
}
|
956
955
|
],
|
957
|
-
[RETURNS]: [ATOM]
|
956
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
958
957
|
}
|
959
958
|
},
|
960
959
|
[KEYWORDS.GREATHER_THAN]: {
|
@@ -981,13 +980,12 @@ export const SPECIAL_FORM_TYPES = {
|
|
981
980
|
[SIGNATURE]: PLACEHOLDER,
|
982
981
|
[TYPE_PROP]: [ATOM],
|
983
982
|
[RETURNS]: [ATOM],
|
984
|
-
|
985
983
|
[ARGUMENTS]: [],
|
986
984
|
[ARG_COUNT]: 0
|
987
985
|
}
|
988
986
|
}
|
989
987
|
],
|
990
|
-
[RETURNS]: [ATOM]
|
988
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
991
989
|
}
|
992
990
|
},
|
993
991
|
[KEYWORDS.GREATHER_THAN_OR_EQUAL]: {
|
@@ -1003,7 +1001,6 @@ export const SPECIAL_FORM_TYPES = {
|
|
1003
1001
|
[SIGNATURE]: PLACEHOLDER,
|
1004
1002
|
[TYPE_PROP]: [ATOM],
|
1005
1003
|
[RETURNS]: [ATOM],
|
1006
|
-
|
1007
1004
|
[ARGUMENTS]: [],
|
1008
1005
|
[ARG_COUNT]: 0
|
1009
1006
|
}
|
@@ -1014,13 +1011,12 @@ export const SPECIAL_FORM_TYPES = {
|
|
1014
1011
|
[SIGNATURE]: PLACEHOLDER,
|
1015
1012
|
[TYPE_PROP]: [ATOM],
|
1016
1013
|
[RETURNS]: [ATOM],
|
1017
|
-
|
1018
1014
|
[ARGUMENTS]: [],
|
1019
1015
|
[ARG_COUNT]: 0
|
1020
1016
|
}
|
1021
1017
|
}
|
1022
1018
|
],
|
1023
|
-
[RETURNS]: [ATOM]
|
1019
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
1024
1020
|
}
|
1025
1021
|
},
|
1026
1022
|
[KEYWORDS.LESS_THAN_OR_EQUAL]: {
|
@@ -1036,7 +1032,6 @@ export const SPECIAL_FORM_TYPES = {
|
|
1036
1032
|
[SIGNATURE]: PLACEHOLDER,
|
1037
1033
|
[TYPE_PROP]: [ATOM],
|
1038
1034
|
[RETURNS]: [ATOM],
|
1039
|
-
|
1040
1035
|
[ARGUMENTS]: [],
|
1041
1036
|
[ARG_COUNT]: 0
|
1042
1037
|
}
|
@@ -1047,13 +1042,12 @@ export const SPECIAL_FORM_TYPES = {
|
|
1047
1042
|
[SIGNATURE]: PLACEHOLDER,
|
1048
1043
|
[TYPE_PROP]: [ATOM],
|
1049
1044
|
[RETURNS]: [ATOM],
|
1050
|
-
|
1051
1045
|
[ARGUMENTS]: [],
|
1052
1046
|
[ARG_COUNT]: 0
|
1053
1047
|
}
|
1054
1048
|
}
|
1055
1049
|
],
|
1056
|
-
[RETURNS]: [ATOM]
|
1050
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
1057
1051
|
}
|
1058
1052
|
},
|
1059
1053
|
[KEYWORDS.AND]: {
|
@@ -1067,9 +1061,8 @@ export const SPECIAL_FORM_TYPES = {
|
|
1067
1061
|
[STATS]: {
|
1068
1062
|
retried: Infinity,
|
1069
1063
|
[SIGNATURE]: PLACEHOLDER,
|
1070
|
-
[TYPE_PROP]: [ATOM],
|
1071
|
-
[RETURNS]: [ATOM],
|
1072
|
-
|
1064
|
+
[TYPE_PROP]: [ATOM, BOOLEAN_SUBTYPE()],
|
1065
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()],
|
1073
1066
|
[ARGUMENTS]: [],
|
1074
1067
|
[ARG_COUNT]: 0
|
1075
1068
|
}
|
@@ -1078,15 +1071,14 @@ export const SPECIAL_FORM_TYPES = {
|
|
1078
1071
|
[STATS]: {
|
1079
1072
|
retried: Infinity,
|
1080
1073
|
[SIGNATURE]: PLACEHOLDER,
|
1081
|
-
[TYPE_PROP]: [ATOM],
|
1082
|
-
[RETURNS]: [ATOM],
|
1083
|
-
|
1074
|
+
[TYPE_PROP]: [ATOM, BOOLEAN_SUBTYPE()],
|
1075
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()],
|
1084
1076
|
[ARGUMENTS]: [],
|
1085
1077
|
[ARG_COUNT]: 0
|
1086
1078
|
}
|
1087
1079
|
}
|
1088
1080
|
],
|
1089
|
-
[RETURNS]: [ATOM]
|
1081
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
1090
1082
|
}
|
1091
1083
|
},
|
1092
1084
|
[KEYWORDS.OR]: {
|
@@ -1100,9 +1092,8 @@ export const SPECIAL_FORM_TYPES = {
|
|
1100
1092
|
[STATS]: {
|
1101
1093
|
retried: Infinity,
|
1102
1094
|
[SIGNATURE]: PLACEHOLDER,
|
1103
|
-
[TYPE_PROP]: [ATOM],
|
1104
|
-
[RETURNS]: [ATOM],
|
1105
|
-
|
1095
|
+
[TYPE_PROP]: [ATOM, BOOLEAN_SUBTYPE()],
|
1096
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()],
|
1106
1097
|
[ARGUMENTS]: [],
|
1107
1098
|
[ARG_COUNT]: 0
|
1108
1099
|
}
|
@@ -1111,15 +1102,14 @@ export const SPECIAL_FORM_TYPES = {
|
|
1111
1102
|
[STATS]: {
|
1112
1103
|
retried: Infinity,
|
1113
1104
|
[SIGNATURE]: PLACEHOLDER,
|
1114
|
-
[TYPE_PROP]: [ATOM],
|
1115
|
-
[RETURNS]: [ATOM],
|
1116
|
-
|
1105
|
+
[TYPE_PROP]: [ATOM, BOOLEAN_SUBTYPE()],
|
1106
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()],
|
1117
1107
|
[ARGUMENTS]: [],
|
1118
1108
|
[ARG_COUNT]: 0
|
1119
1109
|
}
|
1120
1110
|
}
|
1121
1111
|
],
|
1122
|
-
[RETURNS]: [ATOM]
|
1112
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
1123
1113
|
}
|
1124
1114
|
},
|
1125
1115
|
[KEYWORDS.IS_ATOM]: {
|
@@ -1141,7 +1131,7 @@ export const SPECIAL_FORM_TYPES = {
|
|
1141
1131
|
}
|
1142
1132
|
}
|
1143
1133
|
],
|
1144
|
-
[RETURNS]: [ATOM]
|
1134
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
1145
1135
|
}
|
1146
1136
|
},
|
1147
1137
|
[KEYWORDS.IS_LAMBDA]: {
|
@@ -1163,7 +1153,7 @@ export const SPECIAL_FORM_TYPES = {
|
|
1163
1153
|
}
|
1164
1154
|
}
|
1165
1155
|
],
|
1166
|
-
[RETURNS]: [ATOM]
|
1156
|
+
[RETURNS]: [ATOM, BOOLEAN_SUBTYPE()]
|
1167
1157
|
}
|
1168
1158
|
},
|
1169
1159
|
[KEYWORDS.ERROR]: {
|
@@ -1202,6 +1192,12 @@ const formatSubType = (T) => {
|
|
1202
1192
|
.join(' ')
|
1203
1193
|
: toTypeNames(ANY)
|
1204
1194
|
}]`
|
1195
|
+
case ATOM:
|
1196
|
+
return `${
|
1197
|
+
T[1] instanceof Set
|
1198
|
+
? [...T[1]].map((x) => toTypeNames(x)).join(' ')
|
1199
|
+
: toTypeNames(NUMBER)
|
1200
|
+
}`
|
1205
1201
|
default:
|
1206
1202
|
return toTypeNames(T[0])
|
1207
1203
|
}
|