@mojir/lits 2.0.19 → 2.0.21

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.
Files changed (38) hide show
  1. package/dist/cli/cli.js +339 -455
  2. package/dist/cli/src/Lits/Lits.d.ts +3 -1
  3. package/dist/cli/src/builtin/interface.d.ts +9 -5
  4. package/dist/cli/src/parser/index.d.ts +1 -2
  5. package/dist/cli/src/parser/interface.d.ts +0 -1
  6. package/dist/cli/src/tokenizer/algebraic/algebraicTokenizers.d.ts +1 -1
  7. package/dist/cli/src/tokenizer/algebraic/algebraicTokens.d.ts +2 -2
  8. package/dist/cli/src/tokenizer/common/commonTokenizers.d.ts +2 -2
  9. package/dist/cli/src/tokenizer/common/commonTokens.d.ts +2 -14
  10. package/dist/cli/src/tokenizer/minifyTokenStream.d.ts +2 -0
  11. package/dist/cli/src/tokenizer/polish/polishTokenizers.d.ts +1 -1
  12. package/dist/cli/src/tokenizer/polish/polishTokens.d.ts +2 -2
  13. package/dist/cli/src/tokenizer/tokens.d.ts +2 -2
  14. package/dist/cli/src/typeGuards/index.d.ts +1 -7
  15. package/dist/index.esm.js +338 -454
  16. package/dist/index.esm.js.map +1 -1
  17. package/dist/index.js +338 -454
  18. package/dist/index.js.map +1 -1
  19. package/dist/lits.iife.js +338 -454
  20. package/dist/lits.iife.js.map +1 -1
  21. package/dist/src/Lits/Lits.d.ts +3 -1
  22. package/dist/src/builtin/interface.d.ts +9 -5
  23. package/dist/src/parser/index.d.ts +1 -2
  24. package/dist/src/parser/interface.d.ts +0 -1
  25. package/dist/src/tokenizer/algebraic/algebraicTokenizers.d.ts +1 -1
  26. package/dist/src/tokenizer/algebraic/algebraicTokens.d.ts +2 -2
  27. package/dist/src/tokenizer/common/commonTokenizers.d.ts +2 -2
  28. package/dist/src/tokenizer/common/commonTokens.d.ts +2 -14
  29. package/dist/src/tokenizer/minifyTokenStream.d.ts +2 -0
  30. package/dist/src/tokenizer/polish/polishTokenizers.d.ts +1 -1
  31. package/dist/src/tokenizer/polish/polishTokens.d.ts +2 -2
  32. package/dist/src/tokenizer/tokens.d.ts +2 -2
  33. package/dist/src/typeGuards/index.d.ts +1 -7
  34. package/dist/testFramework.esm.js +448 -564
  35. package/dist/testFramework.esm.js.map +1 -1
  36. package/dist/testFramework.js +448 -564
  37. package/dist/testFramework.js.map +1 -1
  38. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -277,9 +277,6 @@ var commonSimpleTokenTypes = [
277
277
  'RBrace',
278
278
  'RBracket',
279
279
  'RParen',
280
- 'AlgNotation',
281
- 'PolNotation',
282
- 'EndNotation',
283
280
  ];
284
281
  var commomValueTokenTypes = [
285
282
  'String',
@@ -369,20 +366,6 @@ function asRegexpShorthandToken(token) {
369
366
  assertRegexpShorthandToken(token);
370
367
  return token;
371
368
  }
372
- function isAlgebraicNotationToken(token) {
373
- return (token === null || token === void 0 ? void 0 : token[0]) === 'AlgNotation';
374
- }
375
- function isPolishNotationToken(token) {
376
- return (token === null || token === void 0 ? void 0 : token[0]) === 'PolNotation';
377
- }
378
- function isEndNotationToken(token) {
379
- return (token === null || token === void 0 ? void 0 : token[0]) === 'EndNotation';
380
- }
381
- function assertEndNotationToken(token) {
382
- if (!isEndNotationToken(token)) {
383
- throwUnexpectedToken('EndNotation', undefined, token);
384
- }
385
- }
386
369
 
387
370
  var algebraicSimpleTokenTypes = __spreadArray([], __read(commonSimpleTokenTypes), false);
388
371
  var algebraicOnlyValueTokenTypes = [
@@ -842,20 +825,6 @@ function withoutCommentNodes(astNodes) {
842
825
  return astNodes.filter(function (n) { return n.t !== exports.AstNodeType.Comment; });
843
826
  }
844
827
 
845
- function assertEvenNumberOfParams(node) {
846
- var _a;
847
- var length = withoutCommentNodes(node.p).length;
848
- if (length % 2 !== 0) {
849
- throw new LitsError("Wrong number of arguments, expected an even number, got ".concat(valueToString(length), "."), (_a = getTokenDebugData(node.token)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
850
- }
851
- }
852
- function assertOddNumberOfParams(node) {
853
- var _a;
854
- var length = withoutCommentNodes(node.p).length;
855
- if (length % 2 !== 1) {
856
- throw new LitsError("Wrong number of arguments, expected an odd number, got ".concat(valueToString(length), "."), (_a = getTokenDebugData(node.token)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
857
- }
858
- }
859
828
  function assertNumberOfParams(count, node) {
860
829
  var _a, _b;
861
830
  assertCount({
@@ -887,9 +856,17 @@ function assertCount(_a) {
887
856
  }
888
857
  }
889
858
  else {
890
- var min = count.min, max = count.max;
891
- if (min === undefined && max === undefined)
892
- throw new LitsError('Min or max must be specified.', sourceCodeInfo);
859
+ var min = count.min, max = count.max, even = count.even, odd = count.odd;
860
+ if (even) {
861
+ if (length % 2 !== 0) {
862
+ throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an even number, got ").concat(valueToString(length), "."), sourceCodeInfo);
863
+ }
864
+ }
865
+ if (odd) {
866
+ if (length % 2 !== 1) {
867
+ throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an odd number, got ").concat(valueToString(length), "."), sourceCodeInfo);
868
+ }
869
+ }
893
870
  if (typeof min === 'number' && length < min) {
894
871
  throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
895
872
  }
@@ -1026,7 +1003,7 @@ var bitwiseNormalExpression = {
1026
1003
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
1027
1004
  return num << count;
1028
1005
  },
1029
- validate: function (node) { return assertNumberOfParams(2, node); },
1006
+ paramCount: 2,
1030
1007
  },
1031
1008
  '>>': {
1032
1009
  evaluate: function (_a, sourceCodeInfo) {
@@ -1035,7 +1012,7 @@ var bitwiseNormalExpression = {
1035
1012
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
1036
1013
  return num >> count;
1037
1014
  },
1038
- validate: function (node) { return assertNumberOfParams(2, node); },
1015
+ paramCount: 2,
1039
1016
  },
1040
1017
  '>>>': {
1041
1018
  evaluate: function (_a, sourceCodeInfo) {
@@ -1044,7 +1021,7 @@ var bitwiseNormalExpression = {
1044
1021
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
1045
1022
  return num >>> count;
1046
1023
  },
1047
- validate: function (node) { return assertNumberOfParams(2, node); },
1024
+ paramCount: 2,
1048
1025
  },
1049
1026
  '~': {
1050
1027
  evaluate: function (_a, sourceCodeInfo) {
@@ -1052,7 +1029,7 @@ var bitwiseNormalExpression = {
1052
1029
  assertNumber(num, sourceCodeInfo, { integer: true });
1053
1030
  return ~num;
1054
1031
  },
1055
- validate: function (node) { return assertNumberOfParams(1, node); },
1032
+ paramCount: 1,
1056
1033
  },
1057
1034
  '&': {
1058
1035
  evaluate: function (_a, sourceCodeInfo) {
@@ -1063,7 +1040,7 @@ var bitwiseNormalExpression = {
1063
1040
  return result & value;
1064
1041
  }, first);
1065
1042
  },
1066
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1043
+ paramCount: { min: 2 },
1067
1044
  },
1068
1045
  '&!': {
1069
1046
  evaluate: function (_a, sourceCodeInfo) {
@@ -1074,7 +1051,7 @@ var bitwiseNormalExpression = {
1074
1051
  return result & ~value;
1075
1052
  }, first);
1076
1053
  },
1077
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1054
+ paramCount: { min: 2 },
1078
1055
  },
1079
1056
  '|': {
1080
1057
  evaluate: function (_a, sourceCodeInfo) {
@@ -1085,7 +1062,7 @@ var bitwiseNormalExpression = {
1085
1062
  return result | value;
1086
1063
  }, first);
1087
1064
  },
1088
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1065
+ paramCount: { min: 2 },
1089
1066
  },
1090
1067
  '^': {
1091
1068
  evaluate: function (_a, sourceCodeInfo) {
@@ -1096,7 +1073,7 @@ var bitwiseNormalExpression = {
1096
1073
  return result ^ value;
1097
1074
  }, first);
1098
1075
  },
1099
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1076
+ paramCount: { min: 2 },
1100
1077
  },
1101
1078
  'bit_flip': {
1102
1079
  evaluate: function (_a, sourceCodeInfo) {
@@ -1106,7 +1083,7 @@ var bitwiseNormalExpression = {
1106
1083
  var mask = 1 << index;
1107
1084
  return (num ^= mask);
1108
1085
  },
1109
- validate: function (node) { return assertNumberOfParams(2, node); },
1086
+ paramCount: 2,
1110
1087
  },
1111
1088
  'bit_set': {
1112
1089
  evaluate: function (_a, sourceCodeInfo) {
@@ -1116,7 +1093,7 @@ var bitwiseNormalExpression = {
1116
1093
  var mask = 1 << index;
1117
1094
  return (num |= mask);
1118
1095
  },
1119
- validate: function (node) { return assertNumberOfParams(2, node); },
1096
+ paramCount: 2,
1120
1097
  },
1121
1098
  'bit_clear': {
1122
1099
  evaluate: function (_a, sourceCodeInfo) {
@@ -1126,7 +1103,7 @@ var bitwiseNormalExpression = {
1126
1103
  var mask = 1 << index;
1127
1104
  return (num &= ~mask);
1128
1105
  },
1129
- validate: function (node) { return assertNumberOfParams(2, node); },
1106
+ paramCount: 2,
1130
1107
  },
1131
1108
  'bit_test': {
1132
1109
  evaluate: function (_a, sourceCodeInfo) {
@@ -1136,7 +1113,7 @@ var bitwiseNormalExpression = {
1136
1113
  var mask = 1 << index;
1137
1114
  return !!(num & mask);
1138
1115
  },
1139
- validate: function (node) { return assertNumberOfParams(2, node); },
1116
+ paramCount: 2,
1140
1117
  },
1141
1118
  };
1142
1119
 
@@ -1518,7 +1495,7 @@ var collectionNormalExpression = {
1518
1495
  var result = get(coll, key);
1519
1496
  return result === undefined ? defaultValue : result;
1520
1497
  },
1521
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
1498
+ paramCount: { min: 2, max: 3 },
1522
1499
  },
1523
1500
  'get_in': {
1524
1501
  evaluate: function (params, sourceCodeInfo) {
@@ -1553,7 +1530,7 @@ var collectionNormalExpression = {
1553
1530
  }
1554
1531
  return coll;
1555
1532
  },
1556
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
1533
+ paramCount: { min: 2, max: 3 },
1557
1534
  },
1558
1535
  'count': {
1559
1536
  evaluate: function (_a, sourceCodeInfo) {
@@ -1567,7 +1544,7 @@ var collectionNormalExpression = {
1567
1544
  return coll.length;
1568
1545
  return Object.keys(coll).length;
1569
1546
  },
1570
- validate: function (node) { return assertNumberOfParams(1, node); },
1547
+ paramCount: 1,
1571
1548
  },
1572
1549
  'contains?': {
1573
1550
  evaluate: function (_a, sourceCodeInfo) {
@@ -1584,7 +1561,7 @@ var collectionNormalExpression = {
1584
1561
  }
1585
1562
  return !!Object.getOwnPropertyDescriptor(coll, key);
1586
1563
  },
1587
- validate: function (node) { return assertNumberOfParams(2, node); },
1564
+ paramCount: 2,
1588
1565
  },
1589
1566
  'has?': {
1590
1567
  evaluate: function (_a, sourceCodeInfo) {
@@ -1605,7 +1582,7 @@ var collectionNormalExpression = {
1605
1582
  }
1606
1583
  return Object.values(coll).includes(value);
1607
1584
  },
1608
- validate: function (node) { return assertNumberOfParams(2, node); },
1585
+ paramCount: 2,
1609
1586
  },
1610
1587
  'has_some?': {
1611
1588
  evaluate: function (_a, sourceCodeInfo) {
@@ -1665,7 +1642,7 @@ var collectionNormalExpression = {
1665
1642
  }
1666
1643
  return false;
1667
1644
  },
1668
- validate: function (node) { return assertNumberOfParams(2, node); },
1645
+ paramCount: 2,
1669
1646
  },
1670
1647
  'has_every?': {
1671
1648
  evaluate: function (_a, sourceCodeInfo) {
@@ -1727,7 +1704,7 @@ var collectionNormalExpression = {
1727
1704
  }
1728
1705
  return true;
1729
1706
  },
1730
- validate: function (node) { return assertNumberOfParams(2, node); },
1707
+ paramCount: 2,
1731
1708
  },
1732
1709
  'assoc': {
1733
1710
  evaluate: function (_a, sourceCodeInfo) {
@@ -1737,7 +1714,7 @@ var collectionNormalExpression = {
1737
1714
  assertAny(value, sourceCodeInfo);
1738
1715
  return assoc(coll, key, value, sourceCodeInfo);
1739
1716
  },
1740
- validate: function (node) { return assertNumberOfParams(3, node); },
1717
+ paramCount: 3,
1741
1718
  },
1742
1719
  'assoc_in': {
1743
1720
  evaluate: function (_a, sourceCodeInfo) {
@@ -1762,7 +1739,7 @@ var collectionNormalExpression = {
1762
1739
  }
1763
1740
  return coll;
1764
1741
  },
1765
- validate: function (node) { return assertNumberOfParams(3, node); },
1742
+ paramCount: 3,
1766
1743
  },
1767
1744
  'update': {
1768
1745
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1773,7 +1750,7 @@ var collectionNormalExpression = {
1773
1750
  assertLitsFunction(fn, sourceCodeInfo);
1774
1751
  return update(coll, key, fn, params, contextStack, executeFunction, sourceCodeInfo);
1775
1752
  },
1776
- validate: function (node) { return assertNumberOfParams({ min: 3 }, node); },
1753
+ paramCount: { min: 3 },
1777
1754
  },
1778
1755
  'update_in': {
1779
1756
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1799,7 +1776,7 @@ var collectionNormalExpression = {
1799
1776
  }
1800
1777
  return coll;
1801
1778
  },
1802
- validate: function (node) { return assertNumberOfParams({ min: 3 }, node); },
1779
+ paramCount: { min: 3 },
1803
1780
  },
1804
1781
  'concat': {
1805
1782
  evaluate: function (params, sourceCodeInfo) {
@@ -1823,7 +1800,7 @@ var collectionNormalExpression = {
1823
1800
  }, {});
1824
1801
  }
1825
1802
  },
1826
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
1803
+ paramCount: { min: 1 },
1827
1804
  },
1828
1805
  'not_empty': {
1829
1806
  evaluate: function (_a, sourceCodeInfo) {
@@ -1837,7 +1814,7 @@ var collectionNormalExpression = {
1837
1814
  return coll.length > 0 ? coll : null;
1838
1815
  return Object.keys(coll).length > 0 ? coll : null;
1839
1816
  },
1840
- validate: function (node) { return assertNumberOfParams(1, node); },
1817
+ paramCount: 1,
1841
1818
  },
1842
1819
  'every?': {
1843
1820
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1851,7 +1828,7 @@ var collectionNormalExpression = {
1851
1828
  return coll.split('').every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1852
1829
  return Object.entries(coll).every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1853
1830
  },
1854
- validate: function (node) { return assertNumberOfParams(2, node); },
1831
+ paramCount: 2,
1855
1832
  },
1856
1833
  'any?': {
1857
1834
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1865,7 +1842,7 @@ var collectionNormalExpression = {
1865
1842
  return coll.split('').some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1866
1843
  return Object.entries(coll).some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1867
1844
  },
1868
- validate: function (node) { return assertNumberOfParams(2, node); },
1845
+ paramCount: 2,
1869
1846
  },
1870
1847
  'not_any?': {
1871
1848
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1879,7 +1856,7 @@ var collectionNormalExpression = {
1879
1856
  return !coll.split('').some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1880
1857
  return !Object.entries(coll).some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1881
1858
  },
1882
- validate: function (node) { return assertNumberOfParams(2, node); },
1859
+ paramCount: 2,
1883
1860
  },
1884
1861
  'not_every?': {
1885
1862
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1893,13 +1870,14 @@ var collectionNormalExpression = {
1893
1870
  return !coll.split('').every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1894
1871
  return !Object.entries(coll).every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1895
1872
  },
1896
- validate: function (node) { return assertNumberOfParams(2, node); },
1873
+ paramCount: 2,
1897
1874
  },
1898
1875
  };
1899
1876
 
1900
1877
  var arrayNormalExpression = {
1901
1878
  array: {
1902
1879
  evaluate: function (params) { return params; },
1880
+ paramCount: {},
1903
1881
  },
1904
1882
  range: {
1905
1883
  evaluate: function (params, sourceCodeInfo) {
@@ -1937,7 +1915,7 @@ var arrayNormalExpression = {
1937
1915
  result.push(i);
1938
1916
  return result;
1939
1917
  },
1940
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 3 }, node); },
1918
+ paramCount: { min: 1, max: 3 },
1941
1919
  },
1942
1920
  repeat: {
1943
1921
  evaluate: function (_a, sourceCodeInfo) {
@@ -1948,7 +1926,7 @@ var arrayNormalExpression = {
1948
1926
  result.push(value);
1949
1927
  return result;
1950
1928
  },
1951
- validate: function (node) { return assertNumberOfParams(2, node); },
1929
+ paramCount: 2,
1952
1930
  },
1953
1931
  flatten: {
1954
1932
  evaluate: function (_a) {
@@ -1957,7 +1935,7 @@ var arrayNormalExpression = {
1957
1935
  return [];
1958
1936
  return seq.flat(Number.POSITIVE_INFINITY);
1959
1937
  },
1960
- validate: function (node) { return assertNumberOfParams(1, node); },
1938
+ paramCount: 1,
1961
1939
  },
1962
1940
  mapcat: {
1963
1941
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1967,7 +1945,7 @@ var arrayNormalExpression = {
1967
1945
  assertLitsFunction(fn, sourceCodeInfo);
1968
1946
  return arr.map(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); }).flat(1);
1969
1947
  },
1970
- validate: function (node) { return assertNumberOfParams(2, node); },
1948
+ paramCount: 2,
1971
1949
  },
1972
1950
  };
1973
1951
 
@@ -1982,7 +1960,7 @@ var sequenceNormalExpression = {
1982
1960
  assertSeq(seq, sourceCodeInfo);
1983
1961
  return i >= 0 && i < seq.length ? toAny(seq[i]) : defaultValue;
1984
1962
  },
1985
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
1963
+ paramCount: { min: 2, max: 3 },
1986
1964
  },
1987
1965
  'filter': {
1988
1966
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1997,7 +1975,7 @@ var sequenceNormalExpression = {
1997
1975
  .filter(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); })
1998
1976
  .join('');
1999
1977
  },
2000
- validate: function (node) { return assertNumberOfParams(2, node); },
1978
+ paramCount: 2,
2001
1979
  },
2002
1980
  'first': {
2003
1981
  evaluate: function (_a, sourceCodeInfo) {
@@ -2007,7 +1985,7 @@ var sequenceNormalExpression = {
2007
1985
  assertSeq(array, sourceCodeInfo);
2008
1986
  return toAny(array[0]);
2009
1987
  },
2010
- validate: function (node) { return assertNumberOfParams(1, node); },
1988
+ paramCount: 1,
2011
1989
  },
2012
1990
  'last': {
2013
1991
  evaluate: function (_a, sourceCodeInfo) {
@@ -2017,7 +1995,7 @@ var sequenceNormalExpression = {
2017
1995
  assertSeq(array, sourceCodeInfo);
2018
1996
  return toAny(array[array.length - 1]);
2019
1997
  },
2020
- validate: function (node) { return assertNumberOfParams(1, node); },
1998
+ paramCount: 1,
2021
1999
  },
2022
2000
  'map': {
2023
2001
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2039,7 +2017,7 @@ var sequenceNormalExpression = {
2039
2017
  .join('');
2040
2018
  }
2041
2019
  },
2042
- validate: function (node) { return assertNumberOfParams(2, node); },
2020
+ paramCount: 2,
2043
2021
  },
2044
2022
  'pop': {
2045
2023
  evaluate: function (_a, sourceCodeInfo) {
@@ -2050,7 +2028,7 @@ var sequenceNormalExpression = {
2050
2028
  }
2051
2029
  return seq.slice(0, seq.length - 1);
2052
2030
  },
2053
- validate: function (node) { return assertNumberOfParams(1, node); },
2031
+ paramCount: 1,
2054
2032
  },
2055
2033
  'position': {
2056
2034
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2069,7 +2047,7 @@ var sequenceNormalExpression = {
2069
2047
  return index !== -1 ? index : null;
2070
2048
  }
2071
2049
  },
2072
- validate: function (node) { return assertNumberOfParams(2, node); },
2050
+ paramCount: 2,
2073
2051
  },
2074
2052
  'index_of': {
2075
2053
  evaluate: function (_a, sourceCodeInfo) {
@@ -2088,7 +2066,7 @@ var sequenceNormalExpression = {
2088
2066
  return index !== -1 ? index : null;
2089
2067
  }
2090
2068
  },
2091
- validate: function (node) { return assertNumberOfParams(2, node); },
2069
+ paramCount: 2,
2092
2070
  },
2093
2071
  'last_index_of': {
2094
2072
  evaluate: function (_a, sourceCodeInfo) {
@@ -2107,7 +2085,7 @@ var sequenceNormalExpression = {
2107
2085
  return index !== -1 ? index : null;
2108
2086
  }
2109
2087
  },
2110
- validate: function (node) { return assertNumberOfParams(2, node); },
2088
+ paramCount: 2,
2111
2089
  },
2112
2090
  'push': {
2113
2091
  evaluate: function (_a, sourceCodeInfo) {
@@ -2121,7 +2099,7 @@ var sequenceNormalExpression = {
2121
2099
  return __spreadArray(__spreadArray([], __read(seq), false), __read(values), false);
2122
2100
  }
2123
2101
  },
2124
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
2102
+ paramCount: { min: 2 },
2125
2103
  },
2126
2104
  'reductions': {
2127
2105
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2182,7 +2160,7 @@ var sequenceNormalExpression = {
2182
2160
  }
2183
2161
  }
2184
2162
  },
2185
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2163
+ paramCount: { min: 2, max: 3 },
2186
2164
  },
2187
2165
  'reduce': {
2188
2166
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2229,7 +2207,7 @@ var sequenceNormalExpression = {
2229
2207
  }
2230
2208
  }
2231
2209
  },
