@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.esm.js CHANGED
@@ -275,9 +275,6 @@ var commonSimpleTokenTypes = [
275
275
  'RBrace',
276
276
  'RBracket',
277
277
  'RParen',
278
- 'AlgNotation',
279
- 'PolNotation',
280
- 'EndNotation',
281
278
  ];
282
279
  var commomValueTokenTypes = [
283
280
  'String',
@@ -367,20 +364,6 @@ function asRegexpShorthandToken(token) {
367
364
  assertRegexpShorthandToken(token);
368
365
  return token;
369
366
  }
370
- function isAlgebraicNotationToken(token) {
371
- return (token === null || token === void 0 ? void 0 : token[0]) === 'AlgNotation';
372
- }
373
- function isPolishNotationToken(token) {
374
- return (token === null || token === void 0 ? void 0 : token[0]) === 'PolNotation';
375
- }
376
- function isEndNotationToken(token) {
377
- return (token === null || token === void 0 ? void 0 : token[0]) === 'EndNotation';
378
- }
379
- function assertEndNotationToken(token) {
380
- if (!isEndNotationToken(token)) {
381
- throwUnexpectedToken('EndNotation', undefined, token);
382
- }
383
- }
384
367
 
385
368
  var algebraicSimpleTokenTypes = __spreadArray([], __read(commonSimpleTokenTypes), false);
386
369
  var algebraicOnlyValueTokenTypes = [
@@ -840,20 +823,6 @@ function withoutCommentNodes(astNodes) {
840
823
  return astNodes.filter(function (n) { return n.t !== AstNodeType.Comment; });
841
824
  }
842
825
 
843
- function assertEvenNumberOfParams(node) {
844
- var _a;
845
- var length = withoutCommentNodes(node.p).length;
846
- if (length % 2 !== 0) {
847
- 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);
848
- }
849
- }
850
- function assertOddNumberOfParams(node) {
851
- var _a;
852
- var length = withoutCommentNodes(node.p).length;
853
- if (length % 2 !== 1) {
854
- 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);
855
- }
856
- }
857
826
  function assertNumberOfParams(count, node) {
858
827
  var _a, _b;
859
828
  assertCount({
@@ -885,9 +854,17 @@ function assertCount(_a) {
885
854
  }
886
855
  }
887
856
  else {
888
- var min = count.min, max = count.max;
889
- if (min === undefined && max === undefined)
890
- throw new LitsError('Min or max must be specified.', sourceCodeInfo);
857
+ var min = count.min, max = count.max, even = count.even, odd = count.odd;
858
+ if (even) {
859
+ if (length % 2 !== 0) {
860
+ throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an even number, got ").concat(valueToString(length), "."), sourceCodeInfo);
861
+ }
862
+ }
863
+ if (odd) {
864
+ if (length % 2 !== 1) {
865
+ throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an odd number, got ").concat(valueToString(length), "."), sourceCodeInfo);
866
+ }
867
+ }
891
868
  if (typeof min === 'number' && length < min) {
892
869
  throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
893
870
  }
@@ -1024,7 +1001,7 @@ var bitwiseNormalExpression = {
1024
1001
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
1025
1002
  return num << count;
1026
1003
  },
1027
- validate: function (node) { return assertNumberOfParams(2, node); },
1004
+ paramCount: 2,
1028
1005
  },
1029
1006
  '>>': {
1030
1007
  evaluate: function (_a, sourceCodeInfo) {
@@ -1033,7 +1010,7 @@ var bitwiseNormalExpression = {
1033
1010
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
1034
1011
  return num >> count;
1035
1012
  },
1036
- validate: function (node) { return assertNumberOfParams(2, node); },
1013
+ paramCount: 2,
1037
1014
  },
1038
1015
  '>>>': {
1039
1016
  evaluate: function (_a, sourceCodeInfo) {
@@ -1042,7 +1019,7 @@ var bitwiseNormalExpression = {
1042
1019
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
1043
1020
  return num >>> count;
1044
1021
  },
1045
- validate: function (node) { return assertNumberOfParams(2, node); },
1022
+ paramCount: 2,
1046
1023
  },
1047
1024
  '~': {
1048
1025
  evaluate: function (_a, sourceCodeInfo) {
@@ -1050,7 +1027,7 @@ var bitwiseNormalExpression = {
1050
1027
  assertNumber(num, sourceCodeInfo, { integer: true });
1051
1028
  return ~num;
1052
1029
  },
1053
- validate: function (node) { return assertNumberOfParams(1, node); },
1030
+ paramCount: 1,
1054
1031
  },
1055
1032
  '&': {
1056
1033
  evaluate: function (_a, sourceCodeInfo) {
@@ -1061,7 +1038,7 @@ var bitwiseNormalExpression = {
1061
1038
  return result & value;
1062
1039
  }, first);
1063
1040
  },
1064
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1041
+ paramCount: { min: 2 },
1065
1042
  },
1066
1043
  '&!': {
1067
1044
  evaluate: function (_a, sourceCodeInfo) {
@@ -1072,7 +1049,7 @@ var bitwiseNormalExpression = {
1072
1049
  return result & ~value;
1073
1050
  }, first);
1074
1051
  },
1075
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1052
+ paramCount: { min: 2 },
1076
1053
  },
1077
1054
  '|': {
1078
1055
  evaluate: function (_a, sourceCodeInfo) {
@@ -1083,7 +1060,7 @@ var bitwiseNormalExpression = {
1083
1060
  return result | value;
1084
1061
  }, first);
1085
1062
  },
1086
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1063
+ paramCount: { min: 2 },
1087
1064
  },
1088
1065
  '^': {
1089
1066
  evaluate: function (_a, sourceCodeInfo) {
@@ -1094,7 +1071,7 @@ var bitwiseNormalExpression = {
1094
1071
  return result ^ value;
1095
1072
  }, first);
1096
1073
  },
1097
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
1074
+ paramCount: { min: 2 },
1098
1075
  },
1099
1076
  'bit_flip': {
1100
1077
  evaluate: function (_a, sourceCodeInfo) {
@@ -1104,7 +1081,7 @@ var bitwiseNormalExpression = {
1104
1081
  var mask = 1 << index;
1105
1082
  return (num ^= mask);
1106
1083
  },
1107
- validate: function (node) { return assertNumberOfParams(2, node); },
1084
+ paramCount: 2,
1108
1085
  },
1109
1086
  'bit_set': {
1110
1087
  evaluate: function (_a, sourceCodeInfo) {
@@ -1114,7 +1091,7 @@ var bitwiseNormalExpression = {
1114
1091
  var mask = 1 << index;
1115
1092
  return (num |= mask);
1116
1093
  },
1117
- validate: function (node) { return assertNumberOfParams(2, node); },
1094
+ paramCount: 2,
1118
1095
  },
1119
1096
  'bit_clear': {
1120
1097
  evaluate: function (_a, sourceCodeInfo) {
@@ -1124,7 +1101,7 @@ var bitwiseNormalExpression = {
1124
1101
  var mask = 1 << index;
1125
1102
  return (num &= ~mask);
1126
1103
  },
1127
- validate: function (node) { return assertNumberOfParams(2, node); },
1104
+ paramCount: 2,
1128
1105
  },
1129
1106
  'bit_test': {
1130
1107
  evaluate: function (_a, sourceCodeInfo) {
@@ -1134,7 +1111,7 @@ var bitwiseNormalExpression = {
1134
1111
  var mask = 1 << index;
1135
1112
  return !!(num & mask);
1136
1113
  },
1137
- validate: function (node) { return assertNumberOfParams(2, node); },
1114
+ paramCount: 2,
1138
1115
  },
1139
1116
  };
1140
1117
 
@@ -1516,7 +1493,7 @@ var collectionNormalExpression = {
1516
1493
  var result = get(coll, key);
1517
1494
  return result === undefined ? defaultValue : result;
1518
1495
  },
1519
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
1496
+ paramCount: { min: 2, max: 3 },
1520
1497
  },
1521
1498
  'get_in': {
1522
1499
  evaluate: function (params, sourceCodeInfo) {
@@ -1551,7 +1528,7 @@ var collectionNormalExpression = {
1551
1528
  }
1552
1529
  return coll;
1553
1530
  },
1554
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
1531
+ paramCount: { min: 2, max: 3 },
1555
1532
  },
1556
1533
  'count': {
1557
1534
  evaluate: function (_a, sourceCodeInfo) {
@@ -1565,7 +1542,7 @@ var collectionNormalExpression = {
1565
1542
  return coll.length;
1566
1543
  return Object.keys(coll).length;
1567
1544
  },
1568
- validate: function (node) { return assertNumberOfParams(1, node); },
1545
+ paramCount: 1,
1569
1546
  },
1570
1547
  'contains?': {
1571
1548
  evaluate: function (_a, sourceCodeInfo) {
@@ -1582,7 +1559,7 @@ var collectionNormalExpression = {
1582
1559
  }
1583
1560
  return !!Object.getOwnPropertyDescriptor(coll, key);
1584
1561
  },
1585
- validate: function (node) { return assertNumberOfParams(2, node); },
1562
+ paramCount: 2,
1586
1563
  },
1587
1564
  'has?': {
1588
1565
  evaluate: function (_a, sourceCodeInfo) {
@@ -1603,7 +1580,7 @@ var collectionNormalExpression = {
1603
1580
  }
1604
1581
  return Object.values(coll).includes(value);
1605
1582
  },
1606
- validate: function (node) { return assertNumberOfParams(2, node); },
1583
+ paramCount: 2,
1607
1584
  },
1608
1585
  'has_some?': {
1609
1586
  evaluate: function (_a, sourceCodeInfo) {
@@ -1663,7 +1640,7 @@ var collectionNormalExpression = {
1663
1640
  }
1664
1641
  return false;
1665
1642
  },
1666
- validate: function (node) { return assertNumberOfParams(2, node); },
1643
+ paramCount: 2,
1667
1644
  },
1668
1645
  'has_every?': {
1669
1646
  evaluate: function (_a, sourceCodeInfo) {
@@ -1725,7 +1702,7 @@ var collectionNormalExpression = {
1725
1702
  }
1726
1703
  return true;
1727
1704
  },
1728
- validate: function (node) { return assertNumberOfParams(2, node); },
1705
+ paramCount: 2,
1729
1706
  },
1730
1707
  'assoc': {
1731
1708
  evaluate: function (_a, sourceCodeInfo) {
@@ -1735,7 +1712,7 @@ var collectionNormalExpression = {
1735
1712
  assertAny(value, sourceCodeInfo);
1736
1713
  return assoc(coll, key, value, sourceCodeInfo);
1737
1714
  },
1738
- validate: function (node) { return assertNumberOfParams(3, node); },
1715
+ paramCount: 3,
1739
1716
  },
1740
1717
  'assoc_in': {
1741
1718
  evaluate: function (_a, sourceCodeInfo) {
@@ -1760,7 +1737,7 @@ var collectionNormalExpression = {
1760
1737
  }
1761
1738
  return coll;
1762
1739
  },
1763
- validate: function (node) { return assertNumberOfParams(3, node); },
1740
+ paramCount: 3,
1764
1741
  },
1765
1742
  'update': {
1766
1743
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1771,7 +1748,7 @@ var collectionNormalExpression = {
1771
1748
  assertLitsFunction(fn, sourceCodeInfo);
1772
1749
  return update(coll, key, fn, params, contextStack, executeFunction, sourceCodeInfo);
1773
1750
  },
1774
- validate: function (node) { return assertNumberOfParams({ min: 3 }, node); },
1751
+ paramCount: { min: 3 },
1775
1752
  },
1776
1753
  'update_in': {
1777
1754
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1797,7 +1774,7 @@ var collectionNormalExpression = {
1797
1774
  }
1798
1775
  return coll;
1799
1776
  },
1800
- validate: function (node) { return assertNumberOfParams({ min: 3 }, node); },
1777
+ paramCount: { min: 3 },
1801
1778
  },
1802
1779
  'concat': {
1803
1780
  evaluate: function (params, sourceCodeInfo) {
@@ -1821,7 +1798,7 @@ var collectionNormalExpression = {
1821
1798
  }, {});
1822
1799
  }
1823
1800
  },
1824
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
1801
+ paramCount: { min: 1 },
1825
1802
  },
1826
1803
  'not_empty': {
1827
1804
  evaluate: function (_a, sourceCodeInfo) {
@@ -1835,7 +1812,7 @@ var collectionNormalExpression = {
1835
1812
  return coll.length > 0 ? coll : null;
1836
1813
  return Object.keys(coll).length > 0 ? coll : null;
1837
1814
  },
1838
- validate: function (node) { return assertNumberOfParams(1, node); },
1815
+ paramCount: 1,
1839
1816
  },
1840
1817
  'every?': {
1841
1818
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1849,7 +1826,7 @@ var collectionNormalExpression = {
1849
1826
  return coll.split('').every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1850
1827
  return Object.entries(coll).every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1851
1828
  },
1852
- validate: function (node) { return assertNumberOfParams(2, node); },
1829
+ paramCount: 2,
1853
1830
  },
1854
1831
  'any?': {
1855
1832
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1863,7 +1840,7 @@ var collectionNormalExpression = {
1863
1840
  return coll.split('').some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1864
1841
  return Object.entries(coll).some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1865
1842
  },
1866
- validate: function (node) { return assertNumberOfParams(2, node); },
1843
+ paramCount: 2,
1867
1844
  },
1868
1845
  'not_any?': {
1869
1846
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1877,7 +1854,7 @@ var collectionNormalExpression = {
1877
1854
  return !coll.split('').some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1878
1855
  return !Object.entries(coll).some(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1879
1856
  },
1880
- validate: function (node) { return assertNumberOfParams(2, node); },
1857
+ paramCount: 2,
1881
1858
  },
1882
1859
  'not_every?': {
1883
1860
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1891,13 +1868,14 @@ var collectionNormalExpression = {
1891
1868
  return !coll.split('').every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1892
1869
  return !Object.entries(coll).every(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
1893
1870
  },
1894
- validate: function (node) { return assertNumberOfParams(2, node); },
1871
+ paramCount: 2,
1895
1872
  },
1896
1873
  };
1897
1874
 
1898
1875
  var arrayNormalExpression = {
1899
1876
  array: {
1900
1877
  evaluate: function (params) { return params; },
1878
+ paramCount: {},
1901
1879
  },
1902
1880
  range: {
1903
1881
  evaluate: function (params, sourceCodeInfo) {
@@ -1935,7 +1913,7 @@ var arrayNormalExpression = {
1935
1913
  result.push(i);
1936
1914
  return result;
1937
1915
  },
1938
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 3 }, node); },
1916
+ paramCount: { min: 1, max: 3 },
1939
1917
  },
1940
1918
  repeat: {
1941
1919
  evaluate: function (_a, sourceCodeInfo) {
@@ -1946,7 +1924,7 @@ var arrayNormalExpression = {
1946
1924
  result.push(value);
1947
1925
  return result;
1948
1926
  },
1949
- validate: function (node) { return assertNumberOfParams(2, node); },
1927
+ paramCount: 2,
1950
1928
  },
1951
1929
  flatten: {
1952
1930
  evaluate: function (_a) {
@@ -1955,7 +1933,7 @@ var arrayNormalExpression = {
1955
1933
  return [];
1956
1934
  return seq.flat(Number.POSITIVE_INFINITY);
1957
1935
  },
1958
- validate: function (node) { return assertNumberOfParams(1, node); },
1936
+ paramCount: 1,
1959
1937
  },
1960
1938
  mapcat: {
1961
1939
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1965,7 +1943,7 @@ var arrayNormalExpression = {
1965
1943
  assertLitsFunction(fn, sourceCodeInfo);
1966
1944
  return arr.map(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); }).flat(1);
1967
1945
  },
1968
- validate: function (node) { return assertNumberOfParams(2, node); },
1946
+ paramCount: 2,
1969
1947
  },
1970
1948
  };
1971
1949
 
@@ -1980,7 +1958,7 @@ var sequenceNormalExpression = {
1980
1958
  assertSeq(seq, sourceCodeInfo);
1981
1959
  return i >= 0 && i < seq.length ? toAny(seq[i]) : defaultValue;
1982
1960
  },
1983
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
1961
+ paramCount: { min: 2, max: 3 },
1984
1962
  },
1985
1963
  'filter': {
1986
1964
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -1995,7 +1973,7 @@ var sequenceNormalExpression = {
1995
1973
  .filter(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); })
1996
1974
  .join('');
1997
1975
  },
