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/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.109",
5
+ "version": "1.5.110",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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[TYPE] === ATOM && last[VALUE] !== TRUE && last[VALUE] !== FALSE)
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(exp)})`
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
- }) to another variable which is not a predicate (also ending in ?) (${stringifyArgs(
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
- checkPredicateNameDeep(name, exp, exp.slice(1), returns)
431
- if (!env[returns[VALUE]]) return false
432
- else if (getType(env[returns[VALUE]][STATS]) === APPLY) {
433
- if (returns[TYPE] === WORD) setReturnToAbbstraction(env[name][STATS])
434
- else {
435
- // ALWAYS APPLY
436
- // rest.at(-1)[0][TYPE] === APPLY
437
- // Here is upon application to store the result in the variable
438
- if (isUnknownType(env[name][STATS]))
439
- stack.prepend(() => {
440
- setTypeToReturn(env[name][STATS], env[returns[VALUE]][STATS])
441
- // env[name][STATS][TYPE_PROP][0] =
442
- // env[returns[VALUE]][STATS][RETURNS][0]
443
- // this seems to be able to be deleted
444
- // env[name][STATS][TYPE_PROP][1] =
445
- // env[returns[VALUE]][STATS][RETURNS][1]
446
- })
447
- else setReturnRef(env[name][STATS], env[returns[VALUE]][STATS])
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] = TRUE
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
  }