2232
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2210
+ paramCount: { min: 2, max: 3 },
2233
2211
  },
2234
2212
  'reduce_right': {
2235
2213
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2277,7 +2255,7 @@ var sequenceNormalExpression = {
2277
2255
  }
2278
2256
  }
2279
2257
  },
2280
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2258
+ paramCount: { min: 2, max: 3 },
2281
2259
  },
2282
2260
  'rest': {
2283
2261
  evaluate: function (_a, sourceCodeInfo) {
@@ -2290,7 +2268,7 @@ var sequenceNormalExpression = {
2290
2268
  }
2291
2269
  return seq.substring(1);
2292
2270
  },
2293
- validate: function (node) { return assertNumberOfParams(1, node); },
2271
+ paramCount: 1,
2294
2272
  },
2295
2273
  'nthrest': {
2296
2274
  evaluate: function (_a, sourceCodeInfo) {
@@ -2302,7 +2280,7 @@ var sequenceNormalExpression = {
2302
2280
  return seq.slice(integerCount);
2303
2281
  return seq.substring(integerCount);
2304
2282
  },
2305
- validate: function (node) { return assertNumberOfParams(2, node); },
2283
+ paramCount: 2,
2306
2284
  },
2307
2285
  'next': {
2308
2286
  evaluate: function (_a, sourceCodeInfo) {
@@ -2317,7 +2295,7 @@ var sequenceNormalExpression = {
2317
2295
  return null;
2318
2296
  return seq.substring(1);
2319
2297
  },
2320
- validate: function (node) { return assertNumberOfParams(1, node); },
2298
+ paramCount: 1,
2321
2299
  },
2322
2300
  'nthnext': {
2323
2301
  evaluate: function (_a, sourceCodeInfo) {
@@ -2331,7 +2309,7 @@ var sequenceNormalExpression = {
2331
2309
  return seq.slice(integerCount);
2332
2310
  return seq.substring(integerCount);
2333
2311
  },
2334
- validate: function (node) { return assertNumberOfParams(2, node); },
2312
+ paramCount: 2,
2335
2313
  },
2336
2314
  'reverse': {
2337
2315
  evaluate: function (_a, sourceCodeInfo) {
@@ -2343,7 +2321,7 @@ var sequenceNormalExpression = {
2343
2321
  return __spreadArray([], __read(seq), false).reverse();
2344
2322
  return seq.split('').reverse().join('');
2345
2323
  },
2346
- validate: function (node) { return assertNumberOfParams(1, node); },
2324
+ paramCount: 1,
2347
2325
  },
2348
2326
  'second': {
2349
2327
  evaluate: function (_a, sourceCodeInfo) {
@@ -2353,7 +2331,7 @@ var sequenceNormalExpression = {
2353
2331
  assertSeq(seq, sourceCodeInfo);
2354
2332
  return toAny(seq[1]);
2355
2333
  },
2356
- validate: function (node) { return assertNumberOfParams(1, node); },
2334
+ paramCount: 1,
2357
2335
  },
2358
2336
  'shift': {
2359
2337
  evaluate: function (_a, sourceCodeInfo) {
@@ -2365,7 +2343,7 @@ var sequenceNormalExpression = {
2365
2343
  copy.shift();
2366
2344
  return copy;
2367
2345
  },
2368
- validate: function (node) { return assertNumberOfParams(1, node); },
2346
+ paramCount: 1,
2369
2347
  },
2370
2348
  'slice': {
2371
2349
  evaluate: function (params, sourceCodeInfo) {
@@ -2379,7 +2357,7 @@ var sequenceNormalExpression = {
2379
2357
  assertNumber(to, sourceCodeInfo, { integer: true });
2380
2358
  return seq.slice(from, to);
2381
2359
  },
2382
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 3 }, node); },
2360
+ paramCount: { min: 1, max: 3 },
2383
2361
  },
2384
2362
  'some': {
2385
2363
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2396,7 +2374,7 @@ var sequenceNormalExpression = {
2396
2374
  return (_c = seq.split('').find(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); })) !== null && _c !== void 0 ? _c : null;
2397
2375
  return toAny(seq.find(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); }));
2398
2376
  },
2399
- validate: function (node) { return assertNumberOfParams(2, node); },
2377
+ paramCount: 2,
2400
2378
  },
2401
2379
  'sort': {
2402
2380
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2434,7 +2412,7 @@ var sequenceNormalExpression = {
2434
2412
  }
2435
2413
  return result;
2436
2414
  },
2437
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
2415
+ paramCount: { min: 1, max: 2 },
2438
2416
  },
2439
2417
  'sort_by': {
2440
2418
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2485,7 +2463,7 @@ var sequenceNormalExpression = {
2485
2463
  }
2486
2464
  return result;
2487
2465
  },
2488
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2466
+ paramCount: { min: 2, max: 3 },
2489
2467
  },