1998
- validate: function (node) { return assertNumberOfParams(2, node); },
1976
+ paramCount: 2,
1999
1977
  },
2000
1978
  'first': {
2001
1979
  evaluate: function (_a, sourceCodeInfo) {
@@ -2005,7 +1983,7 @@ var sequenceNormalExpression = {
2005
1983
  assertSeq(array, sourceCodeInfo);
2006
1984
  return toAny(array[0]);
2007
1985
  },
2008
- validate: function (node) { return assertNumberOfParams(1, node); },
1986
+ paramCount: 1,
2009
1987
  },
2010
1988
  'last': {
2011
1989
  evaluate: function (_a, sourceCodeInfo) {
@@ -2015,7 +1993,7 @@ var sequenceNormalExpression = {
2015
1993
  assertSeq(array, sourceCodeInfo);
2016
1994
  return toAny(array[array.length - 1]);
2017
1995
  },
2018
- validate: function (node) { return assertNumberOfParams(1, node); },
1996
+ paramCount: 1,
2019
1997
  },
2020
1998
  'map': {
2021
1999
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2037,7 +2015,7 @@ var sequenceNormalExpression = {
2037
2015
  .join('');
2038
2016
  }
2039
2017
  },
2040
- validate: function (node) { return assertNumberOfParams(2, node); },
2018
+ paramCount: 2,
2041
2019
  },
2042
2020
  'pop': {
2043
2021
  evaluate: function (_a, sourceCodeInfo) {
@@ -2048,7 +2026,7 @@ var sequenceNormalExpression = {
2048
2026
  }
2049
2027
  return seq.slice(0, seq.length - 1);
2050
2028
  },
2051
- validate: function (node) { return assertNumberOfParams(1, node); },
2029
+ paramCount: 1,
2052
2030
  },
2053
2031
  'position': {
2054
2032
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2067,7 +2045,7 @@ var sequenceNormalExpression = {
2067
2045
  return index !== -1 ? index : null;
2068
2046
  }
2069
2047
  },
2070
- validate: function (node) { return assertNumberOfParams(2, node); },
2048
+ paramCount: 2,
2071
2049
  },
2072
2050
  'index_of': {
2073
2051
  evaluate: function (_a, sourceCodeInfo) {
@@ -2086,7 +2064,7 @@ var sequenceNormalExpression = {
2086
2064
  return index !== -1 ? index : null;
2087
2065
  }
2088
2066
  },
2089
- validate: function (node) { return assertNumberOfParams(2, node); },
2067
+ paramCount: 2,
2090
2068
  },
2091
2069
  'last_index_of': {
2092
2070
  evaluate: function (_a, sourceCodeInfo) {
@@ -2105,7 +2083,7 @@ var sequenceNormalExpression = {
2105
2083
  return index !== -1 ? index : null;
2106
2084
  }
2107
2085
  },
2108
- validate: function (node) { return assertNumberOfParams(2, node); },
2086
+ paramCount: 2,
2109
2087
  },
2110
2088
  'push': {
2111
2089
  evaluate: function (_a, sourceCodeInfo) {
@@ -2119,7 +2097,7 @@ var sequenceNormalExpression = {
2119
2097
  return __spreadArray(__spreadArray([], __read(seq), false), __read(values), false);
2120
2098
  }
2121
2099
  },
2122
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
2100
+ paramCount: { min: 2 },
2123
2101
  },
2124
2102
  'reductions': {
2125
2103
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2180,7 +2158,7 @@ var sequenceNormalExpression = {
2180
2158
  }
2181
2159
  }
2182
2160
  },
2183
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2161
+ paramCount: { min: 2, max: 3 },
2184
2162
  },
2185
2163
  'reduce': {
2186
2164
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2227,7 +2205,7 @@ var sequenceNormalExpression = {
2227
2205
  }
2228
2206
  }
2229
2207
  },
2230
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2208
+ paramCount: { min: 2, max: 3 },
2231
2209
  },
2232
2210
  'reduce_right': {
2233
2211
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2275,7 +2253,7 @@ var sequenceNormalExpression = {
2275
2253
  }
2276
2254
  }
2277
2255
  },
2278
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2256
+ paramCount: { min: 2, max: 3 },
2279
2257
  },
2280
2258
  'rest': {
2281
2259
  evaluate: function (_a, sourceCodeInfo) {
@@ -2288,7 +2266,7 @@ var sequenceNormalExpression = {
2288
2266
  }
2289
2267
  return seq.substring(1);
2290
2268
  },
2291
- validate: function (node) { return assertNumberOfParams(1, node); },
2269
+ paramCount: 1,
2292
2270
  },
2293
2271
  'nthrest': {
2294
2272
  evaluate: function (_a, sourceCodeInfo) {
@@ -2300,7 +2278,7 @@ var sequenceNormalExpression = {
2300
2278
  return seq.slice(integerCount);
2301
2279
  return seq.substring(integerCount);
2302
2280
  },
2303
- validate: function (node) { return assertNumberOfParams(2, node); },
2281
+ paramCount: 2,
2304
2282
  },
2305
2283
  'next': {
2306
2284
  evaluate: function (_a, sourceCodeInfo) {
@@ -2315,7 +2293,7 @@ var sequenceNormalExpression = {
2315
2293
  return null;
2316
2294
  return seq.substring(1);
2317
2295
  },
2318
- validate: function (node) { return assertNumberOfParams(1, node); },
2296
+ paramCount: 1,
2319
2297
  },
2320
2298
  'nthnext': {
2321
2299
  evaluate: function (_a, sourceCodeInfo) {
@@ -2329,7 +2307,7 @@ var sequenceNormalExpression = {
2329
2307
  return seq.slice(integerCount);
2330
2308
  return seq.substring(integerCount);
2331
2309
  },
2332
- validate: function (node) { return assertNumberOfParams(2, node); },
2310
+ paramCount: 2,
2333
2311
  },
2334
2312
  'reverse': {
2335
2313
  evaluate: function (_a, sourceCodeInfo) {
@@ -2341,7 +2319,7 @@ var sequenceNormalExpression = {
2341
2319
  return __spreadArray([], __read(seq), false).reverse();
2342
2320
  return seq.split('').reverse().join('');
2343
2321
  },
2344
- validate: function (node) { return assertNumberOfParams(1, node); },
2322
+ paramCount: 1,
2345
2323
  },
2346
2324
  'second': {
2347
2325
  evaluate: function (_a, sourceCodeInfo) {
@@ -2351,7 +2329,7 @@ var sequenceNormalExpression = {
2351
2329
  assertSeq(seq, sourceCodeInfo);
2352
2330
  return toAny(seq[1]);
2353
2331
  },
2354
- validate: function (node) { return assertNumberOfParams(1, node); },
2332
+ paramCount: 1,
2355
2333
  },
2356
2334
  'shift': {
2357
2335
  evaluate: function (_a, sourceCodeInfo) {
@@ -2363,7 +2341,7 @@ var sequenceNormalExpression = {
2363
2341
  copy.shift();
2364
2342
  return copy;
2365
2343
  },
2366
- validate: function (node) { return assertNumberOfParams(1, node); },
2344
+ paramCount: 1,
2367
2345
  },
2368
2346
  'slice': {
2369
2347
  evaluate: function (params, sourceCodeInfo) {
@@ -2377,7 +2355,7 @@ var sequenceNormalExpression = {
2377
2355
  assertNumber(to, sourceCodeInfo, { integer: true });
2378
2356
  return seq.slice(from, to);
2379
2357
  },
2380
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 3 }, node); },
2358
+ paramCount: { min: 1, max: 3 },
2381
2359
  },
2382
2360
  'some': {
2383
2361
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2394,7 +2372,7 @@ var sequenceNormalExpression = {
2394
2372
  return (_c = seq.split('').find(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); })) !== null && _c !== void 0 ? _c : null;
2395
2373
  return toAny(seq.find(function (elem) { return executeFunction(fn, [elem], contextStack, sourceCodeInfo); }));
2396
2374
  },
2397
- validate: function (node) { return assertNumberOfParams(2, node); },
2375
+ paramCount: 2,
2398
2376
  },
2399
2377
  'sort': {
2400
2378
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2432,7 +2410,7 @@ var sequenceNormalExpression = {
2432
2410
  }
2433
2411
  return result;
2434
2412
  },
2435
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
2413
+ paramCount: { min: 1, max: 2 },
2436
2414
  },
2437
2415
  'sort_by': {
2438
2416
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -2483,7 +2461,7 @@ var sequenceNormalExpression = {
2483
2461
  }
2484
2462
  return result;
2485
2463
  },
2486
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2464
+ paramCount: { min: 2, max: 3 },
2487
2465
  },
2488
2466
  'take': {
2489
2467
  evaluate: function (_a, sourceCodeInfo) {
@@ -2493,7 +2471,7 @@ var sequenceNormalExpression = {
2493
2471
  var num = Math.max(Math.ceil(n), 0);
2494
2472
  return input.slice(0, num);
2495
2473
  },
2496
- validate: function (node) { return assertNumberOfParams(2, node); },
2474
+ paramCount: 2,
2497
2475
  },
2498
2476
  'take_last': {
2499
2477
  evaluate: function (_a, sourceCodeInfo) {
@@ -2504,7 +2482,7 @@ var sequenceNormalExpression = {
2504
2482
  var from = array.length - num;
2505
2483
  return array.slice(from);
2506
2484
  },
2507
- validate: function (node) { return assertNumberOfParams(2, node); },
2485
+ paramCount: 2,
2508
2486
  },
2509
2487
  'take_while': {
2510
2488
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2532,7 +2510,7 @@ var sequenceNormalExpression = {
2532
2510
  }
2533
2511
  return typeof seq === 'string' ? result.join('') : result;
2534
2512
  },
2535
- validate: function (node) { return assertNumberOfParams(2, node); },
2513
+ paramCount: 2,
2536
2514
  },
2537
2515
  'drop': {
2538
2516
  evaluate: function (_a, sourceCodeInfo) {
@@ -2542,7 +2520,7 @@ var sequenceNormalExpression = {
2542
2520
  assertSeq(input, sourceCodeInfo);
2543
2521
  return input.slice(num);
2544
2522
  },
2545
- validate: function (node) { return assertNumberOfParams(2, node); },
2523
+ paramCount: 2,
2546
2524
  },
2547
2525
  'drop_last': {
2548
2526
  evaluate: function (_a, sourceCodeInfo) {
@@ -2553,7 +2531,7 @@ var sequenceNormalExpression = {
2553
2531
  var from = array.length - num;
2554
2532
  return array.slice(0, from);
2555
2533
  },
2556
- validate: function (node) { return assertNumberOfParams(2, node); },
2534
+ paramCount: 2,
2557
2535
  },
2558
2536
  'drop_while': {
2559
2537
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2569,7 +2547,7 @@ var sequenceNormalExpression = {
2569
2547
  var from = charArray.findIndex(function (elem) { return !executeFunction(fn, [elem], contextStack, sourceCodeInfo); });
2570
2548
  return charArray.slice(from).join('');
2571
2549
  },
2572
- validate: function (node) { return assertNumberOfParams(2, node); },
2550
+ paramCount: 2,
2573
2551
  },
2574
2552
  'unshift': {
2575
2553
  evaluate: function (_a, sourceCodeInfo) {
@@ -2583,7 +2561,7 @@ var sequenceNormalExpression = {
2583
2561
  copy.unshift.apply(copy, __spreadArray([], __read(values), false));
2584
2562
  return copy;
2585
2563
  },
2586
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
2564
+ paramCount: { min: 2 },
2587
2565
  },
2588
2566
  'distinct': {
2589
2567
  evaluate: function (_a, sourceCodeInfo) {
@@ -2593,7 +2571,7 @@ var sequenceNormalExpression = {
2593
2571
  return Array.from(new Set(input));
2594
2572
  return Array.from(new Set(input.split(''))).join('');
2595
2573
  },
2596
- validate: function (node) { return assertNumberOfParams(1, node); },
2574
+ paramCount: 1,
2597
2575
  },
2598
2576
  'remove': {
2599
2577
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2608,7 +2586,7 @@ var sequenceNormalExpression = {
2608
2586
  .filter(function (elem) { return !executeFunction(fn, [elem], contextStack, sourceCodeInfo); })
2609
2587
  .join('');
2610
2588
  },
2611
- validate: function (node) { return assertNumberOfParams(2, node); },
2589
+ paramCount: 2,
2612
2590
  },
2613
2591
  'remove_at': {
2614
2592
  evaluate: function (_a, sourceCodeInfo) {
@@ -2625,7 +2603,7 @@ var sequenceNormalExpression = {
2625
2603
  }
2626
2604
  return "".concat(input.substring(0, index)).concat(input.substring(index + 1));
2627
2605
  },
2628
- validate: function (node) { return assertNumberOfParams(2, node); },
2606
+ paramCount: 2,
2629
2607
  },
2630
2608
  'split_at': {
2631
2609
  evaluate: function (_a, sourceCodeInfo) {
@@ -2635,7 +2613,7 @@ var sequenceNormalExpression = {
2635
2613
  assertSeq(seq, sourceCodeInfo);
2636
2614
  return [seq.slice(0, intPos), seq.slice(intPos)];
2637
2615
  },
2638
- validate: function (node) { return assertNumberOfParams(2, node); },
2616
+ paramCount: 2,
2639
2617
  },
2640
2618
  'split_with': {
2641
2619
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2650,7 +2628,7 @@ var sequenceNormalExpression = {
2650
2628
  return [seq, seqIsArray ? [] : ''];
2651
2629
  return [seq.slice(0, index), seq.slice(index)];
2652
2630
  },
2653
- validate: function (node) { return assertNumberOfParams(2, node); },
2631
+ paramCount: 2,
2654
2632
  },
2655
2633
  'frequencies': {
2656
2634
  evaluate: function (_a, sourceCodeInfo) {
@@ -2666,7 +2644,7 @@ var sequenceNormalExpression = {
2666
2644
  return result;
2667
2645
  }, {});
2668
2646
  },
2669
- validate: function (node) { return assertNumberOfParams(1, node); },
2647
+ paramCount: 1,
2670
2648
  },
2671
2649
  'group_by': {
2672
2650
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2684,7 +2662,7 @@ var sequenceNormalExpression = {
2684
2662
  return result;
2685
2663
  }, {});
2686
2664
  },
2687
- validate: function (node) { return assertNumberOfParams(2, node); },
2665
+ paramCount: 2,
2688
2666
  },
2689
2667
  'partition': {
2690
2668
  evaluate: function (params, sourceCodeInfo) {
@@ -2696,7 +2674,7 @@ var sequenceNormalExpression = {
2696
2674
  : undefined;
2697
2675
  return partition(n, step, seq, pad, sourceCodeInfo);
2698
2676
  },
2699
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 4 }, node); },
2677
+ paramCount: { min: 2, max: 4 },
2700
2678
  },
2701
2679
  'partition_all': {
2702
2680
  evaluate: function (params, sourceCodeInfo) {
@@ -2705,7 +2683,7 @@ var sequenceNormalExpression = {
2705
2683
  var step = params.length === 3 ? toNonNegativeInteger(asNumber(params[2], sourceCodeInfo)) : n;
2706
2684
  return partition(n, step, seq, [], sourceCodeInfo);
2707
2685
  },
2708
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
2686
+ paramCount: { min: 2, max: 3 },
2709
2687
  },
2710
2688
  'partition_by': {
2711
2689
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -2726,7 +2704,7 @@ var sequenceNormalExpression = {
2726
2704
  }, []);
2727
2705
  return isStringSeq ? result.map(function (elem) { return elem.join(''); }) : result;
2728
2706
  },
2729
- validate: function (node) { return assertNumberOfParams(2, node); },
2707
+ paramCount: 2,
2730
2708
  },
2731
2709
  'ends_with?': {
2732
2710
  evaluate: function (_a, sourceCodeInfo) {
@@ -2738,7 +2716,7 @@ var sequenceNormalExpression = {
2738
2716
  }
2739
2717
  return str.at(-1) === search;
2740
2718
  },
2741
- validate: function (node) { return assertNumberOfParams(2, node); },
2719
+ paramCount: 2,
2742
2720
  },
2743
2721
  'starts_with?': {
2744
2722
  evaluate: function (_a, sourceCodeInfo) {
@@ -2750,7 +2728,7 @@ var sequenceNormalExpression = {
2750
2728
  }
2751
2729
  return str[0] === search;
2752
2730
  },
2753
- validate: function (node) { return assertNumberOfParams(2, node); },
2731
+ paramCount: 2,
2754
2732
  },
2755
2733
  'interleave': {
2756
2734
  evaluate: function (_a, sourceCodeInfo) {
@@ -2788,7 +2766,7 @@ var sequenceNormalExpression = {
2788
2766
  }
2789
2767
  return isStringSeq ? result.join('') : result;
2790
2768
  },
2791
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
2769
+ paramCount: { min: 1 },
2792
2770
  },
2793
2771
  'interpose': {
2794
2772
  evaluate: function (_a, sourceCodeInfo) {
@@ -2807,7 +2785,7 @@ var sequenceNormalExpression = {
2807
2785
  result.push(seq[seq.length - 1]);
2808
2786
  return result;
2809
2787
  },
2810
- validate: function (node) { return assertNumberOfParams(2, node); },
2788
+ paramCount: 2,
2811
2789
  },
2812
2790
  };
2813
2791
  function partition(n, step, seq, pad, sourceCodeInfo) {
@@ -2845,7 +2823,7 @@ var mathNormalExpression = {
2845
2823
  assertNumber(first, sourceCodeInfo);
2846
2824
  return first + 1;
2847
2825
  },
2848
- validate: function (node) { return assertNumberOfParams(1, node); },
2826
+ paramCount: 1,
2849
2827
  },
2850
2828
  'dec': {
2851
2829
  evaluate: function (_a, sourceCodeInfo) {
@@ -2853,7 +2831,7 @@ var mathNormalExpression = {
2853
2831
  assertNumber(first, sourceCodeInfo);
2854
2832
  return first - 1;
2855
2833
  },
2856
- validate: function (node) { return assertNumberOfParams(1, node); },
2834
+ paramCount: 1,
2857
2835
  },
2858
2836
  '+': {
2859
2837
  evaluate: function (params, sourceCodeInfo) {
@@ -2862,6 +2840,7 @@ var mathNormalExpression = {
2862
2840
  return result + param;
2863
2841
  }, 0);
2864
2842
  },
2843
+ paramCount: {},
2865
2844
  },
2866
2845
  '*': {
2867
2846
  evaluate: function (params, sourceCodeInfo) {
@@ -2870,6 +2849,7 @@ var mathNormalExpression = {
2870
2849
  return result * param;
2871
2850
  }, 1);
2872
2851
  },
2852
+ paramCount: {},
2873
2853
  },
2874
2854
  '/': {
2875
2855
  evaluate: function (params, sourceCodeInfo) {
@@ -2886,6 +2866,7 @@ var mathNormalExpression = {
2886
2866
  return result / param;
2887
2867
  }, first);
2888
2868
  },
2869
+ paramCount: {},
2889
2870
  },
2890
2871
  '-': {
2891
2872
  evaluate: function (params, sourceCodeInfo) {
@@ -2900,6 +2881,7 @@ var mathNormalExpression = {
2900
2881
  return result - param;
2901
2882
  }, first);
2902
2883
  },
2884
+ paramCount: {},
2903
2885
  },