2490
2468
  'take': {
2491
2469
  evaluate: function (_a, sourceCodeInfo) {
@@ -2495,7 +2473,7 @@ var sequenceNormalExpression = {
2495
2473
  var num = Math.max(Math.ceil(n), 0);
2496
2474
  return input.slice(0, num);
2497
2475
  },
2498
- validate: function (node) { return assertNumberOfParams(2, node); },
2476
+ paramCount: 2,
2499
2477
  },
2500
2478
  'take_last': {
2501
2479
  evaluate: function (_a, sourceCodeInfo) {
@@ -2506,7 +2484,7 @@ var sequenceNormalExpression = {
2506
2484
  var from = array.length - num;
2507
2485
  return array.slice(from);
2508
2486
  },
2509
- validate: function (node) { return assertNumberOfParams(2, node); },
2487
+ paramCount: 2,
2510
2488
  },
2511
2489
  'take_while': {
2512
2490
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2534,7 +2512,7 @@ var sequenceNormalExpression = {
2534
2512
  }
2535
2513
  return typeof seq === 'string' ? result.join('') : result;
2536
2514
  },
2537
- validate: function (node) { return assertNumberOfParams(2, node); },
2515
+ paramCount: 2,
2538
2516
  },
2539
2517
  'drop': {
2540
2518
  evaluate: function (_a, sourceCodeInfo) {
@@ -2544,7 +2522,7 @@ var sequenceNormalExpression = {
2544
2522
  assertSeq(input, sourceCodeInfo);
2545
2523
  return input.slice(num);
2546
2524
  },
2547
- validate: function (node) { return assertNumberOfParams(2, node); },
2525
+ paramCount: 2,
2548
2526
  },
2549
2527
  'drop_last': {
2550
2528
  evaluate: function (_a, sourceCodeInfo) {
@@ -2555,7 +2533,7 @@ var sequenceNormalExpression = {
2555
2533
  var from = array.length - num;
2556
2534
  return array.slice(0, from);
2557
2535
  },
2558
- validate: function (node) { return assertNumberOfParams(2, node); },
2536
+ paramCount: 2,
2559
2537
  },
2560
2538
  'drop_while': {
2561
2539
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2571,7 +2549,7 @@ var sequenceNormalExpression = {
2571
2549
  var from = charArray.findIndex(function (elem) { return !executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
2572
2550
  return charArray.slice(from).join('');
2573
2551
  },
2574
- validate: function (node) { return assertNumberOfParams(2, node); },
2552
+ paramCount: 2,
2575
2553
  },
2576
2554
  'unshift': {
2577
2555
  evaluate: function (_a, sourceCodeInfo) {
@@ -2585,7 +2563,7 @@ var sequenceNormalExpression = {
2585
2563
  copy.unshift.apply(copy, __spreadArray([], __read(values), false));
2586
2564
  return copy;
2587
2565
  },
2588
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
2566
+ paramCount: { min: 2 },
2589
2567
  },
2590
2568
  'distinct': {
2591
2569
  evaluate: function (_a, sourceCodeInfo) {
@@ -2595,7 +2573,7 @@ var sequenceNormalExpression = {
2595
2573
  return Array.from(new Set(input));
2596
2574
  return Array.from(new Set(input.split(''))).join('');
2597
2575
  },
2598
- validate: function (node) { return assertNumberOfParams(1, node); },
2576
+ paramCount: 1,
2599
2577
  },
2600
2578
  'remove': {
2601
2579
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2610,7 +2588,7 @@ var sequenceNormalExpression = {
2610
2588
  .filter(function (elem) { return !executeFunction(fn, [elem], contextStack, sourceCodeInfo); })
2611
2589
  .join('');
2612
2590
  },
2613
- validate: function (node) { return assertNumberOfParams(2, node); },
2591
+ paramCount: 2,
2614
2592
  },
2615
2593
  'remove_at': {
2616
2594
  evaluate: function (_a, sourceCodeInfo) {
@@ -2627,7 +2605,7 @@ var sequenceNormalExpression = {
2627
2605
  }
2628
2606
  return "".concat(input.substring(0, index)).concat(input.substring(index + 1));
2629
2607
  },
2630
- validate: function (node) { return assertNumberOfParams(2, node); },
2608
+ paramCount: 2,
2631
2609
  },
2632
2610
  'split_at': {
2633
2611
  evaluate: function (_a, sourceCodeInfo) {
@@ -2637,7 +2615,7 @@ var sequenceNormalExpression = {
2637
2615
  assertSeq(seq, sourceCodeInfo);
2638
2616
  return [seq.slice(0, intPos), seq.slice(intPos)];
2639
2617
  },
2640
- validate: function (node) { return assertNumberOfParams(2, node); },
2618
+ paramCount: 2,
2641
2619
  },
2642
2620
  'split_with': {
2643
2621
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2652,7 +2630,7 @@ var sequenceNormalExpression = {
2652
2630
  return [seq, seqIsArray ? [] : ''];
2653
2631
  return [seq.slice(0, index), seq.slice(index)];
2654
2632
  },
2655
- validate: function (node) { return assertNumberOfParams(2, node); },
2633
+ paramCount: 2,
2656
2634
  },
2657
2635
  'frequencies': {
2658
2636
  evaluate: function (_a, sourceCodeInfo) {
@@ -2668,7 +2646,7 @@ var sequenceNormalExpression = {
2668
2646
  return result;
2669
2647
  }, {});
2670
2648
  },
2671
- validate: function (node) { return assertNumberOfParams(1, node); },
2649
+ paramCount: 1,
2672
2650
  },
2673
2651
  'group_by': {
2674
2652
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2686,7 +2664,7 @@ var sequenceNormalExpression = {
2686
2664
  return result;
2687
2665
  }, {});
2688
2666
  },
2689
- validate: function (node) { return assertNumberOfParams(2, node); },
2667
+ paramCount: 2,
2690
2668
  },
2691
2669
  'partition': {
2692
2670
  evaluate: function (params, sourceCodeInfo) {
@@ -2698,7 +2676,7 @@ var sequenceNormalExpression = {
2698
2676
  : undefined;
2699
2677
  return partition(n, step, seq, pad, sourceCodeInfo);
2700
2678
  },
2701
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 4 }, node); },
2679
+ paramCount: { min: 2, max: 4 },
2702
2680
  },
2703
2681
  'partition_all': {
2704
2682
  evaluate: function (params, sourceCodeInfo) {
@@ -2707,7 +2685,7 @@ var sequenceNormalExpression = {
2707
2685
  var step = params.length === 3 ? toNonNegativeInteger(asNumber(params[2], sourceCodeInfo)) : n;
2708
2686
  return partition(n, step, seq, [], sourceCodeInfo);
2709
2687
  },
2710
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2688
+ paramCount: { min: 2, max: 3 },
2711
2689
  },
2712
2690
  'partition_by': {
2713
2691
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2728,7 +2706,7 @@ var sequenceNormalExpression = {
2728
2706
  }, []);
2729
2707
  return isStringSeq ? result.map(function (elem) { return elem.join(''); }) : result;
2730
2708
  },
2731
- validate: function (node) { return assertNumberOfParams(2, node); },
2709
+ paramCount: 2,
2732
2710
  },
2733
2711
  'ends_with?': {
2734
2712
  evaluate: function (_a, sourceCodeInfo) {
@@ -2740,7 +2718,7 @@ var sequenceNormalExpression = {
2740
2718
  }
2741
2719
  return str.at(-1) === search;
2742
2720
  },
2743
- validate: function (node) { return assertNumberOfParams(2, node); },
2721
+ paramCount: 2,
2744
2722
  },
2745
2723
  'starts_with?': {
2746
2724
  evaluate: function (_a, sourceCodeInfo) {
@@ -2752,7 +2730,7 @@ var sequenceNormalExpression = {
2752
2730
  }
2753
2731
  return str[0] === search;
2754
2732
  },
2755
- validate: function (node) { return assertNumberOfParams(2, node); },
2733
+ paramCount: 2,
2756
2734
  },
2757
2735
  'interleave': {
2758
2736
  evaluate: function (_a, sourceCodeInfo) {
@@ -2790,7 +2768,7 @@ var sequenceNormalExpression = {
2790
2768
  }
2791
2769
  return isStringSeq ? result.join('') : result;
2792
2770
  },
2793
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
2771
+ paramCount: { min: 1 },
2794
2772
  },
2795
2773
  'interpose': {
2796
2774
  evaluate: function (_a, sourceCodeInfo) {
@@ -2809,7 +2787,7 @@ var sequenceNormalExpression = {
2809
2787
  result.push(seq[seq.length - 1]);
2810
2788
  return result;
2811
2789
  },
2812
- validate: function (node) { return assertNumberOfParams(2, node); },
2790
+ paramCount: 2,
2813
2791
  },
2814
2792
  };
2815
2793
  function partition(n, step, seq, pad, sourceCodeInfo) {
@@ -2847,7 +2825,7 @@ var mathNormalExpression = {
2847
2825
  assertNumber(first, sourceCodeInfo);
2848
2826
  return first + 1;
2849
2827
  },
2850
- validate: function (node) { return assertNumberOfParams(1, node); },
2828
+ paramCount: 1,
2851
2829
  },
2852
2830
  'dec': {
2853
2831
  evaluate: function (_a, sourceCodeInfo) {
@@ -2855,7 +2833,7 @@ var mathNormalExpression = {
2855
2833
  assertNumber(first, sourceCodeInfo);
2856
2834
  return first - 1;
2857
2835
  },
2858
- validate: function (node) { return assertNumberOfParams(1, node); },
2836
+ paramCount: 1,
2859
2837
  },
2860
2838
  '+': {
2861
2839
  evaluate: function (params, sourceCodeInfo) {
@@ -2864,6 +2842,7 @@ var mathNormalExpression = {
2864
2842
  return result + param;
2865
2843
  }, 0);
2866
2844
  },
2845
+ paramCount: {},
2867
2846
  },
2868
2847
  '*': {
2869
2848
  evaluate: function (params, sourceCodeInfo) {
@@ -2872,6 +2851,7 @@ var mathNormalExpression = {
2872
2851
  return result * param;
2873
2852
  }, 1);
2874
2853
  },
2854
+ paramCount: {},
2875
2855
  },
2876
2856
  '/': {
2877
2857
  evaluate: function (params, sourceCodeInfo) {
@@ -2888,6 +2868,7 @@ var mathNormalExpression = {
2888
2868
  return result / param;
2889
2869
  }, first);
2890
2870
  },
2871
+ paramCount: {},
2891
2872
  },
2892
2873
  '-': {
2893
2874
  evaluate: function (params, sourceCodeInfo) {
@@ -2902,6 +2883,7 @@ var mathNormalExpression = {
2902
2883
  return result - param;
2903
2884
  }, first);
2904
2885
  },
2886
+ paramCount: {},
2905
2887
  },