2904
2886
  'quot': {
2905
2887
  evaluate: function (_a, sourceCodeInfo) {
@@ -2909,7 +2891,7 @@ var mathNormalExpression = {
2909
2891
  var quotient = Math.trunc(dividend / divisor);
2910
2892
  return quotient;
2911
2893
  },
2912
- validate: function (node) { return assertNumberOfParams(2, node); },
2894
+ paramCount: 2,
2913
2895
  },
2914
2896
  'mod': {
2915
2897
  evaluate: function (_a, sourceCodeInfo) {
@@ -2919,7 +2901,7 @@ var mathNormalExpression = {
2919
2901
  var quotient = Math.floor(dividend / divisor);
2920
2902
  return dividend - divisor * quotient;
2921
2903
  },
2922
- validate: function (node) { return assertNumberOfParams(2, node); },
2904
+ paramCount: 2,
2923
2905
  },
2924
2906
  '%': {
2925
2907
  evaluate: function (_a, sourceCodeInfo) {
@@ -2929,7 +2911,7 @@ var mathNormalExpression = {
2929
2911
  var quotient = Math.trunc(dividend / divisor);
2930
2912
  return dividend - divisor * quotient;
2931
2913
  },
2932
- validate: function (node) { return assertNumberOfParams(2, node); },
2914
+ paramCount: 2,
2933
2915
  },
2934
2916
  'sqrt': {
2935
2917
  evaluate: function (_a, sourceCodeInfo) {
@@ -2937,7 +2919,7 @@ var mathNormalExpression = {
2937
2919
  assertNumber(first, sourceCodeInfo);
2938
2920
  return Math.sqrt(first);
2939
2921
  },
2940
- validate: function (node) { return assertNumberOfParams(1, node); },
2922
+ paramCount: 1,
2941
2923
  },
2942
2924
  'cbrt': {
2943
2925
  evaluate: function (_a, sourceCodeInfo) {
@@ -2945,7 +2927,7 @@ var mathNormalExpression = {
2945
2927
  assertNumber(first, sourceCodeInfo);
2946
2928
  return Math.cbrt(first);
2947
2929
  },
2948
- validate: function (node) { return assertNumberOfParams(1, node); },
2930
+ paramCount: 1,
2949
2931
  },
2950
2932
  '**': {
2951
2933
  evaluate: function (_a, sourceCodeInfo) {
@@ -2954,7 +2936,7 @@ var mathNormalExpression = {
2954
2936
  assertNumber(second, sourceCodeInfo);
2955
2937
  return Math.pow(first, second);
2956
2938
  },
2957
- validate: function (node) { return assertNumberOfParams(2, node); },
2939
+ paramCount: 2,
2958
2940
  },
2959
2941
  'round': {
2960
2942
  evaluate: function (params, sourceCodeInfo) {
@@ -2966,7 +2948,7 @@ var mathNormalExpression = {
2966
2948
  var factor = Math.pow(10, decimals);
2967
2949
  return Math.round(value * factor) / factor;
2968
2950
  },
2969
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
2951
+ paramCount: { min: 1, max: 2 },
2970
2952
  },
2971
2953
  'trunc': {
2972
2954
  evaluate: function (_a, sourceCodeInfo) {
@@ -2974,7 +2956,7 @@ var mathNormalExpression = {
2974
2956
  assertNumber(first, sourceCodeInfo);
2975
2957
  return Math.trunc(first);
2976
2958
  },
2977
- validate: function (node) { return assertNumberOfParams(1, node); },
2959
+ paramCount: 1,
2978
2960
  },
2979
2961
  'floor': {
2980
2962
  evaluate: function (_a, sourceCodeInfo) {
@@ -2982,7 +2964,7 @@ var mathNormalExpression = {
2982
2964
  assertNumber(first, sourceCodeInfo);
2983
2965
  return Math.floor(first);
2984
2966
  },
2985
- validate: function (node) { return assertNumberOfParams(1, node); },
2967
+ paramCount: 1,
2986
2968
  },
2987
2969
  'ceil': {
2988
2970
  evaluate: function (_a, sourceCodeInfo) {
@@ -2990,7 +2972,7 @@ var mathNormalExpression = {
2990
2972
  assertNumber(first, sourceCodeInfo);
2991
2973
  return Math.ceil(first);
2992
2974
  },
2993
- validate: function (node) { return assertNumberOfParams(1, node); },
2975
+ paramCount: 1,
2994
2976
  },
2995
2977
  'min': {
2996
2978
  evaluate: function (_a, sourceCodeInfo) {
@@ -3003,7 +2985,7 @@ var mathNormalExpression = {
3003
2985
  return Math.min(min, value);
3004
2986
  }, first);
3005
2987
  },
3006
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
2988
+ paramCount: { min: 1 },
3007
2989
  },
3008
2990
  'max': {
3009
2991
  evaluate: function (_a, sourceCodeInfo) {
@@ -3016,7 +2998,7 @@ var mathNormalExpression = {
3016
2998
  return Math.max(min, value);
3017
2999
  }, first);
3018
3000
  },
3019
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3001
+ paramCount: { min: 1 },
3020
3002
  },
3021
3003
  'abs': {
3022
3004
  evaluate: function (_a, sourceCodeInfo) {
@@ -3024,7 +3006,7 @@ var mathNormalExpression = {
3024
3006
  assertNumber(value, sourceCodeInfo);
3025
3007
  return Math.abs(value);
3026
3008
  },
3027
- validate: function (node) { return assertNumberOfParams(1, node); },
3009
+ paramCount: 1,
3028
3010
  },
3029
3011
  'sign': {
3030
3012
  evaluate: function (_a, sourceCodeInfo) {
@@ -3032,67 +3014,67 @@ var mathNormalExpression = {
3032
3014
  assertNumber(value, sourceCodeInfo);
3033
3015
  return Math.sign(value);
3034
3016
  },
3035
- validate: function (node) { return assertNumberOfParams(1, node); },
3017
+ paramCount: 1,
3036
3018
  },
3037
3019
  'max_safe_integer': {
3038
3020
  evaluate: function () {
3039
3021
  return Number.MAX_SAFE_INTEGER;
3040
3022
  },
3041
- validate: function (node) { return assertNumberOfParams(0, node); },
3023
+ paramCount: 0,
3042
3024
  },
3043
3025
  'min_safe_integer': {
3044
3026
  evaluate: function () {
3045
3027
  return Number.MIN_SAFE_INTEGER;
3046
3028
  },
3047
- validate: function (node) { return assertNumberOfParams(0, node); },
3029
+ paramCount: 0,
3048
3030
  },
3049
3031
  'max_value': {
3050
3032
  evaluate: function () {
3051
3033
  return Number.MAX_VALUE;
3052
3034
  },
3053
- validate: function (node) { return assertNumberOfParams(0, node); },
3035
+ paramCount: 0,
3054
3036
  },
3055
3037
  'min_value': {
3056
3038
  evaluate: function () {
3057
3039
  return Number.MIN_VALUE;
3058
3040
  },
3059
- validate: function (node) { return assertNumberOfParams(0, node); },
3041
+ paramCount: 0,
3060
3042
  },
3061
3043
  'epsilon': {
3062
3044
  evaluate: function () {
3063
3045
  return Number.EPSILON;
3064
3046
  },
3065
- validate: function (node) { return assertNumberOfParams(0, node); },
3047
+ paramCount: 0,
3066
3048
  },
3067
3049
  'positive_infinity': {
3068
3050
  evaluate: function () {
3069
3051
  return Number.POSITIVE_INFINITY;
3070
3052
  },
3071
- validate: function (node) { return assertNumberOfParams(0, node); },
3053
+ paramCount: 0,
3072
3054
  },
3073
3055
  'negative_infinity': {
3074
3056
  evaluate: function () {
3075
3057
  return Number.NEGATIVE_INFINITY;
3076
3058
  },
3077
- validate: function (node) { return assertNumberOfParams(0, node); },
3059
+ paramCount: 0,
3078
3060
  },
3079
3061
  'nan': {
3080
3062
  evaluate: function () {
3081
3063
  return Number.NaN;
3082
3064
  },
3083
- validate: function (node) { return assertNumberOfParams(0, node); },
3065
+ paramCount: 0,
3084
3066
  },
3085
3067
  'e': {
3086
3068
  evaluate: function () {
3087
3069
  return Math.E;
3088
3070
  },
3089
- validate: function (node) { return assertNumberOfParams(0, node); },
3071
+ paramCount: 0,
3090
3072
  },
3091
3073
  'pi': {
3092
3074
  evaluate: function () {
3093
3075
  return Math.PI;
3094
3076
  },
3095
- validate: function (node) { return assertNumberOfParams(0, node); },
3077
+ paramCount: 0,
3096
3078
  },
3097
3079
  'exp': {
3098
3080
  evaluate: function (_a, sourceCodeInfo) {
@@ -3100,7 +3082,7 @@ var mathNormalExpression = {
3100
3082
  assertNumber(value, sourceCodeInfo);
3101
3083
  return Math.exp(value);
3102
3084
  },
3103
- validate: function (node) { return assertNumberOfParams(1, node); },
3085
+ paramCount: 1,
3104
3086
  },
3105
3087
  'log': {
3106
3088
  evaluate: function (_a, sourceCodeInfo) {
@@ -3108,7 +3090,7 @@ var mathNormalExpression = {
3108
3090
  assertNumber(value, sourceCodeInfo);
3109
3091
  return Math.log(value);
3110
3092
  },
3111
- validate: function (node) { return assertNumberOfParams(1, node); },
3093
+ paramCount: 1,
3112
3094
  },
3113
3095
  'log2': {
3114
3096
  evaluate: function (_a, sourceCodeInfo) {
@@ -3116,7 +3098,7 @@ var mathNormalExpression = {
3116
3098
  assertNumber(value, sourceCodeInfo);
3117
3099
  return Math.log2(value);
3118
3100
  },
3119
- validate: function (node) { return assertNumberOfParams(1, node); },
3101
+ paramCount: 1,
3120
3102
  },
3121
3103
  'log10': {
3122
3104
  evaluate: function (_a, sourceCodeInfo) {
@@ -3124,7 +3106,7 @@ var mathNormalExpression = {
3124
3106
  assertNumber(value, sourceCodeInfo);
3125
3107
  return Math.log10(value);
3126
3108
  },
3127
- validate: function (node) { return assertNumberOfParams(1, node); },
3109
+ paramCount: 1,
3128
3110
  },
3129
3111
  'sin': {
3130
3112
  evaluate: function (_a, sourceCodeInfo) {
@@ -3132,7 +3114,7 @@ var mathNormalExpression = {
3132
3114
  assertNumber(value, sourceCodeInfo);
3133
3115
  return Math.sin(value);
3134
3116
  },
3135
- validate: function (node) { return assertNumberOfParams(1, node); },
3117
+ paramCount: 1,
3136
3118
  },
3137
3119
  'asin': {
3138
3120
  evaluate: function (_a, sourceCodeInfo) {
@@ -3140,7 +3122,7 @@ var mathNormalExpression = {
3140
3122
  assertNumber(value, sourceCodeInfo);
3141
3123
  return Math.asin(value);
3142
3124
  },
3143
- validate: function (node) { return assertNumberOfParams(1, node); },
3125
+ paramCount: 1,
3144
3126
  },
3145
3127
  'sinh': {
3146
3128
  evaluate: function (_a, sourceCodeInfo) {
@@ -3148,7 +3130,7 @@ var mathNormalExpression = {
3148
3130
  assertNumber(value, sourceCodeInfo);
3149
3131
  return Math.sinh(value);
3150
3132
  },
3151
- validate: function (node) { return assertNumberOfParams(1, node); },
3133
+ paramCount: 1,
3152
3134
  },
3153
3135
  'asinh': {
3154
3136
  evaluate: function (_a, sourceCodeInfo) {
@@ -3156,7 +3138,7 @@ var mathNormalExpression = {
3156
3138
  assertNumber(value, sourceCodeInfo);
3157
3139
  return Math.asinh(value);
3158
3140
  },
3159
- validate: function (node) { return assertNumberOfParams(1, node); },
3141
+ paramCount: 1,
3160
3142
  },
3161
3143
  'cos': {
3162
3144
  evaluate: function (_a, sourceCodeInfo) {
@@ -3164,7 +3146,7 @@ var mathNormalExpression = {
3164
3146
  assertNumber(value, sourceCodeInfo);
3165
3147
  return Math.cos(value);
3166
3148
  },
3167
- validate: function (node) { return assertNumberOfParams(1, node); },
3149
+ paramCount: 1,
3168
3150
  },
3169
3151
  'acos': {
3170
3152
  evaluate: function (_a, sourceCodeInfo) {
@@ -3172,7 +3154,7 @@ var mathNormalExpression = {
3172
3154
  assertNumber(value, sourceCodeInfo);
3173
3155
  return Math.acos(value);
3174
3156
  },
3175
- validate: function (node) { return assertNumberOfParams(1, node); },
3157
+ paramCount: 1,
3176
3158
  },
3177
3159
  'cosh': {
3178
3160
  evaluate: function (_a, sourceCodeInfo) {
@@ -3180,7 +3162,7 @@ var mathNormalExpression = {
3180
3162
  assertNumber(value, sourceCodeInfo);
3181
3163
  return Math.cosh(value);
3182
3164
  },
3183
- validate: function (node) { return assertNumberOfParams(1, node); },
3165
+ paramCount: 1,
3184
3166
  },
3185
3167
  'acosh': {
3186
3168
  evaluate: function (_a, sourceCodeInfo) {
@@ -3188,7 +3170,7 @@ var mathNormalExpression = {
3188
3170
  assertNumber(value, sourceCodeInfo);
3189
3171
  return Math.acosh(value);
3190
3172
  },
3191
- validate: function (node) { return assertNumberOfParams(1, node); },
3173
+ paramCount: 1,
3192
3174
  },
3193
3175
  'tan': {
3194
3176
  evaluate: function (_a, sourceCodeInfo) {
@@ -3196,7 +3178,7 @@ var mathNormalExpression = {
3196
3178
  assertNumber(value, sourceCodeInfo);
3197
3179
  return Math.tan(value);
3198
3180
  },
3199
- validate: function (node) { return assertNumberOfParams(1, node); },
3181
+ paramCount: 1,
3200
3182
  },
3201
3183
  'atan': {
3202
3184
  evaluate: function (_a, sourceCodeInfo) {
@@ -3204,7 +3186,7 @@ var mathNormalExpression = {
3204
3186
  assertNumber(value, sourceCodeInfo);
3205
3187
  return Math.atan(value);
3206
3188
  },
3207
- validate: function (node) { return assertNumberOfParams(1, node); },
3189
+ paramCount: 1,
3208
3190
  },
3209
3191
  'tanh': {
3210
3192
  evaluate: function (_a, sourceCodeInfo) {
@@ -3212,7 +3194,7 @@ var mathNormalExpression = {
3212
3194
  assertNumber(value, sourceCodeInfo);
3213
3195
  return Math.tanh(value);
3214
3196
  },
3215
- validate: function (node) { return assertNumberOfParams(1, node); },
3197
+ paramCount: 1,
3216
3198
  },
3217
3199
  'atanh': {
3218
3200
  evaluate: function (_a, sourceCodeInfo) {
@@ -3220,7 +3202,7 @@ var mathNormalExpression = {
3220
3202
  assertNumber(value, sourceCodeInfo);
3221
3203
  return Math.atanh(value);
3222
3204
  },
3223
- validate: function (node) { return assertNumberOfParams(1, node); },
3205
+ paramCount: 1,
3224
3206
  },
3225
3207
  };
3226
3208
 
@@ -3235,7 +3217,7 @@ var miscNormalExpression = {
3235
3217
  }
3236
3218
  return true;
3237
3219
  },
3238
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3220
+ paramCount: { min: 1 },
3239
3221
  },
3240
3222
  '==': {
3241
3223
  evaluate: function (_a) {
@@ -3257,14 +3239,14 @@ var miscNormalExpression = {
3257
3239
  }
3258
3240
  return true;
3259
3241
  },
3260
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3242
+ paramCount: { min: 1 },
3261
3243
  },
3262
3244
  'equal?': {
3263
3245
  evaluate: function (_a, sourceCodeInfo) {
3264
3246
  var _b = __read(_a, 2), a = _b[0], b = _b[1];
3265
3247
  return deepEqual(asAny(a, sourceCodeInfo), asAny(b, sourceCodeInfo), sourceCodeInfo);
3266
3248
  },
3267
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3249
+ paramCount: { min: 1 },
3268
3250
  },
3269
3251
  '>': {
3270
3252
  evaluate: function (_a) {
@@ -3288,7 +3270,7 @@ var miscNormalExpression = {
3288
3270
  }
3289
3271
  return true;
3290
3272
  },
3291
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3273
+ paramCount: { min: 1 },
3292
3274
  },
3293
3275
  '<': {
3294
3276
  evaluate: function (_a) {
@@ -3312,7 +3294,7 @@ var miscNormalExpression = {
3312
3294
  }
3313
3295
  return true;
3314
3296
  },
3315
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3297
+ paramCount: { min: 1 },
3316
3298
  },
3317
3299
  '>=': {
3318
3300
  evaluate: function (_a) {
@@ -3336,7 +3318,7 @@ var miscNormalExpression = {
3336
3318
  }
3337
3319
  return true;
3338
3320
  },
3339
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3321
+ paramCount: { min: 1 },
3340
3322
  },
3341
3323
  '<=': {
3342
3324
  evaluate: function (_a) {
@@ -3360,14 +3342,14 @@ var miscNormalExpression = {
3360
3342
  }
3361
3343
  return true;
3362
3344
  },
3363
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
3345
+ paramCount: { min: 1 },
3364
3346
  },
3365
3347
  '!': {
3366
3348
  evaluate: function (_a) {
3367
3349
  var _b = __read(_a, 1), first = _b[0];
3368
3350
  return !first;
3369
3351
  },
3370
- validate: function (node) { return assertNumberOfParams(1, node); },
3352
+ paramCount: 1,
3371
3353
  },
3372
3354
  'epoch>iso_date': {
3373
3355
  evaluate: function (_a, sourceCodeInfo) {
@@ -3375,7 +3357,7 @@ var miscNormalExpression = {
3375
3357
  assertNumber(ms, sourceCodeInfo);
3376
3358
  return new Date(ms).toISOString();
3377
3359
  },
3378
- validate: function (node) { return assertNumberOfParams(1, node); },
3360
+ paramCount: 1,
3379
3361
  },
3380
3362
  'iso_date>epoch': {
3381
3363
  evaluate: function (_a, sourceCodeInfo) {
@@ -3385,7 +3367,7 @@ var miscNormalExpression = {
3385
3367
  assertNumber(ms, sourceCodeInfo, { finite: true });
3386
3368
  return ms;
3387
3369
  },
3388
- validate: function (node) { return assertNumberOfParams(1, node); },
3370
+ paramCount: 1,
3389
3371
  },
3390
3372
  'write!': {
3391
3373
  evaluate: function (params, sourceCodeInfo) {
@@ -3395,20 +3377,21 @@ var miscNormalExpression = {
3395
3377
  return asAny(params[params.length - 1], sourceCodeInfo);
3396
3378
  return null;
3397
3379
  },
3380
+ paramCount: {},
3398
3381
  },
3399
3382
  'boolean': {
3400
3383
  evaluate: function (_a) {
3401
3384
  var _b = __read(_a, 1), value = _b[0];
3402
3385
  return !!value;
3403
3386
  },
3404
- validate: function (node) { return assertNumberOfParams(1, node); },
3387
+ paramCount: 1,
3405
3388
  },
3406
3389
  'compare': {
3407
3390
  evaluate: function (_a) {
3408
3391
  var _b = __read(_a, 2), a = _b[0], b = _b[1];
3409
3392
  return compare(a, b);
3410
3393
  },
3411
- validate: function (node) { return assertNumberOfParams(2, node); },
3394
+ paramCount: 2,
3412
3395
  },
3413
3396
  'json_parse': {
3414
3397
  evaluate: function (_a, sourceCodeInfo) {
@@ -3417,7 +3400,7 @@ var miscNormalExpression = {
3417
3400
  // eslint-disable-next-line ts/no-unsafe-return
3418
3401
  return JSON.parse(first);
3419
3402
  },
3420
- validate: function (node) { return assertNumberOfParams(1, node); },
3403
+ paramCount: 1,
3421
3404
  },
3422
3405
  'json_stringify': {
3423
3406
  evaluate: function (_a, sourceCodeInfo) {
@@ -3428,7 +3411,7 @@ var miscNormalExpression = {
3428
3411
  assertNumber(second, sourceCodeInfo);
3429
3412
  return JSON.stringify(first, null, second);
3430
3413
  },
3431
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3414
+ paramCount: { min: 1, max: 2 },
3432
3415
  },
3433
3416
  };
3434
3417
 
@@ -3442,7 +3425,7 @@ var assertNormalExpression = {
3442
3425
  throw new AssertionError(message, sourceCodeInfo);
3443
3426
  return asAny(value, sourceCodeInfo);
3444
3427
  },
3445
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3428
+ paramCount: { min: 1, max: 2 },
3446
3429
  },
3447
3430
  'assert=': {
3448
3431
  evaluate: function (_a, sourceCodeInfo) {
@@ -3452,7 +3435,7 @@ var assertNormalExpression = {
3452
3435
  throw new AssertionError("Expected ".concat(first, " to be ").concat(second, ".").concat(message), sourceCodeInfo);
3453
3436
  return null;
3454
3437
  },
3455
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3438
+ paramCount: { min: 2, max: 3 },
3456
3439
  },
3457
3440
  'assert!=': {
3458
3441
  evaluate: function (_a, sourceCodeInfo) {
@@ -3462,7 +3445,7 @@ var assertNormalExpression = {
3462
3445
  throw new AssertionError("Expected ".concat(first, " not to be ").concat(second, ".").concat(message), sourceCodeInfo);
3463
3446
  return null;
3464
3447
  },
3465
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3448
+ paramCount: { min: 2, max: 3 },
3466
3449
  },
3467
3450
  'assert_equal': {
3468
3451
  evaluate: function (_a, sourceCodeInfo) {
@@ -3473,7 +3456,7 @@ var assertNormalExpression = {
3473
3456
  }
3474
3457
  return null;
3475
3458
  },
3476
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3459
+ paramCount: { min: 2, max: 3 },
3477
3460
  },
3478
3461
  'assert_not_equal': {
3479
3462
  evaluate: function (_a, sourceCodeInfo) {
@@ -3484,7 +3467,7 @@ var assertNormalExpression = {
3484
3467
  }
3485
3468
  return null;
3486
3469
  },
3487
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3470
+ paramCount: { min: 2, max: 3 },
3488
3471
  },
3489
3472
  'assert_gt': {
3490
3473
  evaluate: function (_a, sourceCodeInfo) {
@@ -3494,7 +3477,7 @@ var assertNormalExpression = {
3494
3477
  throw new AssertionError("Expected ".concat(first, " to be grater than ").concat(second, ".").concat(message), sourceCodeInfo);
3495
3478
  return null;
3496
3479
  },
3497
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3480
+ paramCount: { min: 2, max: 3 },
3498
3481
  },
3499
3482
  'assert_gte': {
3500
3483
  evaluate: function (_a, sourceCodeInfo) {
@@ -3504,7 +3487,7 @@ var assertNormalExpression = {
3504
3487
  throw new AssertionError("Expected ".concat(first, " to be grater than or equal to ").concat(second, ".").concat(message), sourceCodeInfo);
3505
3488
  return null;
3506
3489
  },
3507
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3490
+ paramCount: { min: 2, max: 3 },
3508
3491
  },
3509
3492
  'assert_lt': {
3510
3493
  evaluate: function (_a, sourceCodeInfo) {
@@ -3514,7 +3497,7 @@ var assertNormalExpression = {
3514
3497
  throw new AssertionError("Expected ".concat(first, " to be less than ").concat(second, ".").concat(message), sourceCodeInfo);
3515
3498
  return null;
3516
3499
  },
3517
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3500
+ paramCount: { min: 2, max: 3 },
3518
3501
  },
3519
3502
  'assert_lte': {
3520
3503
  evaluate: function (_a, sourceCodeInfo) {
@@ -3524,7 +3507,7 @@ var assertNormalExpression = {
3524
3507
  throw new AssertionError("Expected ".concat(first, " to be less than or equal to ").concat(second, ".").concat(message), sourceCodeInfo);
3525
3508
  return null;
3526
3509
  },
3527
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3510
+ paramCount: { min: 2, max: 3 },
3528
3511
  },
3529
3512
  'assert_true': {
3530
3513
  evaluate: function (_a, sourceCodeInfo) {
@@ -3534,7 +3517,7 @@ var assertNormalExpression = {
3534
3517
  throw new AssertionError("Expected ".concat(first, " to be true.").concat(message), sourceCodeInfo);
3535
3518
  return null;
3536
3519
  },
3537
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3520
+ paramCount: { min: 1, max: 2 },
3538
3521
  },
3539
3522
  'assert_false': {
3540
3523
  evaluate: function (_a, sourceCodeInfo) {
@@ -3544,7 +3527,7 @@ var assertNormalExpression = {
3544
3527
  throw new AssertionError("Expected ".concat(first, " to be false.").concat(message), sourceCodeInfo);
3545
3528
  return null;
3546
3529
  },
3547
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3530
+ paramCount: { min: 1, max: 2 },
3548
3531
  },
3549
3532
  'assert_truthy': {
3550
3533
  evaluate: function (_a, sourceCodeInfo) {
@@ -3554,7 +3537,7 @@ var assertNormalExpression = {
3554
3537
  throw new AssertionError("Expected ".concat(first, " to be truthy.").concat(message), sourceCodeInfo);
3555
3538
  return null;
3556
3539
  },
3557
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3540
+ paramCount: { min: 1, max: 2 },
3558
3541
  },
3559
3542
  'assert_falsy': {
3560
3543
  evaluate: function (_a, sourceCodeInfo) {
@@ -3564,7 +3547,7 @@ var assertNormalExpression = {
3564
3547
  throw new AssertionError("Expected ".concat(first, " to be falsy.").concat(message), sourceCodeInfo);
3565
3548
  return null;
3566
3549
  },
3567
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3550
+ paramCount: { min: 1, max: 2 },
3568
3551
  },
3569
3552
  'assert_null': {
3570
3553
  evaluate: function (_a, sourceCodeInfo) {
@@ -3574,7 +3557,7 @@ var assertNormalExpression = {
3574
3557
  throw new AssertionError("Expected ".concat(first, " to be nil.").concat(message), sourceCodeInfo);
3575
3558
  return null;
3576
3559
  },
3577
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3560
+ paramCount: { min: 1, max: 2 },
3578
3561
  },
3579
3562
  'assert_throws': {
3580
3563
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -3590,7 +3573,7 @@ var assertNormalExpression = {
3590
3573
  }
3591
3574
  throw new AssertionError("Expected function to throw.".concat(message), sourceCodeInfo);
3592
3575
  },
3593
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3576
+ paramCount: { min: 1, max: 2 },
3594
3577
  },
3595
3578
  'assert_throws_error': {
3596
3579
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -3611,7 +3594,7 @@ var assertNormalExpression = {
3611
3594
  }
3612
3595
  throw new AssertionError("Expected function to throw \"".concat(throwMessage, "\".").concat(message), sourceCodeInfo);
3613
3596
  },
3614
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
3597
+ paramCount: { min: 2, max: 3 },
3615
3598
  },
3616
3599
  'assert_not_throws': {
3617
3600
  evaluate: function (_a, sourceCodeInfo, contextStack, _b) {
@@ -3627,7 +3610,7 @@ var assertNormalExpression = {
3627
3610
  }
3628
3611
  return null;
3629
3612
  },
3630
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3613
+ paramCount: { min: 1, max: 2 },
3631
3614
  },
3632
3615
  };
3633
3616
 
@@ -3643,7 +3626,7 @@ var objectNormalExpression = {
3643
3626
  }
3644
3627
  return result;
3645
3628
  },
3646
- validate: function (node) { return assertEvenNumberOfParams(node); },
3629
+ paramCount: { even: true },
3647
3630
  },
3648
3631
  keys: {
3649
3632
  evaluate: function (_a, sourceCodeInfo) {
@@ -3651,7 +3634,7 @@ var objectNormalExpression = {
3651
3634
  assertObj(obj, sourceCodeInfo);
3652
3635
  return Object.keys(obj);
3653
3636
  },
3654
- validate: function (node) { return assertNumberOfParams(1, node); },
3637
+ paramCount: 1,
3655
3638
  },
3656
3639
  vals: {
3657
3640
  evaluate: function (_a, sourceCodeInfo) {
@@ -3659,7 +3642,7 @@ var objectNormalExpression = {
3659
3642
  assertObj(obj, sourceCodeInfo);
3660
3643
  return Object.values(obj);
3661
3644
  },
3662
- validate: function (node) { return assertNumberOfParams(1, node); },
3645
+ paramCount: 1,
3663
3646
  },
3664
3647
  entries: {
3665
3648
  evaluate: function (_a, sourceCodeInfo) {
@@ -3667,7 +3650,7 @@ var objectNormalExpression = {
3667
3650
  assertObj(obj, sourceCodeInfo);
3668
3651
  return Object.entries(obj);
3669
3652
  },
3670
- validate: function (node) { return assertNumberOfParams(1, node); },
3653
+ paramCount: 1,
3671
3654
  },
3672
3655
  find: {
3673
3656
  evaluate: function (_a, sourceCodeInfo) {
@@ -3678,7 +3661,7 @@ var objectNormalExpression = {
3678
3661
  return [key, obj[key]];
3679
3662
  return null;
3680
3663
  },
3681
- validate: function (node) { return assertNumberOfParams(2, node); },
3664
+ paramCount: 2,
3682
3665
  },
3683
3666
  dissoc: {
3684
3667
  evaluate: function (_a, sourceCodeInfo) {
@@ -3689,7 +3672,7 @@ var objectNormalExpression = {
3689
3672
  delete newObj[key];
3690
3673
  return newObj;
3691
3674
  },
3692
- validate: function (node) { return assertNumberOfParams(2, node); },
3675
+ paramCount: 2,
3693
3676
  },
3694
3677
  merge: {
3695
3678
  evaluate: function (params, sourceCodeInfo) {
@@ -3702,7 +3685,7 @@ var objectNormalExpression = {
3702
3685
  return __assign(__assign({}, result), obj);
3703
3686
  }, __assign({}, first));
3704
3687
  },
3705
- validate: function (node) { return assertNumberOfParams({ min: 0 }, node); },
3688
+ paramCount: { min: 0 },
3706
3689
  },
3707
3690
  merge_with: {
3708
3691
  evaluate: function (params, sourceCodeInfo, contextStack, _a) {
@@ -3725,7 +3708,7 @@ var objectNormalExpression = {
3725
3708
  return result;
3726
3709
  }, __assign({}, first));
3727
3710
  },
3728
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
3711
+ paramCount: { min: 2 },
3729
3712
  },
3730
3713
  zipmap: {
3731
3714
  evaluate: function (_a, sourceCodeInfo) {
@@ -3740,7 +3723,7 @@ var objectNormalExpression = {
3740
3723
  }
3741
3724
  return result;
3742
3725
  },
3743
- validate: function (node) { return assertNumberOfParams(2, node); },
3726
+ paramCount: 2,
3744
3727
  },
3745
3728
  select_keys: {
3746
3729
  evaluate: function (_a, sourceCodeInfo) {
@@ -3753,7 +3736,7 @@ var objectNormalExpression = {
3753
3736
  return result;
3754
3737
  }, {});
3755
3738
  },
3756
- validate: function (node) { return assertNumberOfParams(2, node); },
3739
+ paramCount: 2,
3757
3740
  },
3758
3741
  };
3759
3742
 
@@ -3763,42 +3746,42 @@ var predicatesNormalExpression = {
3763
3746
  var _b = __read(_a, 1), first = _b[0];
3764
3747
  return isLitsFunction(first);
3765
3748
  },
3766
- validate: function (node) { return assertNumberOfParams(1, node); },
3749
+ paramCount: 1,
3767
3750
  },
3768
3751
  'string?': {
3769
3752
  evaluate: function (_a) {
3770
3753
  var _b = __read(_a, 1), first = _b[0];
3771
3754
  return typeof first === 'string';
3772
3755
  },
3773
- validate: function (node) { return assertNumberOfParams(1, node); },
3756
+ paramCount: 1,
3774
3757
  },
3775
3758
  'number?': {
3776
3759
  evaluate: function (_a) {
3777
3760
  var _b = __read(_a, 1), first = _b[0];
3778
3761
  return typeof first === 'number';
3779
3762
  },
3780
- validate: function (node) { return assertNumberOfParams(1, node); },
3763
+ paramCount: 1,
3781
3764
  },
3782
3765
  'integer?': {
3783
3766
  evaluate: function (_a) {
3784
3767
  var _b = __read(_a, 1), first = _b[0];
3785
3768
  return typeof first === 'number' && isNumber(first, { integer: true });
3786
3769
  },
3787
- validate: function (node) { return assertNumberOfParams(1, node); },
3770
+ paramCount: 1,
3788
3771
  },
3789
3772
  'boolean?': {
3790
3773
  evaluate: function (_a) {
3791
3774
  var _b = __read(_a, 1), first = _b[0];
3792
3775
  return typeof first === 'boolean';
3793
3776
  },
3794
- validate: function (node) { return assertNumberOfParams(1, node); },
3777
+ paramCount: 1,
3795
3778
  },
3796
3779
  'nil?': {
3797
3780
  evaluate: function (_a) {
3798
3781
  var _b = __read(_a, 1), first = _b[0];
3799
3782
  return first === null || first === undefined;
3800
3783
  },
3801
- validate: function (node) { return assertNumberOfParams(1, node); },
3784
+ paramCount: 1,
3802
3785
  },
3803
3786
  'zero?': {
3804
3787
  evaluate: function (_a, sourceCodeInfo) {
@@ -3806,7 +3789,7 @@ var predicatesNormalExpression = {
3806
3789
  assertNumber(first, sourceCodeInfo, { finite: true });
3807
3790
  return first === 0;
3808
3791
  },
3809
- validate: function (node) { return assertNumberOfParams(1, node); },
3792
+ paramCount: 1,
3810
3793
  },
3811
3794
  'pos?': {
3812
3795
  evaluate: function (_a, sourceCodeInfo) {
@@ -3814,7 +3797,7 @@ var predicatesNormalExpression = {
3814
3797
  assertNumber(first, sourceCodeInfo, { finite: true });
3815
3798
  return first > 0;
3816
3799
  },
3817
- validate: function (node) { return assertNumberOfParams(1, node); },
3800
+ paramCount: 1,
3818
3801
  },
3819
3802
  'neg?': {
3820
3803
  evaluate: function (_a, sourceCodeInfo) {
@@ -3822,7 +3805,7 @@ var predicatesNormalExpression = {
3822
3805
  assertNumber(first, sourceCodeInfo, { finite: true });
3823
3806
  return first < 0;
3824
3807
  },
3825
- validate: function (node) { return assertNumberOfParams(1, node); },
3808
+ paramCount: 1,
3826
3809
  },
3827
3810
  'even?': {
3828
3811
  evaluate: function (_a, sourceCodeInfo) {
@@ -3830,7 +3813,7 @@ var predicatesNormalExpression = {
3830
3813
  assertNumber(first, sourceCodeInfo, { finite: true });
3831
3814
  return first % 2 === 0;
3832
3815
  },
3833
- validate: function (node) { return assertNumberOfParams(1, node); },
3816
+ paramCount: 1,
3834
3817
  },
3835
3818
  'odd?': {
3836
3819
  evaluate: function (_a, sourceCodeInfo) {
@@ -3838,42 +3821,42 @@ var predicatesNormalExpression = {
3838
3821
  assertNumber(first, sourceCodeInfo, { finite: true });
3839
3822
  return isNumber(first, { integer: true }) && first % 2 !== 0;
3840
3823
  },
3841
- validate: function (node) { return assertNumberOfParams(1, node); },
3824
+ paramCount: 1,
3842
3825
  },
3843
3826
  'array?': {
3844
3827
  evaluate: function (_a) {
3845
3828
  var _b = __read(_a, 1), first = _b[0];
3846
3829
  return Array.isArray(first);
3847
3830
  },
3848
- validate: function (node) { return assertNumberOfParams(1, node); },
3831
+ paramCount: 1,
3849
3832
  },
3850
3833
  'coll?': {
3851
3834
  evaluate: function (_a) {
3852
3835
  var _b = __read(_a, 1), first = _b[0];
3853
3836
  return isColl(first);
3854
3837
  },
3855
- validate: function (node) { return assertNumberOfParams(1, node); },
3838
+ paramCount: 1,
3856
3839
  },
3857
3840
  'seq?': {
3858
3841
  evaluate: function (_a) {
3859
3842
  var _b = __read(_a, 1), first = _b[0];
3860
3843
  return isSeq(first);
3861
3844
  },
3862
- validate: function (node) { return assertNumberOfParams(1, node); },
3845
+ paramCount: 1,
3863
3846
  },
3864
3847
  'object?': {
3865
3848
  evaluate: function (_a) {
3866
3849
  var _b = __read(_a, 1), first = _b[0];
3867
3850
  return isObj(first);
3868
3851
  },
3869
- validate: function (node) { return assertNumberOfParams(1, node); },
3852
+ paramCount: 1,
3870
3853
  },
3871
3854
  'regexp?': {
3872
3855
  evaluate: function (_a) {
3873
3856
  var _b = __read(_a, 1), value = _b[0];
3874
3857
  return isRegularExpression(value);
3875
3858
  },
3876
- validate: function (node) { return assertNumberOfParams(1, node); },
3859
+ paramCount: 1,
3877
3860
  },
3878
3861
  'finite?': {
3879
3862
  evaluate: function (_a, sourceCodeInfo) {
@@ -3881,7 +3864,7 @@ var predicatesNormalExpression = {
3881
3864
  assertNumber(value, sourceCodeInfo);
3882
3865
  return Number.isFinite(value);
3883
3866
  },
3884
- validate: function (node) { return assertNumberOfParams(1, node); },
3867
+ paramCount: 1,
3885
3868
  },
3886
3869
  'nan?': {
3887
3870
  evaluate: function (_a, sourceCodeInfo) {
@@ -3889,7 +3872,7 @@ var predicatesNormalExpression = {
3889
3872
  assertNumber(value, sourceCodeInfo);
3890
3873
  return Number.isNaN(value);
3891
3874
  },
3892
- validate: function (node) { return assertNumberOfParams(1, node); },
3875
+ paramCount: 1,
3893
3876
  },
3894
3877
  'positive_infinity?': {
3895
3878
  evaluate: function (_a, sourceCodeInfo) {
@@ -3897,7 +3880,7 @@ var predicatesNormalExpression = {
3897
3880
  assertNumber(value, sourceCodeInfo);
3898
3881
  return value === Number.POSITIVE_INFINITY;
3899
3882
  },
3900
- validate: function (node) { return assertNumberOfParams(1, node); },
3883
+ paramCount: 1,
3901
3884
  },
3902
3885
  'negative_infinity?': {
3903
3886
  evaluate: function (_a, sourceCodeInfo) {
@@ -3905,21 +3888,21 @@ var predicatesNormalExpression = {
3905
3888
  assertNumber(value, sourceCodeInfo);
3906
3889
  return value === Number.NEGATIVE_INFINITY;
3907
3890
  },
3908
- validate: function (node) { return assertNumberOfParams(1, node); },
3891
+ paramCount: 1,
3909
3892
  },
3910
3893
  'true?': {
3911
3894
  evaluate: function (_a) {
3912
3895
  var _b = __read(_a, 1), value = _b[0];
3913
3896
  return value === true;
3914
3897
  },
3915
- validate: function (node) { return assertNumberOfParams(1, node); },
3898
+ paramCount: 1,
3916
3899
  },
3917
3900
  'false?': {
3918
3901
  evaluate: function (_a) {
3919
3902
  var _b = __read(_a, 1), value = _b[0];
3920
3903
  return value === false;
3921
3904
  },
3922
- validate: function (node) { return assertNumberOfParams(1, node); },
3905
+ paramCount: 1,
3923
3906
  },
3924
3907
  'empty?': {
3925
3908
  evaluate: function (_a, sourceCodeInfo) {
@@ -3933,7 +3916,7 @@ var predicatesNormalExpression = {
3933
3916
  return coll.length === 0;
3934
3917
  return Object.keys(coll).length === 0;
3935
3918
  },
3936
- validate: function (node) { return assertNumberOfParams(1, node); },
3919
+ paramCount: 1,
3937
3920
  },
3938
3921
  'not_empty?': {
3939
3922
  evaluate: function (_a, sourceCodeInfo) {
@@ -3947,7 +3930,7 @@ var predicatesNormalExpression = {
3947
3930
  return coll.length > 0;
3948
3931
  return Object.keys(coll).length > 0;
3949
3932
  },
3950
- validate: function (node) { return assertNumberOfParams(1, node); },
3933
+ paramCount: 1,
3951
3934
  },
3952
3935
  };
3953
3936
 
@@ -3966,7 +3949,7 @@ var regexpNormalExpression = {
3966
3949
  _b.f = flags,
3967
3950
  _b;
3968
3951
  },
3969
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
3952
+ paramCount: { min: 1, max: 2 },
3970
3953
  },
3971
3954
  match: {
3972
3955
  evaluate: function (_a, sourceCodeInfo) {
@@ -3980,7 +3963,7 @@ var regexpNormalExpression = {
3980
3963
  return __spreadArray([], __read(match), false);
3981
3964
  return null;
3982
3965
  },
3983
- validate: function (node) { return assertNumberOfParams(2, node); },
3966
+ paramCount: 2,
3984
3967
  },
3985
3968
  replace: {
3986
3969
  evaluate: function (_a, sourceCodeInfo) {
@@ -3991,7 +3974,7 @@ var regexpNormalExpression = {
3991
3974
  var matcher = isRegularExpression(regexp) ? new RegExp(regexp.s, "".concat(regexp.f)) : regexp;
3992
3975
  return str.replace(matcher, value);
3993
3976
  },
3994
- validate: function (node) { return assertNumberOfParams(3, node); },
3977
+ paramCount: 3,
3995
3978
  },
3996
3979
  replace_all: {
3997
3980
  evaluate: function (_a, sourceCodeInfo) {
@@ -4002,7 +3985,7 @@ var regexpNormalExpression = {
4002
3985
  var matcher = isRegularExpression(regexp) ? new RegExp(regexp.s, "".concat(regexp.f.includes('g') ? regexp.f : "".concat(regexp.f, "g"))) : regexp;
4003
3986
  return str.replaceAll(matcher, value);
4004
3987
  },
4005
- validate: function (node) { return assertNumberOfParams(3, node); },
3988
+ paramCount: 3,
4006
3989
  },
4007
3990
  };
4008
3991
 
@@ -4018,7 +4001,7 @@ var stringNormalExpression = {
4018
4001
  assertNumber(third, sourceCodeInfo, { gte: second });
4019
4002
  return (first).substring(second, third);
4020
4003
  },
4021
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4004
+ paramCount: { min: 2, max: 3 },
4022
4005
  },
4023
4006
  'string_repeat': {
4024
4007
  evaluate: function (_a, sourceCodeInfo) {
@@ -4027,7 +4010,7 @@ var stringNormalExpression = {
4027
4010
  assertNumber(count, sourceCodeInfo, { integer: true, nonNegative: true });
4028
4011
  return str.repeat(count);
4029
4012
  },
4030
- validate: function (node) { return assertNumberOfParams(2, node); },
4013
+ paramCount: 2,
4031
4014
  },
4032
4015
  'str': {
4033
4016
  evaluate: function (params) {
@@ -4042,6 +4025,7 @@ var stringNormalExpression = {
4042
4025
  return result + paramStr;
4043
4026
  }, '');
4044
4027
  },
4028
+ paramCount: {},
4045
4029
  },
4046
4030
  'number': {
4047
4031
  evaluate: function (_a, sourceCodeInfo) {
@@ -4052,7 +4036,7 @@ var stringNormalExpression = {
4052
4036
  throw new LitsError("Could not convert '".concat(str, "' to a number."), sourceCodeInfo);
4053
4037
  return number;
4054
4038
  },
4055
- validate: function (node) { return assertNumberOfParams(1, node); },
4039
+ paramCount: 1,
4056
4040
  },
4057
4041
  'from_char_code': {
4058
4042
  evaluate: function (_a, sourceCodeInfo) {
@@ -4066,7 +4050,7 @@ var stringNormalExpression = {
4066
4050
  throw new LitsError(error, sourceCodeInfo);
4067
4051
  }
4068
4052
  },
4069
- validate: function (node) { return assertNumberOfParams(1, node); },
4053
+ paramCount: 1,
4070
4054
  },
4071
4055
  'to_char_code': {
4072
4056
  evaluate: function (_a, sourceCodeInfo) {
@@ -4074,7 +4058,7 @@ var stringNormalExpression = {
4074
4058
  assertString(str, sourceCodeInfo, { nonEmpty: true });
4075
4059
  return asNonUndefined(str.codePointAt(0), sourceCodeInfo);
4076
4060
  },
4077
- validate: function (node) { return assertNumberOfParams(1, node); },
4061
+ paramCount: 1,
4078
4062
  },
4079
4063
  'lower_case': {
4080
4064
  evaluate: function (_a, sourceCodeInfo) {
@@ -4082,7 +4066,7 @@ var stringNormalExpression = {
4082
4066
  assertString(str, sourceCodeInfo);
4083
4067
  return str.toLowerCase();
4084
4068
  },
4085
- validate: function (node) { return assertNumberOfParams(1, node); },
4069
+ paramCount: 1,
4086
4070
  },
4087
4071
  'upper_case': {
4088
4072
  evaluate: function (_a, sourceCodeInfo) {
@@ -4090,7 +4074,7 @@ var stringNormalExpression = {
4090
4074
  assertString(str, sourceCodeInfo);
4091
4075
  return str.toUpperCase();
4092
4076
  },
4093
- validate: function (node) { return assertNumberOfParams(1, node); },
4077
+ paramCount: 1,
4094
4078
  },
4095
4079
  'trim': {
4096
4080
  evaluate: function (_a, sourceCodeInfo) {
@@ -4098,7 +4082,7 @@ var stringNormalExpression = {
4098
4082
  assertString(str, sourceCodeInfo);
4099
4083
  return str.trim();
4100
4084
  },
4101
- validate: function (node) { return assertNumberOfParams(1, node); },
4085
+ paramCount: 1,
4102
4086
  },
4103
4087
  'trim_left': {
4104
4088
  evaluate: function (_a, sourceCodeInfo) {
@@ -4106,7 +4090,7 @@ var stringNormalExpression = {
4106
4090
  assertString(str, sourceCodeInfo);
4107
4091
  return str.replace(/^\s+/, '');
4108
4092
  },
4109
- validate: function (node) { return assertNumberOfParams(1, node); },
4093
+ paramCount: 1,
4110
4094
  },
4111
4095
  'trim_right': {
4112
4096
  evaluate: function (_a, sourceCodeInfo) {
@@ -4114,7 +4098,7 @@ var stringNormalExpression = {
4114
4098
  assertString(str, sourceCodeInfo);
4115
4099
  return str.replace(/\s+$/, '');
4116
4100
  },
4117
- validate: function (node) { return assertNumberOfParams(1, node); },
4101
+ paramCount: 1,
4118
4102
  },
4119
4103
  '++': {
4120
4104
  evaluate: function (params, sourceCodeInfo) {
@@ -4138,7 +4122,7 @@ var stringNormalExpression = {
4138
4122
  return "".concat(acc).concat(str);
4139
4123
  }, first === null ? '' : "".concat(first));
4140
4124
  },
4141
- validate: function () { return undefined; },
4125
+ paramCount: {},
4142
4126
  },
4143
4127
  'join': {
4144
4128
  evaluate: function (_a, sourceCodeInfo) {
@@ -4148,7 +4132,7 @@ var stringNormalExpression = {
4148
4132
  assertString(delimiter, sourceCodeInfo);
4149
4133
  return stringList.join(delimiter);
4150
4134
  },
4151
- validate: function (node) { return assertNumberOfParams(2, node); },
4135
+ paramCount: 2,
4152
4136
  },
4153
4137
  'split': {
4154
4138
  evaluate: function (_a, sourceCodeInfo) {
@@ -4162,7 +4146,7 @@ var stringNormalExpression = {
4162
4146
  : new RegExp(stringOrRegExpValue.s, stringOrRegExpValue.f);
4163
4147
  return str.split(delimiter, limit);
4164
4148
  },
4165
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4149
+ paramCount: { min: 2, max: 3 },
4166
4150
  },
4167
4151
  'split_lines': {
4168
4152
  evaluate: function (_a, sourceCodeInfo) {
@@ -4170,7 +4154,7 @@ var stringNormalExpression = {
4170
4154
  assertString(str, sourceCodeInfo);
4171
4155
  return str.split((/\r\n|\n|\r/)).filter(function (line) { return line !== ''; });
4172
4156
  },
4173
- validate: function (node) { return assertNumberOfParams(1, node); },
4157
+ paramCount: 1,
4174
4158
  },
4175
4159
  'pad_left': {
4176
4160
  evaluate: function (_a, sourceCodeInfo) {
@@ -4181,7 +4165,7 @@ var stringNormalExpression = {
4181
4165
  assertString(padString, sourceCodeInfo);
4182
4166
  return str.padStart(length, padString);
4183
4167
  },
4184
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4168
+ paramCount: { min: 2, max: 3 },
4185
4169
  },
4186
4170
  'pad_right': {
4187
4171
  evaluate: function (_a, sourceCodeInfo) {
@@ -4192,7 +4176,7 @@ var stringNormalExpression = {
4192
4176
  assertString(padString, sourceCodeInfo);
4193
4177
  return str.padEnd(length, padString);
4194
4178
  },
4195
- validate: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4179
+ paramCount: { min: 2, max: 3 },
4196
4180
  },
4197
4181
  'template': {
4198
4182
  evaluate: function (_a, sourceCodeInfo) {
@@ -4223,7 +4207,7 @@ var stringNormalExpression = {
4223
4207
  }
4224
4208
  }
4225
4209
  },
4226
- validate: function (node) { return assertNumberOfParams({ min: 1, max: 10 }, node); },
4210
+ paramCount: { min: 1, max: 10 },
4227
4211
  },
4228
4212
  'encode_base64': {
4229
4213
  evaluate: function (_a, sourceCodeInfo) {
@@ -4234,7 +4218,7 @@ var stringNormalExpression = {
4234
4218
  return String.fromCharCode(Number.parseInt(p1, 16));
4235
4219
  }));
4236
4220
  },
4237
- validate: function (node) { return assertNumberOfParams(1, node); },
4221
+ paramCount: 1,
4238
4222
  },
4239
4223
  'decode_base64': {
4240
4224
  evaluate: function (_a, sourceCodeInfo) {
@@ -4252,7 +4236,7 @@ var stringNormalExpression = {
4252
4236
  throw new LitsError(error, sourceCodeInfo);
4253
4237
  }
4254
4238
  },
4255
- validate: function (node) { return assertNumberOfParams(1, node); },
4239
+ paramCount: 1,
4256
4240
  },
4257
4241
  'encode_uri_component': {
4258
4242
  evaluate: function (_a, sourceCodeInfo) {
@@ -4260,7 +4244,7 @@ var stringNormalExpression = {
4260
4244
  assertString(value, sourceCodeInfo);
4261
4245
  return encodeURIComponent(value);
4262
4246
  },
4263
- validate: function (node) { return assertNumberOfParams(1, node); },
4247
+ paramCount: 1,
4264
4248
  },
4265
4249
  'decode_uri_component': {
4266
4250
  evaluate: function (_a, sourceCodeInfo) {
@@ -4273,7 +4257,7 @@ var stringNormalExpression = {
4273
4257
  throw new LitsError(error, sourceCodeInfo);
4274
4258
  }
4275
4259
  },
4276
- validate: function (node) { return assertNumberOfParams(1, node); },
4260
+ paramCount: 1,
4277
4261
  },
4278
4262
  'blank?': {
4279
4263
  evaluate: function (_a, sourceCodeInfo) {
@@ -4284,7 +4268,7 @@ var stringNormalExpression = {
4284
4268
  assertString(value, sourceCodeInfo);
4285
4269
  return blankRegexp.test(value);
4286
4270
  },
4287
- validate: function (node) { return assertNumberOfParams(1, node); },
4271
+ paramCount: 1,
4288
4272
  },
4289
4273
  'capitalize': {
4290
4274
  evaluate: function (_a, sourceCodeInfo) {
@@ -4292,7 +4276,7 @@ var stringNormalExpression = {
4292
4276
  assertString(str, sourceCodeInfo);
4293
4277
  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
4294
4278
  },
4295
- validate: function (node) { return assertNumberOfParams(1, node); },
4279
+ paramCount: 1,
4296
4280
  },
4297
4281
  };
4298
4282
  var doubleDollarRegexp = /\$\$/g;
@@ -4323,14 +4307,14 @@ var functionalNormalExpression = {
4323
4307
  var applyArray = __spreadArray(__spreadArray([], __read(params.slice(0, -1)), false), __read(last), false);
4324
4308
  return executeFunction(func, applyArray, contextStack, sourceCodeInfo);
4325
4309
  },
4326
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
4310
+ paramCount: { min: 2 },
4327
4311
  },
4328
4312
  identity: {
4329
4313
  evaluate: function (_a) {
4330
4314
  var _b = __read(_a, 1), value = _b[0];
4331
4315
  return toAny(value);
4332
4316
  },
4333
- validate: function (node) { return assertNumberOfParams(1, node); },
4317
+ paramCount: 1,
4334
4318
  },
4335
4319
  partial: {
4336
4320
  evaluate: function (_a, sourceCodeInfo) {
@@ -4344,7 +4328,7 @@ var functionalNormalExpression = {
4344
4328
  _b.p = params,
4345
4329
  _b;
4346
4330
  },
4347
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4331
+ paramCount: { min: 1 },
4348
4332
  },
4349
4333
  comp: {
4350
4334
  evaluate: function (fns, sourceCodeInfo) {
@@ -4362,6 +4346,7 @@ var functionalNormalExpression = {
4362
4346
  _a.f = fns,
4363
4347
  _a;
4364
4348
  },
4349
+ paramCount: {},
4365
4350
  },
4366
4351
  constantly: {
4367
4352
  evaluate: function (_a, sourceCodeInfo) {
@@ -4374,7 +4359,7 @@ var functionalNormalExpression = {
4374
4359
  _b.v = toAny(value),
4375
4360
  _b;
4376
4361
  },
4377
- validate: function (node) { return assertNumberOfParams(1, node); },
4362
+ paramCount: 1,
4378
4363
  },
4379
4364
  juxt: {
4380
4365
  evaluate: function (fns, sourceCodeInfo) {
@@ -4386,7 +4371,7 @@ var functionalNormalExpression = {
4386
4371
  _a.f = fns,
4387
4372
  _a;
4388
4373
  },
4389
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4374
+ paramCount: { min: 1 },
4390
4375
  },
4391
4376
  complement: {
4392
4377
  evaluate: function (_a, sourceCodeInfo) {
@@ -4399,7 +4384,7 @@ var functionalNormalExpression = {
4399
4384
  _b.f = toAny(fn),
4400
4385
  _b;
4401
4386
  },
4402
- validate: function (node) { return assertNumberOfParams(1, node); },
4387
+ paramCount: 1,
4403
4388
  },
4404
4389
  every_pred: {
4405
4390
  evaluate: function (fns, sourceCodeInfo) {
@@ -4411,7 +4396,7 @@ var functionalNormalExpression = {
4411
4396
  _a.f = fns,
4412
4397
  _a;
4413
4398
  },
4414
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4399
+ paramCount: { min: 1 },
4415
4400
  },
4416
4401
  some_pred: {
4417
4402
  evaluate: function (fns, sourceCodeInfo) {
@@ -4423,7 +4408,7 @@ var functionalNormalExpression = {
4423
4408
  _a.f = fns,
4424
4409
  _a;
4425
4410
  },
4426
- validate: function (node) { return assertNumberOfParams({ min: 1 }, node); },
4411
+ paramCount: { min: 1 },
4427
4412
  },
4428
4413
  fnil: {
4429
4414
  evaluate: function (_a, sourceCodeInfo) {
@@ -4437,7 +4422,7 @@ var functionalNormalExpression = {
4437
4422
  _b.p = params,
4438
4423
  _b;
4439
4424
  },
4440
- validate: function (node) { return assertNumberOfParams({ min: 2 }, node); },
4425
+ paramCount: { min: 2 },
4441
4426
  },
4442
4427
  };
4443
4428
 
@@ -4456,7 +4441,7 @@ var andSpecialExpression = {
4456
4441
  };
4457
4442
  return node;
4458
4443
  },
4459
- validateParameterCount: function () { return undefined; },
4444
+ paramCount: {},
4460
4445
  evaluate: function (node, contextStack, _a) {
4461
4446
  var e_1, _b;
4462
4447
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4500,14 +4485,14 @@ function getCommonPolishSpecialExpressionParser(name) {
4500
4485
 
4501
4486
  var commentSpecialExpression = {
4502
4487
  polishParse: getCommonPolishSpecialExpressionParser('comment'),
4503
- validateParameterCount: function () { return undefined; },
4488
+ paramCount: {},
4504
4489
  evaluate: function () { return null; },
4505
4490
  findUnresolvedIdentifiers: function () { return new Set(); },
4506
4491
  };
4507
4492
 
4508
4493
  var condSpecialExpression = {
4509
4494
  polishParse: getCommonPolishSpecialExpressionParser('cond'),
4510
- validateParameterCount: function (node) { return assertEvenNumberOfParams(node); },
4495
+ paramCount: { even: true },
4511
4496
  evaluate: function (node, contextStack, _a) {
4512
4497
  var e_1, _b;
4513
4498
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4537,7 +4522,7 @@ var condSpecialExpression = {
4537
4522
 
4538
4523
  var switchSpecialExpression = {
4539
4524
  polishParse: getCommonPolishSpecialExpressionParser('switch'),
4540
- validateParameterCount: function (node) { return assertOddNumberOfParams(node); },
4525
+ paramCount: { odd: true },
4541
4526
  evaluate: function (node, contextStack, _a) {
4542
4527
  var e_1, _b;
4543
4528
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4568,7 +4553,7 @@ var switchSpecialExpression = {
4568
4553
 
4569
4554
  var declaredSpecialExpression = {
4570
4555
  polishParse: getCommonPolishSpecialExpressionParser('defined?'),
4571
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
4556
+ paramCount: 1,
4572
4557
  evaluate: function (node, contextStack) {
4573
4558
  var lookUpResult = contextStack.lookUp(node.p[0]);
4574
4559
  return lookUpResult !== null;
@@ -4616,7 +4601,7 @@ var defSpecialExpression = {
4616
4601
  assertSymbolNode(node.p[0], (_b = getTokenDebugData(node.token)) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
4617
4602
  return node;
4618
4603
  },
4619
- validateParameterCount: function (node) { return assertNumberOfParams(2, node); },
4604
+ paramCount: 2,
4620
4605
  evaluate: function (node, contextStack, _a) {
4621
4606
  var _b;
4622
4607
  var evaluateAstNode = _a.evaluateAstNode, builtin = _a.builtin;
@@ -4641,7 +4626,7 @@ var defSpecialExpression = {
4641
4626
 
4642
4627
  var doSpecialExpression = {
4643
4628
  polishParse: getCommonPolishSpecialExpressionParser('do'),
4644
- validateParameterCount: function () { return undefined; },
4629
+ paramCount: {},
4645
4630
  evaluate: function (node, contextStack, _a) {
4646
4631
  var e_1, _b;
4647
4632
  var evaluateAstNode = _a.evaluateAstNode;
@@ -4713,7 +4698,7 @@ var defnSpecialExpression = {
4713
4698
  };
4714
4699
  return node;
4715
4700
  },
4716
- validateParameterCount: function () { return undefined; },
4701
+ paramCount: {},
4717
4702
  evaluate: function (node, contextStack, _a) {
4718
4703
  var _b;
4719
4704
  var _c, _d;
@@ -4752,7 +4737,7 @@ var fnSpecialExpression = {
4752
4737
  };
4753
4738
  return node;
4754
4739
  },
4755
- validateParameterCount: function () { return undefined; },
4740
+ paramCount: {},
4756
4741
  evaluate: function (node, contextStack, _a) {
4757
4742
  var _b;
4758
4743
  var _c;
@@ -4977,7 +4962,7 @@ function parseFunctionArguments(tokenStream, parseState, parsers) {
4977
4962
 
4978
4963
  var ifSpecialExpression = {
4979
4964
  polishParse: getCommonPolishSpecialExpressionParser('if'),
4980
- validateParameterCount: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4965
+ paramCount: { min: 2, max: 3 },
4981
4966
  evaluate: function (node, contextStack, _a) {
4982
4967
  var _b;
4983
4968
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5001,7 +4986,7 @@ var ifSpecialExpression = {
5001
4986
 
5002
4987
  var unlessSpecialExpression = {
5003
4988
  polishParse: getCommonPolishSpecialExpressionParser('unless'),
5004
- validateParameterCount: function (node) { return assertNumberOfParams({ min: 2, max: 3 }, node); },
4989
+ paramCount: { min: 2, max: 3 },
5005
4990
  evaluate: function (node, contextStack, _a) {
5006
4991
  var _b;
5007
4992
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5038,7 +5023,7 @@ var letSpecialExpression = {
5038
5023
  };
5039
5024
  return node;
5040
5025
  },
5041
- validateParameterCount: function (node) { return assertNumberOfParams(0, node); },
5026
+ paramCount: 0,
5042
5027
  evaluate: function (node, contextStack, _a) {
5043
5028
  var e_1, _b;
5044
5029
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5093,7 +5078,7 @@ var loopSpecialExpression = {
5093
5078
  };
5094
5079
  return node;
5095
5080
  },
5096
- validateParameterCount: function () { return undefined; },
5081
+ paramCount: {},
5097
5082
  evaluate: function (node, contextStack, _a) {
5098
5083
  var _b;
5099
5084
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5359,7 +5344,7 @@ var forSpecialExpression = {
5359
5344
  };
5360
5345
  return node;
5361
5346
  },
5362
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5347
+ paramCount: 1,
5363
5348
  evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateAstNode); },
5364
5349
  findUnresolvedIdentifiers: function (node, contextStack, _a) {
5365
5350
  var findUnresolvedIdentifiers = _a.findUnresolvedIdentifiers, builtin = _a.builtin;
@@ -5381,7 +5366,7 @@ var doseqSpecialExpression = {
5381
5366
  };
5382
5367
  return node;
5383
5368
  },
5384
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5369
+ paramCount: 1,
5385
5370
  evaluate: function (node, contextStack, helpers) {
5386
5371
  evaluateLoop(false, node, contextStack, helpers.evaluateAstNode);
5387
5372
  return null;
@@ -5394,7 +5379,7 @@ var doseqSpecialExpression = {
5394
5379
 
5395
5380
  var orSpecialExpression = {
5396
5381
  polishParse: getCommonPolishSpecialExpressionParser('||'),
5397
- validateParameterCount: function () { return undefined; },
5382
+ paramCount: {},
5398
5383
  evaluate: function (node, contextStack, _a) {
5399
5384
  var e_1, _b;
5400
5385
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5424,7 +5409,7 @@ var orSpecialExpression = {
5424
5409
 
5425
5410
  var qqSpecialExpression = {
5426
5411
  polishParse: getCommonPolishSpecialExpressionParser('??'),
5427
- validateParameterCount: function (node) { return assertNumberOfParams({ min: 1, max: 2 }, node); },
5412
+ paramCount: { min: 1, max: 2 },
5428
5413
  evaluate: function (node, contextStack, _a) {
5429
5414
  var _b;
5430
5415
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5456,7 +5441,7 @@ var recurSpecialExpression = {
5456
5441
  };
5457
5442
  return node;
5458
5443
  },
5459
- validateParameterCount: function () { return undefined; },
5444
+ paramCount: {},
5460
5445
  evaluate: function (node, contextStack, _a) {
5461
5446
  var evaluateAstNode = _a.evaluateAstNode;
5462
5447
  var params = node.p.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
@@ -5470,7 +5455,7 @@ var recurSpecialExpression = {
5470
5455
 
5471
5456
  var throwSpecialExpression = {
5472
5457
  polishParse: getCommonPolishSpecialExpressionParser('throw'),
5473
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5458
+ paramCount: 1,
5474
5459
  evaluate: function (node, contextStack, _a) {
5475
5460
  var _b, _c;
5476
5461
  var evaluateAstNode = _a.evaluateAstNode;
@@ -5511,7 +5496,7 @@ var trySpecialExpression = {
5511
5496
  };
5512
5497
  return node;
5513
5498
  },
5514
- validateParameterCount: function (node) { return assertNumberOfParams(1, node); },
5499
+ paramCount: 1,
5515
5500
  evaluate: function (node, contextStack, _a) {
5516
5501
  var _b;
5517
5502
  var _c;
@@ -5948,8 +5933,9 @@ function evaluate(ast, contextStack) {
5948
5933
  var e_1, _a;
5949
5934
  var result = null;
5950
5935
  var safeAstNode = ast.hasDebugData ? JSON.parse(JSON.stringify(ast)) : ast;
5951
- if (safeAstNode.hasDebugData)
5936
+ if (safeAstNode.hasDebugData) {
5952
5937
  removeCommenNodes(safeAstNode);
5938
+ }
5953
5939
  try {
5954
5940
  for (var _b = __values(safeAstNode.b), _c = _b.next(); !_c.done; _c = _b.next()) {
5955
5941
  var node = _c.value;
@@ -6155,6 +6141,20 @@ function analyze(ast, params) {
6155
6141
  };
6156
6142
  }
6157
6143
 
6144
+ function minifyTokenStream(tokenStream) {
6145
+ var tokens = tokenStream.tokens.filter(function (token) {
6146
+ if (isP_CommentToken(token)
6147
+ || isA_CommentToken(token)
6148
+ || isA_MultiLineCommentToken(token)
6149
+ || isA_WhitespaceToken(token)
6150
+ || isP_WhitespaceToken(token)) {
6151
+ return false;
6152
+ }
6153
+ return true;
6154
+ });
6155
+ return __assign(__assign({}, tokenStream), { tokens: tokens });
6156
+ }
6157
+
6158
6158
  function parseSymbol(tokenStream, parseState) {
6159
6159
  var _a;
6160
6160
  var tkn = asToken(tokenStream.tokens[parseState.position++]);
@@ -6344,7 +6344,6 @@ function getPrecedence(operatorSign) {
6344
6344
  }
6345
6345
  }
6346
6346
  function createNamedNormalExpressionNode(name, params, token) {
6347
- var _a;
6348
6347
  var node = {
6349
6348
  t: AstNodeType.NormalExpression,
6350
6349
  n: name,
@@ -6353,7 +6352,7 @@ function createNamedNormalExpressionNode(name, params, token) {
6353
6352
  };
6354
6353
  var builtinExpression = builtin.normalExpressions[node.n];
6355
6354
  if (builtinExpression) {
6356
- (_a = builtinExpression.validate) === null || _a === void 0 ? void 0 : _a.call(builtinExpression, __assign(__assign({}, node), { p: withoutCommentNodes(node.p) }));
6355
+ assertNumberOfParams(builtinExpression.paramCount, node);
6357
6356
  }
6358
6357
  return node;
6359
6358
  }
@@ -6454,7 +6453,7 @@ var AlgebraicParser = /** @class */ (function () {
6454
6453
  AlgebraicParser.prototype.parse = function () {
6455
6454
  var nodes = [];
6456
6455
  while (!this.isAtEnd()) {
6457
- nodes.push(this.parseExpression());
6456
+ nodes.push(this.parseExpression(0, true));
6458
6457
  if (!isA_OperatorToken(this.peek(), ';')) {
6459
6458
  break;
6460
6459
  }
@@ -6462,9 +6461,10 @@ var AlgebraicParser = /** @class */ (function () {
6462
6461
  }
6463
6462
  return nodes;
6464
6463
  };
6465
- AlgebraicParser.prototype.parseExpression = function (precedence) {
6466
- var _a;
6464
+ AlgebraicParser.prototype.parseExpression = function (precedence, moduleScope) {
6465
+ var _a, _b;
6467
6466
  if (precedence === void 0) { precedence = 0; }
6467
+ if (moduleScope === void 0) { moduleScope = false; }
6468
6468
  var firstToken = this.peek();
6469
6469
  var left;
6470
6470
  if (isA_SymbolToken(firstToken)) {
@@ -6500,6 +6500,9 @@ var AlgebraicParser = /** @class */ (function () {
6500
6500
  return this.parseFunction(firstToken);
6501
6501
  }
6502
6502
  else if (isA_ReservedSymbolToken(firstToken, 'export')) {
6503
+ if (!moduleScope) {
6504
+ throw new LitsError('export is only allowed in module scope', (_a = getTokenDebugData(firstToken)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6505
+ }
6503
6506
  return this.parseExport(firstToken);
6504
6507
  }
6505
6508
  left || (left = this.parseOperand());
@@ -6537,7 +6540,7 @@ var AlgebraicParser = /** @class */ (function () {
6537
6540
  operator = this.peek();
6538
6541
  }
6539
6542
  if (!left) {
6540
- throw new LitsError('Expected operand', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6543
+ throw new LitsError('Expected operand', (_b = getTokenDebugData(this.peek())) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6541
6544
  }
6542
6545
  return left;
6543
6546
  };
@@ -6645,32 +6648,6 @@ var AlgebraicParser = /** @class */ (function () {
6645
6648
  return parseReservedSymbol(this.tokenStream, this.parseState);
6646
6649
  case 'RegexpShorthand':
6647
6650
  return parseRegexpShorthand(this.tokenStream, this.parseState);
6648
- case 'PolNotation': {
6649
- this.parseState.algebraic = false;
6650
- var astNodes = [];
6651
- this.advance();
6652
- do {
6653
- astNodes.push(this.parseState.parseToken(this.tokenStream, this.parseState));
6654
- } while (!isEndNotationToken(this.peek()));
6655
- this.advance();
6656
- this.parseState.algebraic = true;
6657
- if (astNodes.length === 1) {
6658
- return astNodes[0];
6659
- }
6660
- return {
6661
- t: AstNodeType.SpecialExpression,
6662
- n: 'do',
6663
- p: astNodes,
6664
- token: getTokenDebugData(token) && token,
6665
- };
6666
- }
6667
- case 'AlgNotation': {
6668
- this.advance();
6669
- var node = this.parseOperand();
6670
- assertEndNotationToken(this.peek());
6671
- this.advance();
6672
- return node;
6673
- }
6674
6651
  default:
6675
6652
  throw new LitsError("Unknown token type: ".concat(tokenType), (_b = getTokenDebugData(token)) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6676
6653
  }
@@ -6775,7 +6752,7 @@ var AlgebraicParser = /** @class */ (function () {
6775
6752
  p: params,
6776
6753
  token: getTokenDebugData(symbol.token) && symbol.token,
6777
6754
  };
6778
- builtin.specialExpressions[node.n].validateParameterCount(node);
6755
+ assertNumberOfParams(builtin.specialExpressions[node.n].paramCount, node);
6779
6756
  return node;
6780
6757
  }
6781
6758
  case 'fn':
@@ -6828,7 +6805,7 @@ var AlgebraicParser = /** @class */ (function () {
6828
6805
  }
6829
6806
  };
6830
6807
  AlgebraicParser.prototype.parseFunctionArguments = function () {
6831
- var _a, _b, _c, _d, _e;
6808
+ var _a, _b, _c, _d;
6832
6809
  var firstToken = this.peek();
6833
6810
  if (isA_SymbolToken(firstToken)) {
6834
6811
  this.advance();
@@ -6843,62 +6820,54 @@ var AlgebraicParser = /** @class */ (function () {
6843
6820
  }
6844
6821
  this.advance();
6845
6822
  var rest = false;
6846
- var letBindingObject;
6847
6823
  var args = [];
6848
6824
  var restArg;
6849
- while (!this.isAtEnd() && !isRParenToken(this.peek())) {
6850
- if (letBindingObject) {
6851
- throw new LitsError('Expected right parentheses', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6852
- }
6853
- if (isLBraceToken(this.peek())) {
6854
- letBindingObject = this.parseObject();
6855
- }
6856
- else {
6857
- if (isA_OperatorToken(this.peek(), '...')) {
6858
- if (rest) {
6859
- throw new LitsError('Multiple spread operators in lambda function', (_b = getTokenDebugData(this.peek())) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6860
- }
6861
- this.advance();
6862
- rest = true;
6863
- }
6864
- var symbolToken = this.peek();
6865
- if (!isA_SymbolToken(symbolToken)) {
6866
- throw new LitsError('Expected symbol', (_c = getTokenDebugData(this.peek())) === null || _c === void 0 ? void 0 : _c.sourceCodeInfo);
6867
- }
6825
+ while (!this.isAtEnd() && !isRParenToken(this.peek()) && !isA_SymbolToken(this.peek(), 'let')) {
6826
+ if (isA_OperatorToken(this.peek(), '...')) {
6868
6827
  if (rest) {
6869
- restArg = symbolToken[1];
6870
- }
6871
- else {
6872
- args.push(symbolToken[1]);
6828
+ throw new LitsError('Multiple spread operators in lambda function', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
6873
6829
  }
6874
6830
  this.advance();
6831
+ rest = true;
6832
+ }
6833
+ var symbolToken = this.peek();
6834
+ if (!isA_SymbolToken(symbolToken)) {
6835
+ throw new LitsError('Expected symbol', (_b = getTokenDebugData(this.peek())) === null || _b === void 0 ? void 0 : _b.sourceCodeInfo);
6875
6836
  }
6876
- if (!isA_OperatorToken(this.peek(), ',') && !isRParenToken(this.peek())) {
6877
- throw new LitsError('Expected comma or closing parenthesis', (_d = getTokenDebugData(this.peek())) === null || _d === void 0 ? void 0 : _d.sourceCodeInfo);
6837
+ if (rest) {
6838
+ restArg = symbolToken[1];
6839
+ }
6840
+ else {
6841
+ args.push(symbolToken[1]);
6842
+ }
6843
+ this.advance();
6844
+ if (!isA_OperatorToken(this.peek(), ',') && !isRParenToken(this.peek()) && !isA_SymbolToken(this.peek(), 'let')) {
6845
+ throw new LitsError('Expected comma or closing parenthesis', (_c = getTokenDebugData(this.peek())) === null || _c === void 0 ? void 0 : _c.sourceCodeInfo);
6878
6846
  }
6879
6847
  if (isA_OperatorToken(this.peek(), ',')) {
6880
6848
  this.advance();
6881
6849
  }
6882
6850
  }
6883
6851
  var arity = restArg !== undefined ? { min: args.length } : args.length;
6852
+ // let bindings, to be able to pass on values in the context down to the body
6853
+ // This is needed since lits is dynamically scoped
6854
+ // E.g.
6855
+ // x => y => x + y // would not work, x is not available in the second lambda
6856
+ // x => (y, let x = x) => x + y // would work, x is available in the second lambda
6857
+ var bindingNodess = [];
6858
+ var token = this.peek();
6859
+ while (isA_SymbolToken(token, 'let')) {
6860
+ var letNode = this.parseLet(token, true);
6861
+ bindingNodess.push(letNode.bs[0]);
6862
+ token = this.peek();
6863
+ }
6884
6864
  if (!isRParenToken(this.peek())) {
6885
- throw new LitsError('Expected closing parenthesis', (_e = getTokenDebugData(this.peek())) === null || _e === void 0 ? void 0 : _e.sourceCodeInfo);
6865
+ throw new LitsError('Expected closing parenthesis', (_d = getTokenDebugData(this.peek())) === null || _d === void 0 ? void 0 : _d.sourceCodeInfo);
6886
6866
  }
6887
- var letBindings = letBindingObject ? arrayToPairs(letBindingObject.p) : [];
6888
6867
  var functionArguments = {
6889
6868
  m: args,
6890
6869
  r: restArg,
6891
- b: letBindings.map(function (pair) {
6892
- var key = pair[0];
6893
- var value = pair[1];
6894
- return {
6895
- t: AstNodeType.Binding,
6896
- n: key.v,
6897
- v: value,
6898
- p: [],
6899
- token: getTokenDebugData(key.token) && key.token,
6900
- };
6901
- }),
6870
+ b: bindingNodess,
6902
6871
  };
6903
6872
  this.advance();
6904
6873
  return {
@@ -7348,6 +7317,7 @@ var AlgebraicParser = /** @class */ (function () {
7348
7317
  }
7349
7318
  assertA_ReservedSymbolToken(this.peek(), 'end');
7350
7319
  this.advance();
7320
+ assertA_OperatorToken(this.peek(), ';');
7351
7321
  var fnNode = {
7352
7322
  t: AstNodeType.SpecialExpression,
7353
7323
  n: 'fn',
@@ -7510,7 +7480,7 @@ function parseObjectLitteral(tokenStream, parseState) {
7510
7480
  p: params,
7511
7481
  token: getTokenDebugData(firstToken) && firstToken,
7512
7482
  };
7513
- assertEvenNumberOfParams(node);
7483
+ assertNumberOfParams({ even: true }, node);
7514
7484
  return node;
7515
7485
  }
7516
7486
  var placeholderRegexp = /^%([1-9]\d?)?$/;
@@ -7616,7 +7586,7 @@ function parseBinding(tokenStream, parseState) {
7616
7586
  return node;
7617
7587
  }
7618
7588
  function parseNormalExpression(tokenStream, parseState) {
7619
- var _a, _b;
7589
+ var _a;
7620
7590
  var startBracketToken = tokenStream.hasDebugData ? asLParenToken(tokenStream.tokens[parseState.position]) : undefined;
7621
7591
  parseState.position += 1;
7622
7592
  var fnNode = parseState.parseToken(tokenStream, parseState);
@@ -7640,7 +7610,7 @@ function parseNormalExpression(tokenStream, parseState) {
7640
7610
  };
7641
7611
  var builtinExpression = builtin.normalExpressions[node.n];
7642
7612
  if (builtinExpression) {
7643
- (_b = builtinExpression.validate) === null || _b === void 0 ? void 0 : _b.call(builtinExpression, __assign(__assign({}, node), { p: withoutCommentNodes(node.p) }));
7613
+ assertNumberOfParams(builtinExpression.paramCount, node);
7644
7614
  }
7645
7615
  return node;
7646
7616
  }
@@ -7649,7 +7619,7 @@ function parseSpecialExpression(tokenStream, parseState) {
7649
7619
  var firstToken = asLParenToken(tokenStream.tokens[parseState.position++]);
7650
7620
  var nameToken = asP_SymbolToken(tokenStream.tokens[parseState.position++]);
7651
7621
  var expressionName = nameToken[1];
7652
- var _b = asNonUndefined(builtin.specialExpressions[expressionName], (_a = getTokenDebugData(nameToken)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo), parse = _b.polishParse, validateParameterCount = _b.validateParameterCount;
7622
+ var _b = asNonUndefined(builtin.specialExpressions[expressionName], (_a = getTokenDebugData(nameToken)) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo), parse = _b.polishParse, paramCount = _b.paramCount;
7653
7623
  var node = parse(tokenStream, parseState, firstToken, {
7654
7624
  parseExpression: parseExpression,
7655
7625
  parseTokensUntilClosingBracket: parseTokensUntilClosingBracket,
@@ -7658,7 +7628,7 @@ function parseSpecialExpression(tokenStream, parseState) {
7658
7628
  parseBindings: parseBindings,
7659
7629
  parseArgument: parseArgument,
7660
7630
  });
7661
- validateParameterCount(node);
7631
+ assertNumberOfParams(paramCount, node);
7662
7632
  return node;
7663
7633
  }
7664
7634
  function parsePolishToken(tokenStream, parseState) {
@@ -7688,47 +7658,12 @@ function parsePolishToken(tokenStream, parseState) {
7688
7658
  return parseFnShorthand(tokenStream, parseState);
7689
7659
  case 'P_Comment':
7690
7660
  return parseComment(tokenStream, parseState);
7691
- case 'AlgNotation': {
7692
- parseState.position += 1;
7693
- parseState.algebraic = true;
7694
- var algebraicParser = new AlgebraicParser(tokenStream, parseState);
7695
- var nodes = algebraicParser.parse();
7696
- assertEndNotationToken(tokenStream.tokens[parseState.position++]);
7697
- parseState.algebraic = false;
7698
- if (nodes.length === 1) {
7699
- return nodes[0];
7700
- }
7701
- return {
7702
- t: AstNodeType.SpecialExpression,
7703
- n: 'do',
7704
- p: nodes,
7705
- token: nodes[0].token,
7706
- };
7707
- }
7708
- case 'PolNotation': {
7709
- var astNodes = [];
7710
- parseState.position += 1;
7711
- do {
7712
- astNodes.push(parsePolishToken(tokenStream, parseState));
7713
- } while (!isEndNotationToken(asToken(tokenStream.tokens[parseState.position])));
7714
- parseState.position += 1;
7715
- if (astNodes.length === 1) {
7716
- return astNodes[0];
7717
- }
7718
- return {
7719
- t: AstNodeType.SpecialExpression,
7720
- n: 'do',
7721
- p: astNodes,
7722
- token: astNodes[0].token,
7723
- };
7724
- }
7725
7661
  case 'P_CollectionAccessor':
7726
7662
  case 'P_Modifier':
7727
7663
  case 'RParen':
7728
7664
  case 'RBracket':
7729
7665
  case 'RBrace':
7730
7666
  case 'P_Whitespace':
7731
- case 'EndNotation':
7732
7667
  break;
7733
7668
  /* v8 ignore next 2 */
7734
7669
  default:
@@ -7738,49 +7673,28 @@ function parsePolishToken(tokenStream, parseState) {
7738
7673
  }
7739
7674
 
7740
7675
  function parse(tokenStream) {
7741
- var _a;
7742
- var safeTokenStream = removeUnnecessaryTokens(tokenStream);
7676
+ tokenStream = minifyTokenStream(tokenStream);
7677
+ var algebraic = tokenStream.algebraic;
7743
7678
  var ast = {
7744
7679
  b: [],
7745
- hasDebugData: safeTokenStream.hasDebugData,
7680
+ hasDebugData: tokenStream.hasDebugData,
7746
7681
  };
7747
7682
  var parseState = {
7748
7683
  position: 0,
7749
- algebraic: (_a = safeTokenStream.algebraic) !== null && _a !== void 0 ? _a : false,
7750
7684
  parseToken: parseToken,
7751
7685
  };
7752
- while (parseState.position < safeTokenStream.tokens.length) {
7753
- ast.b.push(parseToken(safeTokenStream, parseState));
7686
+ if (algebraic) {
7687
+ var algebraicParser = new AlgebraicParser(tokenStream, parseState);
7688
+ ast.b = algebraicParser.parse();
7754
7689
  }
7755
- return ast;
7756
- }
7757
- function removeUnnecessaryTokens(tokenStream) {
7758
- var tokens = tokenStream.tokens.filter(function (token) {
7759
- if (isP_CommentToken(token)
7760
- || isA_CommentToken(token)
7761
- || isA_MultiLineCommentToken(token)
7762
- || isA_WhitespaceToken(token)
7763
- || isP_WhitespaceToken(token)) {
7764
- return false;
7690
+ else {
7691
+ while (parseState.position < tokenStream.tokens.length) {
7692
+ ast.b.push(parseToken(tokenStream, parseState));
7765
7693
  }
7766
- return true;
7767
- });
7768
- return __assign(__assign({}, tokenStream), { tokens: tokens });
7694
+ }
7695
+ return ast;
7769
7696
  }
7770
7697
  function parseToken(tokenStream, parseState) {
7771
- if (parseState.algebraic) {
7772
- var algebraicParser = new AlgebraicParser(tokenStream, parseState);
7773
- var nodes = algebraicParser.parse();
7774
- if (nodes.length === 1) {
7775
- return nodes[0];
7776
- }
7777
- return {
7778
- t: AstNodeType.SpecialExpression,
7779
- n: 'do',
7780
- p: nodes,
7781
- token: nodes[0].token,
7782
- };
7783
- }
7784
7698
  return parsePolishToken(tokenStream, parseState);
7785
7699
  }
7786
7700
 
@@ -7811,15 +7725,6 @@ var tokenizeLBrace = function (input, position) {
7811
7725
  var tokenizeRBrace = function (input, position) {
7812
7726
  return tokenizeSimpleToken('RBrace', '}', input, position);
7813
7727
  };
7814
- var tokenizePolishNotation = function (input, position) {
7815
- return tokenizeSimpleToken('PolNotation', '$`', input, position);
7816
- };
7817
- var tokenizeAlgebraicNotation = function (input, position) {
7818
- return tokenizeSimpleToken('AlgNotation', '@`', input, position);
7819
- };
7820
- var tokenizeEndNotation = function (input, position) {
7821
- return tokenizeSimpleToken('EndNotation', '`', input, position);
7822
- };
7823
7728
  var tokenizeString = function (input, position) {
7824
7729
  if (input[position] !== '"')
7825
7730
  return NO_MATCH;
@@ -7872,9 +7777,6 @@ function tokenizeSimpleToken(type, value, input, position) {
7872
7777
  return NO_MATCH;
7873
7778
  }
7874
7779
  var commonTokenizers = [
7875
- tokenizePolishNotation,
7876
- tokenizeAlgebraicNotation,
7877
- tokenizeEndNotation,
7878
7780
  tokenizeLParen,
7879
7781
  tokenizeRParen,
7880
7782
  tokenizeLBracket,
@@ -8384,7 +8286,6 @@ function getSugar() {
8384
8286
 
8385
8287
  function tokenize(input, params) {
8386
8288
  var debug = !!params.debug;
8387
- var notationStack = [params.algebraic ? 'algebraic' : 'polish'];
8388
8289
  var position = 0;
8389
8290
  var tokenStream = {
8390
8291
  tokens: [],
@@ -8393,7 +8294,7 @@ function tokenize(input, params) {
8393
8294
  algebraic: !!params.algebraic,
8394
8295
  };
8395
8296
  while (position < input.length) {
8396
- var tokenizers = notationStack.at(-1) === 'algebraic' ? algebraicTokenizers : polishTokenizers;
8297
+ var tokenizers = params.algebraic ? algebraicTokenizers : polishTokenizers;
8397
8298
  var tokenDescriptor = getCurrentToken(input, position, tokenizers);
8398
8299
  var debugData = debug
8399
8300
  ? {
@@ -8410,23 +8311,8 @@ function tokenize(input, params) {
8410
8311
  addTokenDebugData(token, debugData);
8411
8312
  }
8412
8313
  tokenStream.tokens.push(token);
8413
- if (isAlgebraicNotationToken(token)) {
8414
- notationStack.push('algebraic');
8415
- }
8416
- if (isPolishNotationToken(token)) {
8417
- notationStack.push('polish');
8418
- }
8419
- if (isEndNotationToken(token)) {
8420
- notationStack.pop();
8421
- if (notationStack.length < 1) {
8422
- throw new LitsError('Unexpected end directive `.', debugData === null || debugData === void 0 ? void 0 : debugData.sourceCodeInfo);
8423
- }
8424
- }
8425
8314
  }
8426
8315
  }
8427
- if (notationStack.length > 1) {
8428
- throw new LitsError('Missing end directive `.', createSourceCodeInfo(input, position, params.filePath));
8429
- }
8430
8316
  applySugar(tokenStream);
8431
8317
  return tokenStream;
8432
8318
  }
@@ -8511,9 +8397,6 @@ function untokenizeToken(token) {
8511
8397
  case 'RBracket': return ']';
8512
8398
  case 'LBrace': return '{';
8513
8399
  case 'RBrace': return '}';
8514
- case 'PolNotation': return '$`';
8515
- case 'AlgNotation': return '@`';
8516
- case 'EndNotation': return '`';
8517
8400
  case 'P_FnShorthand': return '#';
8518
8401
  /* v8 ignore next 2 */
8519
8402
  default:
@@ -8638,7 +8521,8 @@ var Lits = /** @class */ (function () {
8638
8521
  if (tokenizeParams === void 0) { tokenizeParams = {}; }
8639
8522
  var debug = this.debug;
8640
8523
  var algebraic = this.algebraic;
8641
- return tokenize(program, __assign(__assign({}, tokenizeParams), { debug: debug, algebraic: algebraic }));
8524
+ var tokenStream = tokenize(program, __assign(__assign({}, tokenizeParams), { debug: debug, algebraic: algebraic }));
8525
+ return tokenizeParams.minify ? minifyTokenStream(tokenStream) : tokenStream;
8642
8526
  };
8643
8527
  Lits.prototype.parse = function (tokenStream) {
8644
8528
  return parse(tokenStream);