2906
2888
  'quot': {
2907
2889
  evaluate: function (_a, sourceCodeInfo) {
@@ -2911,7 +2893,7 @@ var mathNormalExpression = {
2911
2893
  var quotient = Math.trunc(dividend / divisor);
2912
2894
  return quotient;
2913
2895
  },
2914
- validate: function (node) { return assertNumberOfParams(2, node); },
2896
+ paramCount: 2,
2915
2897
  },
2916
2898
  'mod': {
2917
2899
  evaluate: function (_a, sourceCodeInfo) {
@@ -2921,7 +2903,7 @@ var mathNormalExpression = {
2921
2903
  var quotient = Math.floor(dividend / divisor);
2922
2904
  return dividend - divisor * quotient;
2923
2905
  },
2924
- validate: function (node) { return assertNumberOfParams(2, node); },
2906
+ paramCount: 2,
2925
2907
  },
2926
2908
  '%': {
2927
2909
  evaluate: function (_a, sourceCodeInfo) {
@@ -2931,7 +2913,7 @@ var mathNormalExpression = {
2931
2913
  var quotient = Math.trunc(dividend / divisor);
2932
2914
  return dividend - divisor * quotient;
2933
2915
  },
2934
- validate: function (node) { return assertNumberOfParams(2, node); },
2916
+ paramCount: 2,
2935
2917
  },
2936
2918
  'sqrt': {
2937
2919
  evaluate: function (_a, sourceCodeInfo) {
@@ -2939,7 +2921,7 @@ var mathNormalExpression = {
2939
2921
  assertNumber(first, sourceCodeInfo);
2940
2922
  return Math.sqrt(first);
2941
2923
  },
2942
- validate: function (node) { return assertNumberOfParams(1, node); },
2924
+ paramCount: 1,
2943
2925
  },
2944
2926
  'cbrt': {
2945
2927
  evaluate: function (_a, sourceCodeInfo) {
@@ -2947,7 +2929,7 @@ var mathNormalExpression = {
2947
2929
  assertNumber(first, sourceCodeInfo);
2948
2930
  return Math.cbrt(first);
2949
2931
  },
2950
- validate: function (node) { return assertNumberOfParams(1, node); },
2932
+ paramCount: 1,
2951
2933
  },
2952
2934
  '**': {
2953
2935
  evaluate: function (_a, sourceCodeInfo) {
@@ -2956,7 +2938,7 @@ var mathNormalExpression = {
2956
2938
  assertNumber(second, sourceCodeInfo);
2957
2939
  return Math.pow(first, second);
2958
2940
  },
2959
- validate: function (node) { return assertNumberOfParams(2, node); },
2941
+ paramCount: 2,
2960
2942
  },
2961
2943
  'round': {
2962
2944
  evaluate: function (params, sourceCodeInfo) {
@@ -2968,7 +2950,7 @@ var mathNormalExpression = {
2968
2950
  var factor = Math.pow(10, decimals);
2969
2951
  return Math.round(value * factor) / factor;
2970
2952
  },
2971
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
2953
+ paramCount: { min: 1, max: 2 },
2972
2954
  },
2973
2955
  'trunc': {
2974
2956
  evaluate: function (_a, sourceCodeInfo) {
@@ -2976,7 +2958,7 @@ var mathNormalExpression = {
2976
2958
  assertNumber(first, sourceCodeInfo);
2977
2959
  return Math.trunc(first);
2978
2960
  },
2979
- validate: function (node) { return assertNumberOfParams(1, node); },
2961
+ paramCount: 1,
2980
2962
  },
2981
2963
  'floor': {
2982
2964
  evaluate: function (_a, sourceCodeInfo) {
@@ -2984,7 +2966,7 @@ var mathNormalExpression = {
2984
2966
  assertNumber(first, sourceCodeInfo);
2985
2967
  return Math.floor(first);
2986
2968
  },
2987
- validate: function (node) { return assertNumberOfParams(1, node); },
2969
+ paramCount: 1,
2988
2970
  },
2989
2971
  'ceil': {
2990
2972
  evaluate: function (_a, sourceCodeInfo) {
@@ -2992,7 +2974,7 @@ var mathNormalExpression = {
2992
2974
  assertNumber(first, sourceCodeInfo);
2993
2975
  return Math.ceil(first);
2994
2976
  },
2995
- validate: function (node) { return assertNumberOfParams(1, node); },
2977
+ paramCount: 1,
2996
2978
  },
2997
2979
  'min': {
2998
2980
  evaluate: function (_a, sourceCodeInfo) {
@@ -3005,7 +2987,7 @@ var mathNormalExpression = {
3005
2987
  return Math.min(min, value);
3006
2988
  }, first);
3007
2989
  },
3008
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
2990
+ paramCount: { min: 1 },
3009
2991
  },
3010
2992
  'max': {
3011
2993
  evaluate: function (_a, sourceCodeInfo) {
@@ -3018,7 +3000,7 @@ var mathNormalExpression = {
3018
3000
  return Math.max(min, value);
3019
3001
  }, first);
3020
3002
  },
3021
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3003
+ paramCount: { min: 1 },
3022
3004
  },
3023
3005
  'abs': {
3024
3006
  evaluate: function (_a, sourceCodeInfo) {
@@ -3026,7 +3008,7 @@ var mathNormalExpression = {
3026
3008
  assertNumber(value, sourceCodeInfo);
3027
3009
  return Math.abs(value);
3028
3010
  },
3029
- validate: function (node) { return assertNumberOfParams(1, node); },
3011
+ paramCount: 1,
3030
3012
  },
3031
3013
  'sign': {
3032
3014
  evaluate: function (_a, sourceCodeInfo) {
@@ -3034,67 +3016,67 @@ var mathNormalExpression = {
3034
3016
  assertNumber(value, sourceCodeInfo);
3035
3017
  return Math.sign(value);
3036
3018
  },
3037
- validate: function (node) { return assertNumberOfParams(1, node); },
3019
+ paramCount: 1,
3038
3020
  },
3039
3021
  'max_safe_integer': {
3040
3022
  evaluate: function () {
3041
3023
  return Number.MAX_SAFE_INTEGER;
3042
3024
  },
3043
- validate: function (node) { return assertNumberOfParams(0, node); },
3025
+ paramCount: 0,
3044
3026
  },
3045
3027
  'min_safe_integer': {
3046
3028
  evaluate: function () {
3047
3029
  return Number.MIN_SAFE_INTEGER;
3048
3030
  },
3049
- validate: function (node) { return assertNumberOfParams(0, node); },
3031
+ paramCount: 0,
3050
3032
  },
3051
3033
  'max_value': {
3052
3034
  evaluate: function () {
3053
3035
  return Number.MAX_VALUE;
3054
3036
  },
3055
- validate: function (node) { return assertNumberOfParams(0, node); },
3037
+ paramCount: 0,
3056
3038
  },
3057
3039
  'min_value': {
3058
3040
  evaluate: function () {
3059
3041
  return Number.MIN_VALUE;
3060
3042
  },
3061
- validate: function (node) { return assertNumberOfParams(0, node); },
3043
+ paramCount: 0,
3062
3044
  },
3063
3045
  'epsilon': {
3064
3046
  evaluate: function () {
3065
3047
  return Number.EPSILON;
3066
3048
  },
3067
- validate: function (node) { return assertNumberOfParams(0, node); },
3049
+ paramCount: 0,
3068
3050
  },
3069
3051
  'positive_infinity': {
3070
3052
  evaluate: function () {
3071
3053
  return Number.POSITIVE_INFINITY;
3072
3054
  },
3073
- validate: function (node) { return assertNumberOfParams(0, node); },
3055
+ paramCount: 0,
3074
3056
  },
3075
3057
  'negative_infinity': {
3076
3058
  evaluate: function () {
3077
3059
  return Number.NEGATIVE_INFINITY;
3078
3060
  },
3079
- validate: function (node) { return assertNumberOfParams(0, node); },
3061
+ paramCount: 0,
3080
3062
  },
3081
3063
  'nan': {
3082
3064
  evaluate: function () {
3083
3065
  return Number.NaN;
3084
3066
  },
3085
- validate: function (node) { return assertNumberOfParams(0, node); },
3067
+ paramCount: 0,
3086
3068
  },
3087
3069
  'e': {
3088
3070
  evaluate: function () {
3089
3071
  return Math.E;
3090
3072
  },
3091
- validate: function (node) { return assertNumberOfParams(0, node); },
3073
+ paramCount: 0,
3092
3074
  },
3093
3075
  'pi': {
3094
3076
  evaluate: function () {
3095
3077
  return Math.PI;
3096
3078
  },
3097
- validate: function (node) { return assertNumberOfParams(0, node); },
3079
+ paramCount: 0,
3098
3080
  },
3099
3081
  'exp': {
3100
3082
  evaluate: function (_a, sourceCodeInfo) {
@@ -3102,7 +3084,7 @@ var mathNormalExpression = {
3102
3084
  assertNumber(value, sourceCodeInfo);
3103
3085
  return Math.exp(value);
3104
3086
  },
3105
- validate: function (node) { return assertNumberOfParams(1, node); },
3087
+ paramCount: 1,
3106
3088
  },
3107
3089
  'log': {
3108
3090
  evaluate: function (_a, sourceCodeInfo) {
@@ -3110,7 +3092,7 @@ var mathNormalExpression = {
3110
3092
  assertNumber(value, sourceCodeInfo);
3111
3093
  return Math.log(value);
3112
3094
  },
3113
- validate: function (node) { return assertNumberOfParams(1, node); },
3095
+ paramCount: 1,
3114
3096
  },
3115
3097
  'log2': {
3116
3098
  evaluate: function (_a, sourceCodeInfo) {
@@ -3118,7 +3100,7 @@ var mathNormalExpression = {
3118
3100
  assertNumber(value, sourceCodeInfo);
3119
3101
  return Math.log2(value);
3120
3102
  },
3121
- validate: function (node) { return assertNumberOfParams(1, node); },
3103
+ paramCount: 1,
3122
3104
  },
3123
3105
  'log10': {
3124
3106
  evaluate: function (_a, sourceCodeInfo) {
@@ -3126,7 +3108,7 @@ var mathNormalExpression = {
3126
3108
  assertNumber(value, sourceCodeInfo);
3127
3109
  return Math.log10(value);
3128
3110
  },
3129
- validate: function (node) { return assertNumberOfParams(1, node); },
3111
+ paramCount: 1,
3130
3112
  },
3131
3113
  'sin': {
3132
3114
  evaluate: function (_a, sourceCodeInfo) {
@@ -3134,7 +3116,7 @@ var mathNormalExpression = {
3134
3116
  assertNumber(value, sourceCodeInfo);
3135
3117
  return Math.sin(value);
3136
3118
  },
3137
- validate: function (node) { return assertNumberOfParams(1, node); },
3119
+ paramCount: 1,
3138
3120
  },
3139
3121
  'asin': {
3140
3122
  evaluate: function (_a, sourceCodeInfo) {
@@ -3142,7 +3124,7 @@ var mathNormalExpression = {
3142
3124
  assertNumber(value, sourceCodeInfo);
3143
3125
  return Math.asin(value);
3144
3126
  },
3145
- validate: function (node) { return assertNumberOfParams(1, node); },
3127
+ paramCount: 1,
3146
3128
  },
3147
3129
  'sinh': {
3148
3130
  evaluate: function (_a, sourceCodeInfo) {
@@ -3150,7 +3132,7 @@ var mathNormalExpression = {
3150
3132
  assertNumber(value, sourceCodeInfo);
3151
3133
  return Math.sinh(value);
3152
3134
  },
3153
- validate: function (node) { return assertNumberOfParams(1, node); },
3135
+ paramCount: 1,
3154
3136
  },
3155
3137
  'asinh': {
3156
3138
  evaluate: function (_a, sourceCodeInfo) {
@@ -3158,7 +3140,7 @@ var mathNormalExpression = {
3158
3140
  assertNumber(value, sourceCodeInfo);
3159
3141
  return Math.asinh(value);
3160
3142
  },
3161
- validate: function (node) { return assertNumberOfParams(1, node); },
3143
+ paramCount: 1,
3162
3144
  },
3163
3145
  'cos': {
3164
3146
  evaluate: function (_a, sourceCodeInfo) {
@@ -3166,7 +3148,7 @@ var mathNormalExpression = {
3166
3148
  assertNumber(value, sourceCodeInfo);
3167
3149
  return Math.cos(value);
3168
3150
  },
3169
- validate: function (node) { return assertNumberOfParams(1, node); },
3151
+ paramCount: 1,
3170
3152
  },
3171
3153
  'acos': {
3172
3154
  evaluate: function (_a, sourceCodeInfo) {
@@ -3174,7 +3156,7 @@ var mathNormalExpression = {
3174
3156
  assertNumber(value, sourceCodeInfo);
3175
3157
  return Math.acos(value);
3176
3158
  },
3177
- validate: function (node) { return assertNumberOfParams(1, node); },
3159
+ paramCount: 1,
3178
3160
  },
3179
3161
  'cosh': {
3180
3162
  evaluate: function (_a, sourceCodeInfo) {
@@ -3182,7 +3164,7 @@ var mathNormalExpression = {
3182
3164
  assertNumber(value, sourceCodeInfo);
3183
3165
  return Math.cosh(value);
3184
3166
  },
3185
- validate: function (node) { return assertNumberOfParams(1, node); },
3167
+ paramCount: 1,
3186
3168
  },
3187
3169
  'acosh': {
3188
3170
  evaluate: function (_a, sourceCodeInfo) {
@@ -3190,7 +3172,7 @@ var mathNormalExpression = {
3190
3172
  assertNumber(value, sourceCodeInfo);
3191
3173
  return Math.acosh(value);
3192
3174
  },
3193
- validate: function (node) { return assertNumberOfParams(1, node); },
3175
+ paramCount: 1,
3194
3176
  },
3195
3177
  'tan': {
3196
3178
  evaluate: function (_a, sourceCodeInfo) {
@@ -3198,7 +3180,7 @@ var mathNormalExpression = {
3198
3180
  assertNumber(value, sourceCodeInfo);
3199
3181
  return Math.tan(value);
3200
3182
  },
3201
- validate: function (node) { return assertNumberOfParams(1, node); },
3183
+ paramCount: 1,
3202
3184
  },
3203
3185
  'atan': {
3204
3186
  evaluate: function (_a, sourceCodeInfo) {
@@ -3206,7 +3188,7 @@ var mathNormalExpression = {
3206
3188
  assertNumber(value, sourceCodeInfo);
3207
3189
  return Math.atan(value);
3208
3190
  },
3209
- validate: function (node) { return assertNumberOfParams(1, node); },
3191
+ paramCount: 1,
3210
3192
  },
3211
3193
  'tanh': {
3212
3194
  evaluate: function (_a, sourceCodeInfo) {
@@ -3214,7 +3196,7 @@ var mathNormalExpression = {
3214
3196
  assertNumber(value, sourceCodeInfo);
3215
3197
  return Math.tanh(value);
3216
3198
  },
3217
- validate: function (node) { return assertNumberOfParams(1, node); },
3199
+ paramCount: 1,
3218
3200
  },
3219
3201
  'atanh': {
3220
3202
  evaluate: function (_a, sourceCodeInfo) {
@@ -3222,7 +3204,7 @@ var mathNormalExpression = {
3222
3204
  assertNumber(value, sourceCodeInfo);
3223
3205
  return Math.atanh(value);
3224
3206
  },
3225
- validate: function (node) { return assertNumberOfParams(1, node); },
3207
+ paramCount: 1,
3226
3208
  },
3227
3209
  };
3228
3210
 
@@ -3237,7 +3219,7 @@ var miscNormalExpression = {
3237
3219
  }
3238
3220
  return true;
3239
3221
  },
3240
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3222
+ paramCount: { min: 1 },
3241
3223
  },
3242
3224
  '==': {
3243
3225
  evaluate: function (_a) {
@@ -3259,14 +3241,14 @@ var miscNormalExpression = {
3259
3241
  }
3260
3242
  return true;
3261
3243
  },
3262
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3244
+ paramCount: { min: 1 },
3263
3245
  },
3264
3246
  'equal?': {
3265
3247
  evaluate: function (_a, sourceCodeInfo) {
3266
3248
  var _b = __read(_a, 2), a = _b[0], b = _b[1];
3267
3249
  return deepEqual(asAny(a, sourceCodeInfo), asAny(b, sourceCodeInfo), sourceCodeInfo);
3268
3250
  },
3269
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3251
+ paramCount: { min: 1 },
3270
3252
  },
3271
3253
  '>': {
3272
3254
  evaluate: function (_a) {
@@ -3290,7 +3272,7 @@ var miscNormalExpression = {
3290
3272
  }
3291
3273
  return true;
3292
3274
  },
3293
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3275
+ paramCount: { min: 1 },
3294
3276
  },
3295
3277
  '<': {
3296
3278
  evaluate: function (_a) {
@@ -3314,7 +3296,7 @@ var miscNormalExpression = {
3314
3296
  }
3315
3297
  return true;
3316
3298
  },
3317
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3299
+ paramCount: { min: 1 },
3318
3300
  },
3319
3301
  '>=': {
3320
3302
  evaluate: function (_a) {
@@ -3338,7 +3320,7 @@ var miscNormalExpression = {
3338
3320
  }
3339
3321
  return true;
3340
3322
  },
3341
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3323
+ paramCount: { min: 1 },
3342
3324
  },
3343
3325
  '<=': {
3344
3326
  evaluate: function (_a) {
@@ -3362,14 +3344,14 @@ var miscNormalExpression = {
3362
3344
  }
3363
3345
  return true;
3364
3346
  },
3365
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3347
+ paramCount: { min: 1 },
3366
3348
  },
3367
3349
  '!': {
3368
3350
  evaluate: function (_a) {
3369
3351
  var _b = __read(_a, 1), first = _b[0];
3370
3352
  return !first;
3371
3353
  },
3372
- validate: function (node) { return assertNumberOfParams(1, node); },
3354
+ paramCount: 1,
3373
3355
  },
3374
3356
  'epoch>iso_date': {
3375
3357
  evaluate: function (_a, sourceCodeInfo) {
@@ -3377,7 +3359,7 @@ var miscNormalExpression = {
3377
3359
  assertNumber(ms, sourceCodeInfo);
3378
3360
  return new Date(ms).toISOString();
3379
3361
  },
3380
- validate: function (node) { return assertNumberOfParams(1, node); },
3362
+ paramCount: 1,
3381
3363
  },
3382
3364
  'iso_date>epoch': {
3383
3365
  evaluate: function (_a, sourceCodeInfo) {
@@ -3387,7 +3369,7 @@ var miscNormalExpression = {
3387
3369
  assertNumber(ms, sourceCodeInfo, { finite: true });
3388
3370
  return ms;
3389
3371
  },
3390
- validate: function (node) { return assertNumberOfParams(1, node); },
3372
+ paramCount: 1,
3391
3373
  },
3392
3374
  'write!': {
3393
3375
  evaluate: function (params, sourceCodeInfo) {
@@ -3397,20 +3379,21 @@ var miscNormalExpression = {
3397
3379
  return asAny(params[params.length - 1], sourceCodeInfo);
3398
3380
  return null;
3399
3381
  },
3382
+ paramCount: {},
3400
3383
  },
3401
3384
  'boolean': {
3402
3385
  evaluate: function (_a) {
3403
3386
  var _b = __read(_a, 1), value = _b[0];
3404
3387
  return !!value;
3405
3388
  },
3406
- validate: function (node) { return assertNumberOfParams(1, node); },
3389
+ paramCount: 1,
3407
3390
  },
3408
3391
  'compare': {
3409
3392
  evaluate: function (_a) {
3410
3393
  var _b = __read(_a, 2), a = _b[0], b = _b[1];
3411
3394
  return compare(a, b);
3412
3395
  },
3413
- validate: function (node) { return assertNumberOfParams(2, node); },
3396
+ paramCount: 2,
3414
3397
  },
3415
3398
  'json_parse': {
3416
3399
  evaluate: function (_a, sourceCodeInfo) {
@@ -3419,7 +3402,7 @@ var miscNormalExpression = {
3419
3402
  // eslint-disable-next-line ts/no-unsafe-return
3420
3403
  return JSON.parse(first);
3421
3404
  },
3422
- validate: function (node) { return assertNumberOfParams(1, node); },
3405
+ paramCount: 1,
3423
3406
  },
3424
3407
  'json_stringify': {
3425
3408
  evaluate: function (_a, sourceCodeInfo) {
@@ -3430,7 +3413,7 @@ var miscNormalExpression = {
3430
3413
  assertNumber(second, sourceCodeInfo);
3431
3414
  return JSON.stringify(first, null, second);
3432
3415
  },
3433
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3416
+ paramCount: { min: 1, max: 2 },
3434
3417
  },
3435
3418
  };
3436
3419
 
@@ -3444,7 +3427,7 @@ var assertNormalExpression = {
3444
3427
  throw new AssertionError(message, sourceCodeInfo);
3445
3428
  return asAny(value, sourceCodeInfo);
3446
3429
  },
3447
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3430
+ paramCount: { min: 1, max: 2 },
3448
3431
  },
3449
3432
  'assert=': {
3450
3433
  evaluate: function (_a, sourceCodeInfo) {
@@ -3454,7 +3437,7 @@ var assertNormalExpression = {
3454
3437
  throw new AssertionError("Expected ".concat(first, " to be ").concat(second, ".").concat(message), sourceCodeInfo);
3455
3438
  return null;
3456
3439
  },
3457
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3440
+ paramCount: { min: 2, max: 3 },
3458
3441
  },
3459
3442
  'assert!=': {
3460
3443
  evaluate: function (_a, sourceCodeInfo) {
@@ -3464,7 +3447,7 @@ var assertNormalExpression = {
3464
3447
  throw new AssertionError("Expected ".concat(first, " not to be ").concat(second, ".").concat(message), sourceCodeInfo);
3465
3448
  return null;
3466
3449
  },
3467
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3450
+ paramCount: { min: 2, max: 3 },
3468
3451
  },
3469
3452
  'assert_equal': {
3470
3453
  evaluate: function (_a, sourceCodeInfo) {
@@ -3475,7 +3458,7 @@ var assertNormalExpression = {
3475
3458
  }
3476
3459
  return null;
3477
3460
  },
3478
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3461
+ paramCount: { min: 2, max: 3 },
3479
3462
  },
3480
3463
  'assert_not_equal': {
3481
3464
  evaluate: function (_a, sourceCodeInfo) {
@@ -3486,7 +3469,7 @@ var assertNormalExpression = {
3486
3469
  }
3487
3470
  return null;
3488
3471
  },
3489
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3472
+ paramCount: { min: 2, max: 3 },
3490
3473
  },
3491
3474
  'assert_gt': {
3492
3475
  evaluate: function (_a, sourceCodeInfo) {
@@ -3496,7 +3479,7 @@ var assertNormalExpression = {
3496
3479
  throw new AssertionError("Expected ".concat(first, " to be grater than ").concat(second, ".").concat(message), sourceCodeInfo);
3497
3480
  return null;
3498
3481
  },
3499
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3482
+ paramCount: { min: 2, max: 3 },
3500
3483
  },
3501
3484
  'assert_gte': {
3502
3485
  evaluate: function (_a, sourceCodeInfo) {
@@ -3506,7 +3489,7 @@ var assertNormalExpression = {
3506
3489
  throw new AssertionError("Expected ".concat(first, " to be grater than or equal to ").concat(second, ".").concat(message), sourceCodeInfo);
3507
3490
  return null;
3508
3491
  },
3509
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3492
+ paramCount: { min: 2, max: 3 },
3510
3493
  },
3511
3494
  'assert_lt': {
3512
3495
  evaluate: function (_a, sourceCodeInfo) {
@@ -3516,7 +3499,7 @@ var assertNormalExpression = {
3516
3499
  throw new AssertionError("Expected ".concat(first, " to be less than ").concat(second, ".").concat(message), sourceCodeInfo);
3517
3500
  return null;
3518
3501
  },
3519
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3502
+ paramCount: { min: 2, max: 3 },
3520
3503
  },
3521
3504
  'assert_lte': {
3522
3505
  evaluate: function (_a, sourceCodeInfo) {
@@ -3526,7 +3509,7 @@ var assertNormalExpression = {
3526
3509
  throw new AssertionError("Expected ".concat(first, " to be less than or equal to ").concat(second, ".").concat(message), sourceCodeInfo);
3527
3510
  return null;
3528
3511
  },
3529
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3512
+ paramCount: { min: 2, max: 3 },
3530
3513
  },
3531
3514
  'assert_true': {
3532
3515
  evaluate: function (_a, sourceCodeInfo) {
@@ -3536,7 +3519,7 @@ var assertNormalExpression = {
3536
3519
  throw new AssertionError("Expected ".concat(first, " to be true.").concat(message), sourceCodeInfo);
3537
3520
  return null;
3538
3521
  },
3539
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3522
+ paramCount: { min: 1, max: 2 },
3540
3523
  },
3541
3524
  'assert_false': {
3542
3525
  evaluate: function (_a, sourceCodeInfo) {
@@ -3546,7 +3529,7 @@ var assertNormalExpression = {
3546
3529
  throw new AssertionError("Expected ".concat(first, " to be false.").concat(message), sourceCodeInfo);
3547
3530
  return null;
3548
3531
  },
3549
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3532
+ paramCount: { min: 1, max: 2 },
3550
3533
  },
3551
3534
  'assert_truthy': {
3552
3535
  evaluate: function (_a, sourceCodeInfo) {
@@ -3556,7 +3539,7 @@ var assertNormalExpression = {
3556
3539
  throw new AssertionError("Expected ".concat(first, " to be truthy.").concat(message), sourceCodeInfo);
3557
3540
  return null;
3558
3541
  },
3559
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3542
+ paramCount: { min: 1, max: 2 },
3560
3543
  },
3561
3544
  'assert_falsy': {
3562
3545
  evaluate: function (_a, sourceCodeInfo) {
@@ -3566,7 +3549,7 @@ var assertNormalExpression = {
3566
3549
  throw new AssertionError("Expected ".concat(first, " to be falsy.").concat(message), sourceCodeInfo);
3567
3550
  return null;
3568
3551
  },
3569
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3552
+ paramCount: { min: 1, max: 2 },
3570
3553
  },
3571
3554
  'assert_null': {
3572
3555
  evaluate: function (_a, sourceCodeInfo) {
@@ -3576,7 +3559,7 @@ var assertNormalExpression = {
3576
3559
  throw new AssertionError("Expected ".concat(first, " to be nil.").concat(message), sourceCodeInfo);
3577
3560
  return null;
3578
3561
  },
3579
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3562
+ paramCount: { min: 1, max: 2 },
3580
3563
  },
3581
3564
  'assert_throws': {
3582
3565
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -3592,7 +3575,7 @@ var assertNormalExpression = {
3592
3575
  }
3593
3576
  throw new AssertionError("Expected function to throw.".concat(message), sourceCodeInfo);
3594
3577
  },
3595
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3578
+ paramCount: { min: 1, max: 2 },
3596
3579
  },
3597
3580
  'assert_throws_error': {
3598
3581
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -3613,7 +3596,7 @@ var assertNormalExpression = {
3613
3596
  }
3614
3597
  throw new AssertionError("Expected function to throw \"".concat(throwMessage, "\".").concat(message), sourceCodeInfo);
3615
3598
  },
3616
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3599
+ paramCount: { min: 2, max: 3 },
3617
3600
  },
3618
3601
  'assert_not_throws': {
3619
3602
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -3629,7 +3612,7 @@ var assertNormalExpression = {
3629
3612
  }
3630
3613
  return null;
3631
3614
  },
3632
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3615
+ paramCount: { min: 1, max: 2 },
3633
3616
  },
3634
3617
  };
3635
3618
 
@@ -3645,7 +3628,7 @@ var objectNormalExpression = {
3645
3628
  }
3646
3629
  return result;
3647
3630
  },
3648
- validate: function (node) { return assertEvenNumberOfParams(node); },
3631
+ paramCount: { even: true },
3649
3632
  },
3650
3633
  keys: {
3651
3634
  evaluate: function (_a, sourceCodeInfo) {
@@ -3653,7 +3636,7 @@ var objectNormalExpression = {
3653
3636
  assertObj(obj, sourceCodeInfo);
3654
3637
  return Object.keys(obj);
3655
3638
  },
3656
- validate: function (node) { return assertNumberOfParams(1, node); },
3639
+ paramCount: 1,
3657
3640
  },
3658
3641
  vals: {
3659
3642
  evaluate: function (_a, sourceCodeInfo) {
@@ -3661,7 +3644,7 @@ var objectNormalExpression = {
3661
3644
  assertObj(obj, sourceCodeInfo);
3662
3645
  return Object.values(obj);
3663
3646
  },
3664
- validate: function (node) { return assertNumberOfParams(1, node); },
3647
+ paramCount: 1,
3665
3648
  },
3666
3649
  entries: {
3667
3650
  evaluate: function (_a, sourceCodeInfo) {
@@ -3669,7 +3652,7 @@ var objectNormalExpression = {
3669
3652
  assertObj(obj, sourceCodeInfo);
3670
3653
  return Object.entries(obj);
3671
3654
  },
3672
- validate: function (node) { return assertNumberOfParams(1, node); },
3655
+ paramCount: 1,
3673
3656
  },
3674
3657
  find: {
3675
3658
  evaluate: function (_a, sourceCodeInfo) {
@@ -3680,7 +3663,7 @@ var objectNormalExpression = {
3680
3663
  return [key, obj[key]];
3681
3664
  return null;
3682
3665
  },
3683
- validate: function (node) { return assertNumberOfParams(2, node); },
3666
+ paramCount: 2,
3684
3667
  },
3685
3668
  dissoc: {
3686
3669
  evaluate: function (_a, sourceCodeInfo) {
@@ -3691,7 +3674,7 @@ var objectNormalExpression = {
3691
3674
  delete newObj[key];
3692
3675
  return newObj;
3693
3676
  },
3694
- validate: function (node) { return assertNumberOfParams(2, node); },
3677
+ paramCount: 2,
3695
3678
  },
3696
3679
  merge: {
3697
3680
  evaluate: function (params, sourceCodeInfo) {
@@ -3704,7 +3687,7 @@ var objectNormalExpression = {
3704
3687
  return __assign(__assign({}, result), obj);
3705
3688
  }, __assign({}, first));
3706
3689
  },
3707
- validate: function (node) { return assertNumberOfParams({ min: 0 }, node); },
3690
+ paramCount: { min: 0 },
3708
3691
  },
3709
3692
  merge_with: {
3710
3693
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -3727,7 +3710,7 @@ var objectNormalExpression = {
3727
3710
  return result;
3728
3711
  }, __assign({}, first));
3729
3712
  },
3730
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
3713
+ paramCount: { min: 2 },
3731
3714
  },
3732
3715
  zipmap: {
3733
3716
  evaluate: function (_a, sourceCodeInfo) {
@@ -3742,7 +3725,7 @@ var objectNormalExpression = {
3742
3725
  }
3743
3726
  return result;
3744
3727
  },
3745
- validate: function (node) { return assertNumberOfParams(2, node); },
3728
+ paramCount: 2,
3746
3729
  },
3747
3730
  select_keys: {
3748
3731
  evaluate: function (_a, sourceCodeInfo) {
@@ -3755,7 +3738,7 @@ var objectNormalExpression = {
3755
3738
  return result;
3756
3739
  }, {});
3757
3740
  },
3758
- validate: function (node) { return assertNumberOfParams(2, node); },
3741
+ paramCount: 2,
3759
3742
  },
3760
3743
  };
3761
3744
 
@@ -3765,42 +3748,42 @@ var predicatesNormalExpression = {
3765
3748
  var _b = __read(_a, 1), first = _b[0];
3766
3749
  return isLitsFunction(first);
3767
3750
  },
3768
- validate: function (node) { return assertNumberOfParams(1, node); },
3751
+ paramCount: 1,
3769
3752
  },
3770
3753
  'string?': {
3771
3754
  evaluate: function (_a) {
3772
3755
  var _b = __read(_a, 1), first = _b[0];
3773
3756
  return typeof first === 'string';
3774
3757
  },
3775
- validate: function (node) { return assertNumberOfParams(1, node); },
3758
+ paramCount: 1,
3776
3759
  },
3777
3760
  'number?': {
3778
3761
  evaluate: function (_a) {
3779
3762
  var _b = __read(_a, 1), first = _b[0];
3780
3763
  return typeof first === 'number';
3781
3764
  },
3782
- validate: function (node) { return assertNumberOfParams(1, node); },
3765
+ paramCount: 1,
3783
3766
  },
3784
3767
  'integer?': {
3785
3768
  evaluate: function (_a) {
3786
3769
  var _b = __read(_a, 1), first = _b[0];
3787
3770
  return typeof first === 'number' && isNumber(first, { integer: true });
3788
3771
  },
3789
- validate: function (node) { return assertNumberOfParams(1, node); },
3772
+ paramCount: 1,
3790
3773
  },
3791
3774
  'boolean?': {
3792
3775
  evaluate: function (_a) {
3793
3776
  var _b = __read(_a, 1), first = _b[0];
3794
3777
  return typeof first === 'boolean';
3795
3778
  },
3796
- validate: function (node) { return assertNumberOfParams(1, node); },
3779
+ paramCount: 1,
3797
3780
  },
3798
3781
  'nil?': {
3799
3782
  evaluate: function (_a) {
3800
3783
  var _b = __read(_a, 1), first = _b[0];
3801
3784
  return first === null || first === undefined;
3802
3785
  },
3803
- validate: function (node) { return assertNumberOfParams(1, node); },
3786
+ paramCount: 1,
3804
3787
  },
3805
3788
  'zero?': {
3806
3789
  evaluate: function (_a, sourceCodeInfo) {
@@ -3808,7 +3791,7 @@ var predicatesNormalExpression = {
3808
3791
  assertNumber(first, sourceCodeInfo, { finite: true });
3809
3792
  return first === 0;
3810
3793
  },
3811
- validate: function (node) { return assertNumberOfParams(1, node); },
3794
+ paramCount: 1,
3812
3795
  },
3813
3796
  'pos?': {
3814
3797
  evaluate: function (_a, sourceCodeInfo) {
@@ -3816,7 +3799,7 @@ var predicatesNormalExpression = {
3816
3799
  assertNumber(first, sourceCodeInfo, { finite: true });
3817
3800
  return first > 0;
3818
3801
  },
3819
- validate: function (node) { return assertNumberOfParams(1, node); },
3802
+ paramCount: 1,
3820
3803
  },
3821
3804
  'neg?': {
3822
3805
  evaluate: function (_a, sourceCodeInfo) {
@@ -3824,7 +3807,7 @@ var predicatesNormalExpression = {
3824
3807
  assertNumber(first, sourceCodeInfo, { finite: true });
3825
3808
  return first < 0;
3826
3809
  },
3827
- validate: function (node) { return assertNumberOfParams(1, node); },
3810
+ paramCount: 1,
3828
3811
  },
3829
3812
  'even?': {
3830
3813
  evaluate: function (_a, sourceCodeInfo) {
@@ -3832,7 +3815,7 @@ var predicatesNormalExpression = {
3832
3815
  assertNumber(first, sourceCodeInfo, { finite: true });
3833
3816
  return first % 2 === 0;
3834
3817
  },
3835
- validate: function (node) { return assertNumberOfParams(1, node); },
3818
+ paramCount: 1,
3836
3819
  },
3837
3820
  'odd?': {
3838
3821
  evaluate: function (_a, sourceCodeInfo) {
@@ -3840,42 +3823,42 @@ var predicatesNormalExpression = {
3840
3823
  assertNumber(first, sourceCodeInfo, { finite: true });
3841
3824
  return isNumber(first, { integer: true }) && first % 2 !== 0;
3842
3825
  },
3843
- validate: function (node) { return assertNumberOfParams(1, node); },
3826
+ paramCount: 1,
3844
3827
  },
3845
3828
  'array?': {
3846
3829
  evaluate: function (_a) {
3847
3830
  var _b = __read(_a, 1), first = _b[0];
3848
3831
  return Array.isArray(first);
3849
3832
  },
3850
- validate: function (node) { return assertNumberOfParams(1, node); },
3833
+ paramCount: 1,
3851
3834
  },
3852
3835
  'coll?': {
3853
3836
  evaluate: function (_a) {
3854
3837
  var _b = __read(_a, 1), first = _b[0];
3855
3838
  return isColl(first);
3856
3839
  },
3857
- validate: function (node) { return assertNumberOfParams(1, node); },
3840
+ paramCount: 1,
3858
3841
  },
3859
3842
  'seq?': {
3860
3843
  evaluate: function (_a) {
3861
3844
  var _b = __read(_a, 1), first = _b[0];
3862
3845
  return isSeq(first);
3863
3846
  },
3864
- validate: function (node) { return assertNumberOfParams(1, node); },
3847
+ paramCount: 1,
3865
3848
  },
3866
3849
  'object?': {
3867
3850
  evaluate: function (_a) {
3868
3851
  var _b = __read(_a, 1), first = _b[0];
3869
3852
  return isObj(first);
3870
3853
  },
3871
- validate: function (node) { return assertNumberOfParams(1, node); },
3854
+ paramCount: 1,
3872
3855
  },
3873
3856
  'regexp?': {
3874
3857
  evaluate: function (_a) {
3875
3858
  var _b = __read(_a, 1), value = _b[0];
3876
3859
  return isRegularExpression(value);
3877
3860
  },
3878
- validate: function (node) { return assertNumberOfParams(1, node); },
3861
+ paramCount: 1,
3879
3862
  },
3880
3863
  'finite?': {
3881
3864
  evaluate: function (_a, sourceCodeInfo) {
@@ -3883,7 +3866,7 @@ var predicatesNormalExpression = {
3883
3866
  assertNumber(value, sourceCodeInfo);
3884
3867
  return Number.isFinite(value);
3885
3868
  },
3886
- validate: function (node) { return assertNumberOfParams(1, node); },
3869
+ paramCount: 1,
3887
3870
  },
3888
3871
  'nan?': {
3889
3872
  evaluate: function (_a, sourceCodeInfo) {
@@ -3891,7 +3874,7 @@ var predicatesNormalExpression = {
3891
3874
  assertNumber(value, sourceCodeInfo);
3892
3875
  return Number.isNaN(value);
3893
3876
  },
3894
- validate: function (node) { return assertNumberOfParams(1, node); },
3877
+ paramCount: 1,
3895
3878
  },
3896
3879
  'positive_infinity?': {
3897
3880
  evaluate: function (_a, sourceCodeInfo) {
@@ -3899,7 +3882,7 @@ var predicatesNormalExpression = {
3899
3882
  assertNumber(value, sourceCodeInfo);
3900
3883
  return value === Number.POSITIVE_INFINITY;
3901
3884
  },
3902
- validate: function (node) { return assertNumberOfParams(1, node); },
3885
+ paramCount: 1,
3903
3886
  },
3904
3887
  'negative_infinity?': {
3905
3888
  evaluate: function (_a, sourceCodeInfo) {
@@ -3907,21 +3890,21 @@ var predicatesNormalExpression = {
3907
3890
  assertNumber(value, sourceCodeInfo);
3908
3891
  return value === Number.NEGATIVE_INFINITY;
3909
3892
  },
3910
- validate: function (node) { return assertNumberOfParams(1, node); },
3893
+ paramCount: 1,
3911
3894
  },
3912
3895
  'true?': {
3913
3896
  evaluate: function (_a) {
3914
3897
  var _b = __read(_a, 1), value = _b[0];
3915
3898
  return value === true;
3916
3899
  },
3917
- validate: function (node) { return assertNumberOfParams(1, node); },
3900
+ paramCount: 1,
3918
3901
  },
3919
3902
  'false?': {
3920
3903
  evaluate: function (_a) {
3921
3904
  var _b = __read(_a, 1), value = _b[0];
3922
3905
  return value === false;
3923
3906
  },
3924
- validate: function (node) { return assertNumberOfParams(1, node); },
3907
+ paramCount: 1,
3925
3908
  },
3926
3909
  'empty?': {
3927
3910
  evaluate: function (_a, sourceCodeInfo) {
@@ -3935,7 +3918,7 @@ var predicatesNormalExpression = {
3935
3918
  return coll.length === 0;
3936
3919
  return Object.keys(coll).length === 0;
3937
3920
  },
3938
- validate: function (node) { return assertNumberOfParams(1, node); },
3921
+ paramCount: 1,
3939
3922
  },
3940
3923
  'not_empty?': {
3941
3924
  evaluate: function (_a, sourceCodeInfo) {
@@ -3949,7 +3932,7 @@ var predicatesNormalExpression = {
3949
3932
  return coll.length > 0;
3950
3933
  return Object.keys(coll).length > 0;
3951
3934
  },
3952
- validate: function (node) { return assertNumberOfParams(1, node); },
3935
+ paramCount: 1,
3953
3936
  },
3954
3937
  };
3955
3938
 
@@ -3968,7 +3951,7 @@ var regexpNormalExpression = {
3968
3951
  _b.f = flags,
3969
3952
  _b;
3970
3953
  },
3971
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3954
+ paramCount: { min: 1, max: 2 },
3972
3955
  },
3973
3956
  match: {
3974
3957
  evaluate: function (_a, sourceCodeInfo) {
@@ -3982,7 +3965,7 @@ var regexpNormalExpression = {
3982
3965
  return __spreadArray([], __read(match), false);
3983
3966
  return null;
3984
3967
  },
3985
- validate: function (node) { return assertNumberOfParams(2, node); },
3968
+ paramCount: 2,
3986
3969
  },
3987
3970
  replace: {
3988
3971
  evaluate: function (_a, sourceCodeInfo) {
@@ -3993,7 +3976,7 @@ var regexpNormalExpression = {
3993
3976
  var matcher = isRegularExpression(regexp) ? new RegExp(regexp.s, "".concat(regexp.f)) : regexp;
3994
3977
  return str.replace(matcher, value);
3995
3978
  },
3996
- validate: function (node) { return assertNumberOfParams(3, node); },
3979
+ paramCount: 3,
3997
3980
  },
3998
3981
  replace_all: {
3999
3982
  evaluate: function (_a, sourceCodeInfo) {
@@ -4004,7 +3987,7 @@ var regexpNormalExpression = {
4004
3987
  var matcher = isRegularExpression(regexp) ? new RegExp(regexp.s, "".concat(regexp.f.includes('g') ? regexp.f : "".concat(regexp.f, "g"))) : regexp;
4005
3988
  return str.replaceAll(matcher, value);
4006
3989
  },
4007
- validate: function (node) { return assertNumberOfParams(3, node); },
3990
+ paramCount: 3,
4008
3991
  },
4009
3992
  };
4010
3993
 
@@ -4020,7 +4003,7 @@ var stringNormalExpression = {
4020
4003
  assertNumber(third, sourceCodeInfo, { gte: second });
4021
4004
  return (first).substring(second, third);
4022
4005
  },
4023
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4006
+ paramCount: { min: 2, max: 3 },
4024
4007
  },
4025
4008
  'string_repeat': {
4026
4009
  evaluate: function (_a, sourceCodeInfo) {
@@ -4029,7 +4012,7 @@ var stringNormalExpression = {
4029
4012
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
4030
4013
  return str.repeat(count);
4031
4014
  },
4032
- validate: function (node) { return assertNumberOfParams(2, node); },
4015
+ paramCount: 2,
4033
4016
  },
4034
4017
  'str': {
4035
4018
  evaluate: function (params) {
@@ -4044,6 +4027,7 @@ var stringNormalExpression = {
4044
4027
  return result + paramStr;
4045
4028
  }, '');
4046
4029
  },
4030
+ paramCount: {},
4047
4031
  },
4048
4032
  'number': {
4049
4033
  evaluate: function (_a, sourceCodeInfo) {
@@ -4054,7 +4038,7 @@ var stringNormalExpression = {
4054
4038
  throw new LitsError("Could not convert '".concat(str, "' to a number."), sourceCodeInfo);
4055
4039
  return number;
4056
4040
  },
4057
- validate: function (node) { return assertNumberOfParams(1, node); },
4041
+ paramCount: 1,
4058
4042
  },
4059
4043
  'from_char_code': {
4060
4044
  evaluate: function (_a, sourceCodeInfo) {
@@ -4068,7 +4052,7 @@ var stringNormalExpression = {
4068
4052
  throw new LitsError(error, sourceCodeInfo);
4069
4053
  }
4070
4054
  },
4071
- validate: function (node) { return assertNumberOfParams(1, node); },
4055
+ paramCount: 1,
4072
4056
  },
4073
4057
  'to_char_code': {
4074
4058
  evaluate: function (_a, sourceCodeInfo) {
@@ -4076,7 +4060,7 @@ var stringNormalExpression = {
4076
4060
  assertString(str, sourceCodeInfo, { nonEmpty: true });
4077
4061
  return asNonUndefined(str.codePointAt(0), sourceCodeInfo);
4078
4062
  },
4079
- validate: function (node) { return assertNumberOfParams(1, node); },
4063
+ paramCount: 1,
4080
4064
  },
4081
4065
  'lower_case': {
4082
4066
  evaluate: function (_a, sourceCodeInfo) {
@@ -4084,7 +4068,7 @@ var stringNormalExpression = {
4084
4068
  assertString(str, sourceCodeInfo);
4085
4069
  return str.toLowerCase();
4086
4070
  },
4087
- validate: function (node) { return assertNumberOfParams(1, node); },
4071
+ paramCount: 1,
4088
4072
  },
4089
4073
  'upper_case': {
4090
4074
  evaluate: function (_a, sourceCodeInfo) {
@@ -4092,7 +4076,7 @@ var stringNormalExpression = {
4092
4076
  assertString(str, sourceCodeInfo);
4093
4077
  return str.toUpperCase();
4094
4078
  },
4095
- validate: function (node) { return assertNumberOfParams(1, node); },
4079
+ paramCount: 1,
4096
4080
  },
4097
4081
  'trim': {
4098
4082
  evaluate: function (_a, sourceCodeInfo) {
@@ -4100,7 +4084,7 @@ var stringNormalExpression = {
4100
4084
  assertString(str, sourceCodeInfo);
4101
4085
  return str.trim();
4102
4086
  },
4103
- validate: function (node) { return assertNumberOfParams(1, node); },
4087
+ paramCount: 1,
4104
4088
  },
4105
4089
  'trim_left': {
4106
4090
  evaluate: function (_a, sourceCodeInfo) {
@@ -4108,7 +4092,7 @@ var stringNormalExpression = {
4108
4092
  assertString(str, sourceCodeInfo);
4109
4093
  return str.replace(/^\s+/, '');
4110
4094
  },
4111
- validate: function (node) { return assertNumberOfParams(1, node); },
4095
+ paramCount: 1,
4112
4096
  },
4113
4097
  'trim_right': {
4114
4098
  evaluate: function (_a, sourceCodeInfo) {
@@ -4116,7 +4100,7 @@ var stringNormalExpression = {
4116
4100
  assertString(str, sourceCodeInfo);
4117
4101
  return str.replace(/\s+$/, '');
4118
4102
  },
4119
- validate: function (node) { return assertNumberOfParams(1, node); },
4103
+ paramCount: 1,
4120
4104
  },
4121
4105
  '++': {
4122
4106
  evaluate: function (params, sourceCodeInfo) {
@@ -4140,7 +4124,7 @@ var stringNormalExpression = {
4140
4124
  return "".concat(acc).concat(str);
4141
4125
  }, first === null ? '' : "".concat(first));
4142
4126
  },
4143
- validate: function () { return undefined; },
4127
+ paramCount: {},
4144
4128
  },
4145
4129
  'join': {
4146
4130
  evaluate: function (_a, sourceCodeInfo) {
@@ -4150,7 +4134,7 @@ var stringNormalExpression = {
4150
4134
  assertString(delimiter, sourceCodeInfo);
4151
4135
  return stringList.join(delimiter);
4152
4136
  },
4153
- validate: function (node) { return assertNumberOfParams(2, node); },
4137
+ paramCount: 2,
4154
4138
  },
4155
4139
  'split': {
4156
4140
  evaluate: function (_a, sourceCodeInfo) {
@@ -4164,7 +4148,7 @@ var stringNormalExpression = {
4164
4148
  : new RegExp(stringOrRegExpValue.s, stringOrRegExpValue.f);
4165
4149
  return str.split(delimiter, limit);
4166
4150
  },
4167
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4151
+ paramCount: { min: 2, max: 3 },
4168
4152
  },
4169
4153
  'split_lines': {
4170
4154
  evaluate: function (_a, sourceCodeInfo) {
@@ -4172,7 +4156,7 @@ var stringNormalExpression = {
4172
4156
  assertString(str, sourceCodeInfo);
4173
4157
  return str.split((/\r\n|\n|\r/)).filter(function (line) { return line !== ''; });
4174
4158
  },
4175
- validate: function (node) { return assertNumberOfParams(1, node); },
4159
+ paramCount: 1,
4176
4160
  },
4177
4161
  'pad_left': {
4178
4162
  evaluate: function (_a, sourceCodeInfo) {
@@ -4183,7 +4167,7 @@ var stringNormalExpression = {
4183
4167
  assertString(padString, sourceCodeInfo);
4184
4168
  return str.padStart(length, padString);
4185
4169
  },
4186
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4170
+ paramCount: { min: 2, max: 3 },
4187
4171
  },
4188
4172
  'pad_right': {
4189
4173
  evaluate: function (_a, sourceCodeInfo) {
@@ -4194,7 +4178,7 @@ var stringNormalExpression = {
4194
4178
  assertString(padString, sourceCodeInfo);
4195
4179
  return str.padEnd(length, padString);
4196
4180
  },
4197
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4181
+ paramCount: { min: 2, max: 3 },
4198
4182
  },
4199
4183
  'template': {
4200
4184
  evaluate: function (_a, sourceCodeInfo) {
@@ -4225,7 +4209,7 @@ var stringNormalExpression = {
4225
4209
  }
4226
4210
  }
4227
4211
  },
4228
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 10 }, node); },
4212
+ paramCount: { min: 1, max: 10 },
4229
4213
  },
4230
4214
  'encode_base64': {
4231
4215
  evaluate: function (_a, sourceCodeInfo) {
@@ -4236,7 +4220,7 @@ var stringNormalExpression = {
4236
4220
  return String.fromCharCode(Number.parseInt(p1, 16));
4237
4221
  }));
4238
4222
  },
4239
- validate: function (node) { return assertNumberOfParams(1, node); },
4223
+ paramCount: 1,
4240
4224
  },
4241
4225
  'decode_base64': {
4242
4226
  evaluate: function (_a, sourceCodeInfo) {
@@ -4254,7 +4238,7 @@ var stringNormalExpression = {
4254
4238
  throw new LitsError(error, sourceCodeInfo);
4255
4239
  }
4256
4240
  },
4257
- validate: function (node) { return assertNumberOfParams(1, node); },
4241
+ paramCount: 1,
4258
4242
  },
4259
4243
  'encode_uri_component': {
4260
4244
  evaluate: function (_a, sourceCodeInfo) {
@@ -4262,7 +4246,7 @@ var stringNormalExpression = {
4262
4246
  assertString(value, sourceCodeInfo);
4263
4247
  return encodeURIComponent(value);
4264
4248
  },
4265
- validate: function (node) { return assertNumberOfParams(1, node); },
4249
+ paramCount: 1,
4266
4250
  },
4267
4251
  'decode_uri_component': {
4268
4252
  evaluate: function (_a, sourceCodeInfo) {
@@ -4275,7 +4259,7 @@ var stringNormalExpression = {
4275
4259
  throw new LitsError(error, sourceCodeInfo);
4276
4260
  }
4277
4261
  },
4278
- validate: function (node) { return assertNumberOfParams(1, node); },
4262
+ paramCount: 1,
4279
4263
  },
4280
4264
  'blank?': {
4281
4265
  evaluate: function (_a, sourceCodeInfo) {
@@ -4286,7 +4270,7 @@ var stringNormalExpression = {
4286
4270
  assertString(value, sourceCodeInfo);
4287
4271
  return blankRegexp.test(value);
4288
4272
  },
4289
- validate: function (node) { return assertNumberOfParams(1, node); },
4273
+ paramCount: 1,
4290
4274
  },
4291
4275
  'capitalize': {
4292
4276
  evaluate: function (_a, sourceCodeInfo) {
@@ -4294,7 +4278,7 @@ var stringNormalExpression = {
4294
4278
  assertString(str, sourceCodeInfo);
4295
4279
  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
4296
4280
  },
4297
- validate: function (node) { return assertNumberOfParams(1, node); },
4281
+ paramCount: 1,
4298
4282
  },
4299
4283
  };
4300
4284
  var doubleDollarRegexp = /\$\$/g;
@@ -4325,14 +4309,14 @@ var functionalNormalExpression = {
4325
4309
  var applyArray = __spreadArray(__spreadArray([], __read(params.slice(0, -1)), false), __read(last), false);
4326
4310
  return executeFunction(func, applyArray, contextStack, sourceCodeInfo);
4327
4311
  },
4328
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
4312
+ paramCount: { min: 2 },
4329
4313
  },
4330
4314
  identity: {
4331
4315
  evaluate: function (_a) {
4332
4316
  var _b = __read(_a, 1), value = _b[0];
4333
4317
  return toAny(value);
4334
4318
  },
4335
- validate: function (node) { return assertNumberOfParams(1, node); },
4319
+ paramCount: 1,
4336
4320
  },
4337
4321
  partial: {
4338
4322
  evaluate: function (_a, sourceCodeInfo) {
@@ -4346,7 +4330,7 @@ var functionalNormalExpression = {
4346
4330
  _b.p = params,
4347
4331
  _b;
4348
4332
  },
4349
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4333
+ paramCount: { min: 1 },
4350
4334
  },
4351
4335
  comp: {
4352
4336
  evaluate: function (fns, sourceCodeInfo) {
@@ -4364,6 +4348,7 @@ var functionalNormalExpression = {
4364
4348
  _a.f = fns,
4365
4349
  _a;
4366
4350
  },
4351
+ paramCount: {},
4367
4352
  },
4368
4353
  constantly: {
4369
4354
  evaluate: function (_a, sourceCodeInfo) {
@@ -4376,7 +4361,7 @@ var functionalNormalExpression = {
4376
4361
  _b.v = toAny(value),
4377
4362
  _b;
4378
4363
  },
4379
- validate: function (node) { return assertNumberOfParams(1, node); },
4364
+ paramCount: 1,
4380
4365
  },
4381
4366
  juxt: {
4382
4367
  evaluate: function (fns, sourceCodeInfo) {
@@ -4388,7 +4373,7 @@ var functionalNormalExpression = {
4388
4373
  _a.f = fns,
4389
4374
  _a;
4390
4375
  },
4391
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4376
+ paramCount: { min: 1 },
4392
4377
  },
4393
4378
  complement: {
4394
4379
  evaluate: function (_a, sourceCodeInfo) {
@@ -4401,7 +4386,7 @@ var functionalNormalExpression = {
4401
4386
  _b.f = toAny(fn),
4402
4387
  _b;
4403
4388
  },
4404
- validate: function (node) { return assertNumberOfParams(1, node); },
4389
+ paramCount: 1,
4405
4390
  },
4406
4391
  every_pred: {
4407
4392
  evaluate: function (fns, sourceCodeInfo) {
@@ -4413,7 +4398,7 @@ var functionalNormalExpression = {
4413
4398
  _a.f = fns,
4414
4399
  _a;
4415
4400
  },
4416
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4401
+ paramCount: { min: 1 },
4417
4402
  },
4418
4403
  some_pred: {
4419
4404
  evaluate: function (fns, sourceCodeInfo) {
@@ -4425,7 +4410,7 @@ var functionalNormalExpression = {
4425
4410
  _a.f = fns,
4426
4411
  _a;
4427
4412
  },
4428
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4413
+ paramCount: { min: 1 },
4429
4414
  },
4430
4415
  fnil: {
4431
4416
  evaluate: function (_a, sourceCodeInfo) {
@@ -4439,7 +4424,7 @@ var functionalNormalExpression = {
4439
4424
  _b.p = params,
4440
4425
  _b;
4441
4426
  },
4442
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
4427
+ paramCount: { min: 2 },
4443
4428
  },
4444
4429
  };
4445
4430
 
@@ -4458,7 +4443,7 @@ var andSpecialExpression = {
4458
4443
  };
4459
4444
  return node;
4460
4445
  },
4461
- validateParameterCount: function () { return undefined; },
4446
+ paramCount: {},
4462
4447
  evaluate: function (node, contextStack, _a) {
4463
4448
  var e_1, _b;
4464
4449
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4502,14 +4487,14 @@ function getCommonPolishSpecialExpressionParser(name) {
4502
4487
 
4503
4488
  var commentSpecialExpression = {
4504
4489
  polishParse: getCommonPolishSpecialExpressionParser('comment'),
4505
- validateParameterCount: function () { return undefined; },
4490
+ paramCount: {},
4506
4491
  evaluate: function () { return null; },
4507
4492
  findUnresolvedIdentifiers: function () { return new Set(); },
4508
4493
  };
4509
4494
 
4510
4495
  var condSpecialExpression = {
4511
4496
  polishParse: getCommonPolishSpecialExpressionParser('cond'),
4512
- validateParameterCount: function (node) { return assertEvenNumberOfParams(node); },
4497
+ paramCount: { even: true },
4513
4498
  evaluate: function (node, contextStack, _a) {
4514
4499
  var e_1, _b;
4515
4500
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4539,7 +4524,7 @@ var condSpecialExpression = {
4539
4524
 
4540
4525
  var switchSpecialExpression = {
4541
4526
  polishParse: getCommonPolishSpecialExpressionParser('switch'),
4542
- validateParameterCount: function (node) { return assertOddNumberOfParams(node); },
4527
+ paramCount: { odd: true },
4543
4528
  evaluate: function (node, contextStack, _a) {
4544
4529
  var e_1, _b;
4545
4530
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4570,7 +4555,7 @@ var switchSpecialExpression = {
4570
4555
 
4571
4556
  var declaredSpecialExpression = {
4572
4557
  polishParse: getCommonPolishSpecialExpressionParser('defined?'),
4573
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
4558
+ paramCount: 1,
4574
4559
  evaluate: function (node, contextStack) {
4575
4560
  var lookUpResult = contextStack.lookUp(node.p[0]);
4576
4561
  return lookUpResult !== null;
@@ -4618,7 +4603,7 @@ var defSpecialExpression = {
4618
4603
  assertSymbolNode(node.p[0], (_b = getTokenDebugData(node.token)) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
4619
4604
  return node;
4620
4605
  },
4621
- validateParameterCount: function (node) { return assertNumberOfParams(2, node); },
4606
+ paramCount: 2,
4622
4607
  evaluate: function (node, contextStack, _a) {
4623
4608
  var _b;
4624
4609
  var evaluateAstNode = _a.evaluateAstNode, builtin = _a.builtin;
@@ -4643,7 +4628,7 @@ var defSpecialExpression = {
4643
4628
 
4644
4629
  var doSpecialExpression = {
4645
4630
  polishParse: getCommonPolishSpecialExpressionParser('do'),
4646
- validateParameterCount: function () { return undefined; },
4631
+ paramCount: {},
4647
4632
  evaluate: function (node, contextStack, _a) {
4648
4633
  var e_1, _b;
4649
4634
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4715,7 +4700,7 @@ var defnSpecialExpression = {
4715
4700
  };
4716
4701
  return node;
4717
4702
  },
4718
- validateParameterCount: function () { return undefined; },
4703
+ paramCount: {},
4719
4704
  evaluate: function (node, contextStack, _a) {
4720
4705
  var _b;
4721
4706
  var _c, _d;
@@ -4754,7 +4739,7 @@ var fnSpecialExpression = {
4754
4739
  };
4755
4740
  return node;
4756
4741
  },
4757
- validateParameterCount: function () { return undefined; },
4742
+ paramCount: {},
4758
4743
  evaluate: function (node, contextStack, _a) {
4759
4744
  var _b;
4760
4745
  var _c;
@@ -4979,7 +4964,7 @@ function parseFunctionArguments(tokenStream, parseState, parsers) {
4979
4964
 
4980
4965
  var ifSpecialExpression = {
4981
4966
  polishParse: getCommonPolishSpecialExpressionParser('if'),
4982
- validateParameterCount: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4967
+ paramCount: { min: 2, max: 3 },
4983
4968
  evaluate: function (node, contextStack, _a) {
4984
4969
  var _b;
4985
4970
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5003,7 +4988,7 @@ var ifSpecialExpression = {
5003
4988
 
5004
4989
  var unlessSpecialExpression = {
5005
4990
  polishParse: getCommonPolishSpecialExpressionParser('unless'),
5006
- validateParameterCount: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4991
+ paramCount: { min: 2, max: 3 },
5007
4992
  evaluate: function (node, contextStack, _a) {
5008
4993
  var _b;
5009
4994
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5040,7 +5025,7 @@ var letSpecialExpression = {
5040
5025
  };
5041
5026
  return node;
5042
5027
  },
5043
- validateParameterCount: function (node) { return assertNumberOfParams(0, node); },
5028
+ paramCount: 0,
5044
5029
  evaluate: function (node, contextStack, _a) {
5045
5030
  var e_1, _b;
5046
5031
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5095,7 +5080,7 @@ var loopSpecialExpression = {
5095
5080
  };
5096
5081
  return node;
5097
5082
  },
5098
- validateParameterCount: function () { return undefined; },
5083
+ paramCount: {},
5099
5084
  evaluate: function (node, contextStack, _a) {
5100
5085
  var _b;
5101
5086
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5361,7 +5346,7 @@ var forSpecialExpression = {
5361
5346
  };
5362
5347
  return node;
5363
5348
  },
5364
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5349
+ paramCount: 1,
5365
5350
  evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateAstNode); },
5366
5351
  findUnresolvedIdentifiers: function (node, contextStack, _a) {
5367
5352
  var findUnresolvedIdentifiers = _a.findUnresolvedIdentifiers, builtin = _a.builtin;
@@ -5383,7 +5368,7 @@ var doseqSpecialExpression = {
5383
5368
  };
5384
5369
  return node;
5385
5370
  },
5386
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5371
+ paramCount: 1,
5387
5372
  evaluate: function (node, contextStack, helpers) {
5388
5373
  evaluateLoop(false, node, contextStack, helpers.evaluateAstNode);
5389
5374
  return null;
@@ -5396,7 +5381,7 @@ var doseqSpecialExpression = {
5396
5381
 
5397
5382
  var orSpecialExpression = {
5398
5383
  polishParse: getCommonPolishSpecialExpressionParser('||'),
5399
- validateParameterCount: function () { return undefined; },
5384
+ paramCount: {},
5400
5385
  evaluate: function (node, contextStack, _a) {
5401
5386
  var e_1, _b;
5402
5387
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5426,7 +5411,7 @@ var orSpecialExpression = {
5426
5411
 
5427
5412
  var qqSpecialExpression = {
5428
5413
  polishParse: getCommonPolishSpecialExpressionParser('??'),
5429
- validateParameterCount: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
5414
+ paramCount: { min: 1, max: 2 },
5430
5415
  evaluate: function (node, contextStack, _a) {
5431
5416
  var _b;
5432
5417
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5458,7 +5443,7 @@ var recurSpecialExpression = {
5458
5443
  };
5459
5444
  return node;
5460
5445
  },
5461
- validateParameterCount: function () { return undefined; },
5446
+ paramCount: {},
5462
5447
  evaluate: function (node, contextStack, _a) {
5463
5448
  var evaluateAstNode = _a.evaluateAstNode;
5464
5449
  var params = node.p.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
@@ -5472,7 +5457,7 @@ var recurSpecialExpression = {
5472
5457
 
5473
5458
  var throwSpecialExpression = {
5474
5459
  polishParse: getCommonPolishSpecialExpressionParser('throw'),
5475
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5460
+ paramCount: 1,
5476
5461
  evaluate: function (node, contextStack, _a) {
5477
5462
  var _b, _c;
5478
5463
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5513,7 +5498,7 @@ var trySpecialExpression = {
5513
5498
  };
5514
5499
  return node;
5515
5500
  },
5516
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5501
+ paramCount: 1,
5517
5502
  evaluate: function (node, contextStack, _a) {
5518
5503
  var _b;
5519
5504
  var _c;
@@ -5950,8 +5935,9 @@ function evaluate(ast, contextStack) {
5950
5935
  var e_1, _a;
5951
5936
  var result = null;
5952
5937
  var safeAstNode = ast.hasDebugData ? JSON.parse(JSON.stringify(ast)) : ast;
5953
- if (safeAstNode.hasDebugData)
5938
+ if (safeAstNode.hasDebugData) {
5954
5939
  removeCommenNodes(safeAstNode);
5940
+ }
5955
5941
  try {
5956
5942
  for (var _b = __values(safeAstNode.b), _c = _b.next(); !_c.done; _c = _b.next()) {
5957
5943
  var node = _c.value;
@@ -6157,6 +6143,20 @@ function analyze(ast, params) {
6157
6143
  };
6158
6144
  }
6159
6145
 
6146
+ function minifyTokenStream(tokenStream) {
6147
+ var tokens = tokenStream.tokens.filter(function (token) {
6148
+ if (isP_CommentToken(token)
6149
+ || isA_CommentToken(token)
6150
+ || isA_MultiLineCommentToken(token)
6151
+ || isA_WhitespaceToken(token)
6152
+ || isP_WhitespaceToken(token)) {
6153
+ return false;
6154
+ }
6155
+ return true;
6156
+ });
6157
+ return __assign(__assign({}, tokenStream), { tokens: tokens });
6158
+ }
6159
+
6160
6160
  function parseSymbol(tokenStream, parseState) {
6161
6161
  var _a;
6162
6162
  var tkn = asToken(tokenStream.tokens[parseState.position++]);
@@ -6346,7 +6346,6 @@ function getPrecedence(operatorSign) {
6346
6346
  }
6347
6347
  }
6348
6348
  function createNamedNormalExpressionNode(name, params, token) {
6349
- var _a;
6350
6349
  var node = {
6351
6350
  t: exports.AstNodeType.NormalExpression,
6352
6351
  n: name,
@@ -6355,7 +6354,7 @@ function createNamedNormalExpressionNode(name, params, token) {
6355
6354
  };
6356
6355
  var builtinExpression = builtin.normalExpressions[node.n];
6357
6356
  if (builtinExpression) {
6358
- (_a = builtinExpression.validate) === null || _a === void 0 ? void 0 : _a.call(builtinExpression, __assign(__assign({}, node), { p: withoutCommentNodes(node.p) }));
6357
+ assertNumberOfParams(builtinExpression.paramCount, node);
6359
6358
  }
6360
6359
  return node;
6361
6360
  }
@@ -6456,7 +6455,7 @@ var AlgebraicParser = /** @class */ (function () {
6456
6455
  AlgebraicParser.prototype.parse = function () {
6457
6456
  var nodes = [];
6458
6457
  while (!this.isAtEnd()) {
6459
- nodes.push(this.parseExpression());
6458
+ nodes.push(this.parseExpression(0, true));
6460
6459
  if (!isA_OperatorToken(this.peek(), ';')) {
6461
6460
  break;
6462
6461
  }
@@ -6464,9 +6463,10 @@ var AlgebraicParser = /** @class */ (function () {
6464
6463
  }
6465
6464
  return nodes;
6466
6465
  };
6467
- AlgebraicParser.prototype.parseExpression = function (precedence) {
6468
- var _a;
6466
+ AlgebraicParser.prototype.parseExpression = function (precedence, moduleScope) {
6467
+ var _a, _b;
6469
6468
  if (precedence === void 0) { precedence = 0; }
6469
+ if (moduleScope === void 0) { moduleScope = false; }
6470
6470
  var firstToken = this.peek();
6471
6471
  var left;
6472
6472
  if (isA_SymbolToken(firstToken)) {
@@ -6502,6 +6502,9 @@ var AlgebraicParser = /** @class */ (function () {
6502
6502
  return this.parseFunction(firstToken);
6503
6503
  }
6504
6504
  else if (isA_ReservedSymbolToken(firstToken, 'export')) {
6505
+ if (!moduleScope) {
6506
+ throw new LitsError('export is only allowed in module scope', (_a = getTokenDebugData(firstToken)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6507
+ }
6505
6508
  return this.parseExport(firstToken);
6506
6509
  }
6507
6510
  left || (left = this.parseOperand());
@@ -6539,7 +6542,7 @@ var AlgebraicParser = /** @class */ (function () {
6539
6542
  operator = this.peek();
6540
6543
  }
6541
6544
  if (!left) {
6542
- throw new LitsError('Expected operand', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6545
+ throw new LitsError('Expected operand', (_b = getTokenDebugData(this.peek())) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6543
6546
  }
6544
6547
  return left;
6545
6548
  };
@@ -6647,32 +6650,6 @@ var AlgebraicParser = /** @class */ (function () {
6647
6650
  return parseReservedSymbol(this.tokenStream, this.parseState);
6648
6651
  case 'RegexpShorthand':
6649
6652
  return parseRegexpShorthand(this.tokenStream, this.parseState);
6650
- case 'PolNotation': {
6651
- this.parseState.algebraic = false;
6652
- var astNodes = [];
6653
- this.advance();
6654
- do {
6655
- astNodes.push(this.parseState.parseToken(this.tokenStream, this.parseState));
6656
- } while (!isEndNotationToken(this.peek()));
6657
- this.advance();
6658
- this.parseState.algebraic = true;
6659
- if (astNodes.length === 1) {
6660
- return astNodes[0];
6661
- }
6662
- return {
6663
- t: exports.AstNodeType.SpecialExpression,
6664
- n: 'do',
6665
- p: astNodes,
6666
- token: getTokenDebugData(token) && token,
6667
- };
6668
- }
6669
- case 'AlgNotation': {
6670
- this.advance();
6671
- var node = this.parseOperand();
6672
- assertEndNotationToken(this.peek());
6673
- this.advance();
6674
- return node;
6675
- }
6676
6653
  default:
6677
6654
  throw new LitsError("Unknown token type: ".concat(tokenType), (_b = getTokenDebugData(token)) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6678
6655
  }
@@ -6777,7 +6754,7 @@ var AlgebraicParser = /** @class */ (function () {
6777
6754
  p: params,
6778
6755
  token: getTokenDebugData(symbol.token) && symbol.token,
6779
6756
  };
6780
- builtin.specialExpressions[node.n].validateParameterCount(node);
6757
+ assertNumberOfParams(builtin.specialExpressions[node.n].paramCount, node);
6781
6758
  return node;
6782
6759
  }
6783
6760
  case 'fn':
@@ -6830,7 +6807,7 @@ var AlgebraicParser = /** @class */ (function () {
6830
6807
  }
6831
6808
  };
6832
6809
  AlgebraicParser.prototype.parseFunctionArguments = function () {
6833
- var _a, _b, _c, _d, _e;
6810
+ var _a, _b, _c, _d;
6834
6811
  var firstToken = this.peek();
6835
6812
  if (isA_SymbolToken(firstToken)) {
6836
6813
  this.advance();
@@ -6845,62 +6822,54 @@ var AlgebraicParser = /** @class */ (function () {
6845
6822
  }
6846
6823
  this.advance();
6847
6824
  var rest = false;
6848
- var letBindingObject;
6849
6825
  var args = [];
6850
6826
  var restArg;
6851
- while (!this.isAtEnd() && !isRParenToken(this.peek())) {
6852
- if (letBindingObject) {
6853
- throw new LitsError('Expected right parentheses', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6854
- }
6855
- if (isLBraceToken(this.peek())) {
6856
- letBindingObject = this.parseObject();
6857
- }
6858
- else {
6859
- if (isA_OperatorToken(this.peek(), '...')) {
6860
- if (rest) {
6861
- throw new LitsError('Multiple spread operators in lambda function', (_b = getTokenDebugData(this.peek())) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6862
- }
6863
- this.advance();
6864
- rest = true;
6865
- }
6866
- var symbolToken = this.peek();
6867
- if (!isA_SymbolToken(symbolToken)) {
6868
- throw new LitsError('Expected symbol', (_c = getTokenDebugData(this.peek())) === null || _c === void 0 ? void 0 : _c.sourceCodeInfo);
6869
- }
6827
+ while (!this.isAtEnd() && !isRParenToken(this.peek()) && !isA_SymbolToken(this.peek(), 'let')) {
6828
+ if (isA_OperatorToken(this.peek(), '...')) {
6870
6829
  if (rest) {
6871
- restArg = symbolToken[1];
6872
- }
6873
- else {
6874
- args.push(symbolToken[1]);
6830
+ throw new LitsError('Multiple spread operators in lambda function', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6875
6831
  }
6876
6832
  this.advance();
6833
+ rest = true;
6834
+ }
6835
+ var symbolToken = this.peek();
6836
+ if (!isA_SymbolToken(symbolToken)) {
6837
+ throw new LitsError('Expected symbol', (_b = getTokenDebugData(this.peek())) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6877
6838
  }
6878
- if (!isA_OperatorToken(this.peek(), ',') && !isRParenToken(this.peek())) {
6879
- throw new LitsError('Expected comma or closing parenthesis', (_d = getTokenDebugData(this.peek())) === null || _d === void 0 ? void 0 : _d.sourceCodeInfo);
6839
+ if (rest) {
6840
+ restArg = symbolToken[1];
6841
+ }
6842
+ else {
6843
+ args.push(symbolToken[1]);
6844
+ }
6845
+ this.advance();
6846
+ if (!isA_OperatorToken(this.peek(), ',') && !isRParenToken(this.peek()) && !isA_SymbolToken(this.peek(), 'let')) {
6847
+ throw new LitsError('Expected comma or closing parenthesis', (_c = getTokenDebugData(this.peek())) === null || _c === void 0 ? void 0 : _c.sourceCodeInfo);
6880
6848
  }
6881
6849
  if (isA_OperatorToken(this.peek(), ',')) {
6882
6850
  this.advance();
6883
6851
  }
6884
6852
  }
6885
6853
  var arity = restArg !== undefined ? { min: args.length } : args.length;
6854
+ // let bindings, to be able to pass on values in the context down to the body
6855
+ // This is needed since lits is dynamically scoped
6856
+ // E.g.
6857
+ // x => y => x + y // would not work, x is not available in the second lambda
6858
+ // x => (y, let x = x) => x + y // would work, x is available in the second lambda
6859
+ var bindingNodess = [];
6860
+ var token = this.peek();
6861
+ while (isA_SymbolToken(token, 'let')) {
6862
+ var letNode = this.parseLet(token, true);
6863
+ bindingNodess.push(letNode.bs[0]);
6864
+ token = this.peek();
6865
+ }
6886
6866
  if (!isRParenToken(this.peek())) {
6887
- throw new LitsError('Expected closing parenthesis', (_e = getTokenDebugData(this.peek())) === null || _e === void 0 ? void 0 : _e.sourceCodeInfo);
6867
+ throw new LitsError('Expected closing parenthesis', (_d = getTokenDebugData(this.peek())) === null || _d === void 0 ? void 0 : _d.sourceCodeInfo);
6888
6868
  }
6889
- var letBindings = letBindingObject ? arrayToPairs(letBindingObject.p) : [];
6890
6869
  var functionArguments = {
6891
6870
  m: args,
6892
6871
  r: restArg,
6893
- b: letBindings.map(function (pair) {
6894
- var key = pair[0];
6895
- var value = pair[1];
6896
- return {
6897
- t: exports.AstNodeType.Binding,
6898
- n: key.v,
6899
- v: value,
6900
- p: [],
6901
- token: getTokenDebugData(key.token) && key.token,
6902
- };
6903
- }),
6872
+ b: bindingNodess,
6904
6873
  };
6905
6874
  this.advance();
6906
6875
  return {
@@ -7350,6 +7319,7 @@ var AlgebraicParser = /** @class */ (function () {
7350
7319
  }
7351
7320
  assertA_ReservedSymbolToken(this.peek(), 'end');
7352
7321
  this.advance();
7322
+ assertA_OperatorToken(this.peek(), ';');
7353
7323
  var fnNode = {
7354
7324
  t: exports.AstNodeType.SpecialExpression,
7355
7325
  n: 'fn',
@@ -7512,7 +7482,7 @@ function parseObjectLitteral(tokenStream, parseState) {
7512
7482
  p: params,
7513
7483
  token: getTokenDebugData(firstToken) && firstToken,
7514
7484
  };
7515
- assertEvenNumberOfParams(node);
7485
+ assertNumberOfParams({ even: true }, node);
7516
7486
  return node;
7517
7487
  }
7518
7488
  var placeholderRegexp = /^%([1-9]\d?)?$/;
@@ -7618,7 +7588,7 @@ function parseBinding(tokenStream, parseState) {
7618
7588
  return node;
7619
7589
  }
7620
7590
  function parseNormalExpression(tokenStream, parseState) {
7621
- var _a, _b;
7591
+ var _a;
7622
7592
  var startBracketToken = tokenStream.hasDebugData ? asLParenToken(tokenStream.tokens[parseState.position]) : undefined;
7623
7593
  parseState.position += 1;
7624
7594
  var fnNode = parseState.parseToken(tokenStream, parseState);
@@ -7642,7 +7612,7 @@ function parseNormalExpression(tokenStream, parseState) {
7642
7612
  };
7643
7613
  var builtinExpression = builtin.normalExpressions[node.n];
7644
7614
  if (builtinExpression) {
7645
- (_b = builtinExpression.validate) === null || _b === void 0 ? void 0 : _b.call(builtinExpression, __assign(__assign({}, node), { p: withoutCommentNodes(node.p) }));
7615
+ assertNumberOfParams(builtinExpression.paramCount, node);
7646
7616
  }
7647
7617
  return node;
7648
7618
  }
@@ -7651,7 +7621,7 @@ function parseSpecialExpression(tokenStream, parseState) {
7651
7621
  var firstToken = asLParenToken(tokenStream.tokens[parseState.position++]);
7652
7622
  var nameToken = asP_SymbolToken(tokenStream.tokens[parseState.position++]);
7653
7623
  var expressionName = nameToken[1];
7654
- var _b = asNonUndefined(builtin.specialExpressions[expressionName], (_a = getTokenDebugData(nameToken)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo), parse = _b.polishParse, validateParameterCount = _b.validateParameterCount;
7624
+ var _b = asNonUndefined(builtin.specialExpressions[expressionName], (_a = getTokenDebugData(nameToken)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo), parse = _b.polishParse, paramCount = _b.paramCount;
7655
7625
  var node = parse(tokenStream, parseState, firstToken, {
7656
7626
  parseExpression: parseExpression,
7657
7627
  parseTokensUntilClosingBracket: parseTokensUntilClosingBracket,
@@ -7660,7 +7630,7 @@ function parseSpecialExpression(tokenStream, parseState) {
7660
7630
  parseBindings: parseBindings,
7661
7631
  parseArgument: parseArgument,
7662
7632
  });
7663
- validateParameterCount(node);
7633
+ assertNumberOfParams(paramCount, node);
7664
7634
  return node;
7665
7635
  }
7666
7636
  function parsePolishToken(tokenStream, parseState) {
@@ -7690,47 +7660,12 @@ function parsePolishToken(tokenStream, parseState) {
7690
7660
  return parseFnShorthand(tokenStream, parseState);
7691
7661
  case 'P_Comment':
7692
7662
  return parseComment(tokenStream, parseState);
7693
- case 'AlgNotation': {
7694
- parseState.position += 1;
7695
- parseState.algebraic = true;
7696
- var algebraicParser = new AlgebraicParser(tokenStream, parseState);
7697
- var nodes = algebraicParser.parse();
7698
- assertEndNotationToken(tokenStream.tokens[parseState.position++]);
7699
- parseState.algebraic = false;
7700
- if (nodes.length === 1) {
7701
- return nodes[0];
7702
- }
7703
- return {
7704
- t: exports.AstNodeType.SpecialExpression,
7705
- n: 'do',
7706
- p: nodes,
7707
- token: nodes[0].token,
7708
- };
7709
- }
7710
- case 'PolNotation': {
7711
- var astNodes = [];
7712
- parseState.position += 1;
7713
- do {
7714
- astNodes.push(parsePolishToken(tokenStream, parseState));
7715
- } while (!isEndNotationToken(asToken(tokenStream.tokens[parseState.position])));
7716
- parseState.position += 1;
7717
- if (astNodes.length === 1) {
7718
- return astNodes[0];
7719
- }
7720
- return {
7721
- t: exports.AstNodeType.SpecialExpression,
7722
- n: 'do',
7723
- p: astNodes,
7724
- token: astNodes[0].token,
7725
- };
7726
- }
7727
7663
  case 'P_CollectionAccessor':
7728
7664
  case 'P_Modifier':
7729
7665
  case 'RParen':
7730
7666
  case 'RBracket':
7731
7667
  case 'RBrace':
7732
7668
  case 'P_Whitespace':
7733
- case 'EndNotation':
7734
7669
  break;
7735
7670
  /* v8 ignore next 2 */
7736
7671
  default:
@@ -7740,49 +7675,28 @@ function parsePolishToken(tokenStream, parseState) {
7740
7675
  }
7741
7676
 
7742
7677
  function parse(tokenStream) {
7743
- var _a;
7744
- var safeTokenStream = removeUnnecessaryTokens(tokenStream);
7678
+ tokenStream = minifyTokenStream(tokenStream);
7679
+ var algebraic = tokenStream.algebraic;
7745
7680
  var ast = {
7746
7681
  b: [],
7747
- hasDebugData: safeTokenStream.hasDebugData,
7682
+ hasDebugData: tokenStream.hasDebugData,
7748
7683
  };
7749
7684
  var parseState = {
7750
7685
  position: 0,
7751
- algebraic: (_a = safeTokenStream.algebraic) !== null && _a !== void 0 ? _a : false,
7752
7686
  parseToken: parseToken,
7753
7687
  };
7754
- while (parseState.position < safeTokenStream.tokens.length) {
7755
- ast.b.push(parseToken(safeTokenStream, parseState));
7688
+ if (algebraic) {
7689
+ var algebraicParser = new AlgebraicParser(tokenStream, parseState);
7690
+ ast.b = algebraicParser.parse();
7756
7691
  }
7757
- return ast;
7758
- }
7759
- function removeUnnecessaryTokens(tokenStream) {
7760
- var tokens = tokenStream.tokens.filter(function (token) {
7761
- if (isP_CommentToken(token)
7762
- || isA_CommentToken(token)
7763
- || isA_MultiLineCommentToken(token)
7764
- || isA_WhitespaceToken(token)
7765
- || isP_WhitespaceToken(token)) {
7766
- return false;
7692
+ else {
7693
+ while (parseState.position < tokenStream.tokens.length) {
7694
+ ast.b.push(parseToken(tokenStream, parseState));
7767
7695
  }
7768
- return true;
7769
- });
7770
- return __assign(__assign({}, tokenStream), { tokens: tokens });
7696
+ }
7697
+ return ast;
7771
7698
  }
7772
7699
  function parseToken(tokenStream, parseState) {
7773
- if (parseState.algebraic) {
7774
- var algebraicParser = new AlgebraicParser(tokenStream, parseState);
7775
- var nodes = algebraicParser.parse();
7776
- if (nodes.length === 1) {
7777
- return nodes[0];
7778
- }
7779
- return {
7780
- t: exports.AstNodeType.SpecialExpression,
7781
- n: 'do',
7782
- p: nodes,
7783
- token: nodes[0].token,
7784
- };
7785
- }
7786
7700
  return parsePolishToken(tokenStream, parseState);
7787
7701
  }
7788
7702
 
@@ -7813,15 +7727,6 @@ var tokenizeLBrace = function (input, position) {
7813
7727
  var tokenizeRBrace = function (input, position) {
7814
7728
  return tokenizeSimpleToken('RBrace', '}', input, position);
7815
7729
  };
7816
- var tokenizePolishNotation = function (input, position) {
7817
- return tokenizeSimpleToken('PolNotation', '$`', input, position);
7818
- };
7819
- var tokenizeAlgebraicNotation = function (input, position) {
7820
- return tokenizeSimpleToken('AlgNotation', '@`', input, position);
7821
- };
7822
- var tokenizeEndNotation = function (input, position) {
7823
- return tokenizeSimpleToken('EndNotation', '`', input, position);
7824
- };
7825
7730
  var tokenizeString = function (input, position) {
7826
7731
  if (input[position] !== '"')
7827
7732
  return NO_MATCH;
@@ -7874,9 +7779,6 @@ function tokenizeSimpleToken(type, value, input, position) {
7874
7779
  return NO_MATCH;
7875
7780
  }
7876
7781
  var commonTokenizers = [
7877
- tokenizePolishNotation,
7878
- tokenizeAlgebraicNotation,
7879
- tokenizeEndNotation,
7880
7782
  tokenizeLParen,
7881
7783
  tokenizeRParen,
7882
7784
  tokenizeLBracket,
@@ -8386,7 +8288,6 @@ function getSugar() {
8386
8288
 
8387
8289
  function tokenize(input, params) {
8388
8290
  var debug = !!params.debug;
8389
- var notationStack = [params.algebraic ? 'algebraic' : 'polish'];
8390
8291
  var position = 0;
8391
8292
  var tokenStream = {
8392
8293
  tokens: [],
@@ -8395,7 +8296,7 @@ function tokenize(input, params) {
8395
8296
  algebraic: !!params.algebraic,
8396
8297
  };
8397
8298
  while (position < input.length) {
8398
- var tokenizers = notationStack.at(-1) === 'algebraic' ? algebraicTokenizers : polishTokenizers;
8299
+ var tokenizers = params.algebraic ? algebraicTokenizers : polishTokenizers;
8399
8300
  var tokenDescriptor = getCurrentToken(input, position, tokenizers);
8400
8301
  var debugData = debug
8401
8302
  ? {
@@ -8412,23 +8313,8 @@ function tokenize(input, params) {
8412
8313
  addTokenDebugData(token, debugData);
8413
8314
  }
8414
8315
  tokenStream.tokens.push(token);
8415
- if (isAlgebraicNotationToken(token)) {
8416
- notationStack.push('algebraic');
8417
- }
8418
- if (isPolishNotationToken(token)) {
8419
- notationStack.push('polish');
8420
- }
8421
- if (isEndNotationToken(token)) {
8422
- notationStack.pop();
8423
- if (notationStack.length < 1) {
8424
- throw new LitsError('Unexpected end directive `.', debugData === null || debugData === void 0 ? void 0 : debugData.sourceCodeInfo);
8425
- }
8426
- }
8427
8316
  }
8428
8317
  }
8429
- if (notationStack.length > 1) {
8430
- throw new LitsError('Missing end directive `.', createSourceCodeInfo(input, position, params.filePath));
8431
- }
8432
8318
  applySugar(tokenStream);
8433
8319
  return tokenStream;
8434
8320
  }
@@ -8513,9 +8399,6 @@ function untokenizeToken(token) {
8513
8399
  case 'RBracket': return ']';
8514
8400
  case 'LBrace': return '{';
8515
8401
  case 'RBrace': return '}';
8516
- case 'PolNotation': return '$`';
8517
- case 'AlgNotation': return '@`';
8518
- case 'EndNotation': return '`';
8519
8402
  case 'P_FnShorthand': return '#';
8520
8403
  /* v8 ignore next 2 */
8521
8404
  default:
@@ -8640,7 +8523,8 @@ var Lits = /** @class */ (function () {
8640
8523
  if (tokenizeParams === void 0) { tokenizeParams = {}; }
8641
8524
  var debug = this.debug;
8642
8525
  var algebraic = this.algebraic;
8643
- return tokenize(program, __assign(__assign({}, tokenizeParams), { debug: debug, algebraic: algebraic }));
8526
+ var tokenStream = tokenize(program, __assign(__assign({}, tokenizeParams), { debug: debug, algebraic: algebraic }));
8527
+ return tokenizeParams.minify ? minifyTokenStream(tokenStream) : tokenStream;
8644
8528
  };
8645
8529
  Lits.prototype.parse = function (tokenStream) {
8646
8530
  return parse(tokenStream);