@mojir/lits 2.1.0 → 2.1.1

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 (91) hide show
  1. package/README.md +392 -109
  2. package/dist/cli/cli.js +863 -914
  3. package/dist/cli/reference/index.d.ts +208 -208
  4. package/dist/cli/src/builtin/bindingNode.d.ts +2 -2
  5. package/dist/cli/src/builtin/index.d.ts +10 -50
  6. package/dist/cli/src/builtin/interface.d.ts +10 -17
  7. package/dist/cli/src/builtin/normalExpressions/index.d.ts +4 -1
  8. package/dist/cli/src/builtin/specialExpressionTypes.d.ts +27 -0
  9. package/dist/cli/src/builtin/specialExpressions/and.d.ts +3 -3
  10. package/dist/cli/src/builtin/specialExpressions/array.d.ts +3 -3
  11. package/dist/cli/src/builtin/specialExpressions/cond.d.ts +3 -3
  12. package/dist/cli/src/builtin/specialExpressions/def.d.ts +3 -6
  13. package/dist/cli/src/builtin/specialExpressions/defined.d.ts +5 -0
  14. package/dist/cli/src/builtin/specialExpressions/do.d.ts +3 -3
  15. package/dist/cli/src/builtin/specialExpressions/functions.d.ts +5 -13
  16. package/dist/cli/src/builtin/specialExpressions/if.d.ts +3 -3
  17. package/dist/cli/src/builtin/specialExpressions/let.d.ts +3 -6
  18. package/dist/cli/src/builtin/specialExpressions/loop.d.ts +3 -4
  19. package/dist/cli/src/builtin/specialExpressions/loops.d.ts +5 -14
  20. package/dist/cli/src/builtin/specialExpressions/object.d.ts +3 -3
  21. package/dist/cli/src/builtin/specialExpressions/or.d.ts +3 -3
  22. package/dist/cli/src/builtin/specialExpressions/qq.d.ts +3 -3
  23. package/dist/cli/src/builtin/specialExpressions/recur.d.ts +3 -3
  24. package/dist/cli/src/builtin/specialExpressions/switch.d.ts +3 -3
  25. package/dist/cli/src/builtin/specialExpressions/throw.d.ts +3 -3
  26. package/dist/cli/src/builtin/specialExpressions/try.d.ts +3 -5
  27. package/dist/cli/src/builtin/specialExpressions/unless.d.ts +3 -3
  28. package/dist/cli/src/builtin/utils.d.ts +2 -5
  29. package/dist/cli/src/constants/constants.d.ts +15 -3
  30. package/dist/cli/src/evaluator/ContextStack.d.ts +3 -3
  31. package/dist/cli/src/evaluator/functionExecutors.d.ts +3 -3
  32. package/dist/cli/src/evaluator/index.d.ts +2 -2
  33. package/dist/cli/src/evaluator/interface.d.ts +3 -3
  34. package/dist/cli/src/getUndefinedSymbols/index.d.ts +3 -3
  35. package/dist/cli/src/parser/Parser.d.ts +7 -5
  36. package/dist/cli/src/parser/types.d.ts +33 -96
  37. package/dist/cli/src/typeGuards/astNode.d.ts +24 -16
  38. package/dist/cli/src/typeGuards/index.d.ts +2 -5
  39. package/dist/cli/src/typeGuards/litsFunction.d.ts +2 -2
  40. package/dist/cli/src/utils/index.d.ts +0 -1
  41. package/dist/index.esm.js +836 -887
  42. package/dist/index.esm.js.map +1 -1
  43. package/dist/index.js +836 -887
  44. package/dist/index.js.map +1 -1
  45. package/dist/lits.iife.js +836 -887
  46. package/dist/lits.iife.js.map +1 -1
  47. package/dist/reference/index.d.ts +208 -208
  48. package/dist/src/builtin/bindingNode.d.ts +2 -2
  49. package/dist/src/builtin/index.d.ts +10 -50
  50. package/dist/src/builtin/interface.d.ts +10 -17
  51. package/dist/src/builtin/normalExpressions/index.d.ts +4 -1
  52. package/dist/src/builtin/specialExpressionTypes.d.ts +27 -0
  53. package/dist/src/builtin/specialExpressions/and.d.ts +3 -3
  54. package/dist/src/builtin/specialExpressions/array.d.ts +3 -3
  55. package/dist/src/builtin/specialExpressions/cond.d.ts +3 -3
  56. package/dist/src/builtin/specialExpressions/def.d.ts +3 -6
  57. package/dist/src/builtin/specialExpressions/defined.d.ts +5 -0
  58. package/dist/src/builtin/specialExpressions/do.d.ts +3 -3
  59. package/dist/src/builtin/specialExpressions/functions.d.ts +5 -13
  60. package/dist/src/builtin/specialExpressions/if.d.ts +3 -3
  61. package/dist/src/builtin/specialExpressions/let.d.ts +3 -6
  62. package/dist/src/builtin/specialExpressions/loop.d.ts +3 -4
  63. package/dist/src/builtin/specialExpressions/loops.d.ts +5 -14
  64. package/dist/src/builtin/specialExpressions/object.d.ts +3 -3
  65. package/dist/src/builtin/specialExpressions/or.d.ts +3 -3
  66. package/dist/src/builtin/specialExpressions/qq.d.ts +3 -3
  67. package/dist/src/builtin/specialExpressions/recur.d.ts +3 -3
  68. package/dist/src/builtin/specialExpressions/switch.d.ts +3 -3
  69. package/dist/src/builtin/specialExpressions/throw.d.ts +3 -3
  70. package/dist/src/builtin/specialExpressions/try.d.ts +3 -5
  71. package/dist/src/builtin/specialExpressions/unless.d.ts +3 -3
  72. package/dist/src/builtin/utils.d.ts +2 -5
  73. package/dist/src/constants/constants.d.ts +15 -3
  74. package/dist/src/evaluator/ContextStack.d.ts +3 -3
  75. package/dist/src/evaluator/functionExecutors.d.ts +3 -3
  76. package/dist/src/evaluator/index.d.ts +2 -2
  77. package/dist/src/evaluator/interface.d.ts +3 -3
  78. package/dist/src/getUndefinedSymbols/index.d.ts +3 -3
  79. package/dist/src/parser/Parser.d.ts +7 -5
  80. package/dist/src/parser/types.d.ts +33 -96
  81. package/dist/src/typeGuards/astNode.d.ts +24 -16
  82. package/dist/src/typeGuards/index.d.ts +2 -5
  83. package/dist/src/typeGuards/litsFunction.d.ts +2 -2
  84. package/dist/src/utils/index.d.ts +0 -1
  85. package/dist/testFramework.esm.js +851 -901
  86. package/dist/testFramework.esm.js.map +1 -1
  87. package/dist/testFramework.js +851 -901
  88. package/dist/testFramework.js.map +1 -1
  89. package/package.json +1 -1
  90. package/dist/cli/src/builtin/specialExpressions/declared.d.ts +0 -5
  91. package/dist/src/builtin/specialExpressions/declared.d.ts +0 -5
package/dist/index.esm.js CHANGED
@@ -177,23 +177,25 @@ function isLitsError(error) {
177
177
  return error instanceof LitsError;
178
178
  }
179
179
 
180
- var astNodeTypeNames = [
181
- 'Number',
182
- 'String',
183
- 'NormalExpression',
184
- 'SpecialExpression',
185
- 'Symbol',
186
- 'Modifier',
187
- 'ReservedSymbol',
188
- 'Binding',
189
- 'Argument',
190
- 'Partial',
191
- 'Comment',
192
- 'Spread',
193
- ];
194
- var astNodeTypeSet = new Set(astNodeTypeNames);
195
- function isAstNodeType(type) {
196
- return typeof type === 'string' && astNodeTypeSet.has(type);
180
+ var NodeTypes = {
181
+ Number: 1,
182
+ String: 2,
183
+ NormalExpression: 3,
184
+ SpecialExpression: 4,
185
+ UserDefinedSymbol: 5,
186
+ NormalBuiltinSymbol: 6,
187
+ SpecialBuiltinSymbol: 7,
188
+ ReservedSymbol: 8,
189
+ Binding: 9,
190
+ Spread: 10,
191
+ };
192
+ var NodeTypesSet = new Set(Object.values(NodeTypes));
193
+ function getNodeTypeName(type) {
194
+ return Object.keys(NodeTypes).find(function (key) { return NodeTypes[key] === type; });
195
+ }
196
+ // TODO, is this needed?
197
+ function isNodeType(type) {
198
+ return typeof type === 'number' && NodeTypesSet.has(type);
197
199
  }
198
200
  var functionTypes = [
199
201
  'UserDefined',
@@ -221,17 +223,17 @@ function isLitsFunction$1(func) {
221
223
  return false;
222
224
  return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType);
223
225
  }
224
- function isAstNode$1(value) {
225
- if (value === null || typeof value !== 'object')
226
+ function isNode(value) {
227
+ if (!Array.isArray(value) || value.length < 2)
226
228
  return false;
227
- return 'type' in value && isAstNodeType(value.type);
229
+ return isNodeType(value[0]);
228
230
  }
229
231
  function valueToString(value) {
230
232
  if (isLitsFunction$1(value))
231
233
  // eslint-disable-next-line ts/no-unsafe-member-access
232
234
  return "<function ".concat(value.name || '\u03BB', ">");
233
- if (isAstNode$1(value))
234
- return "".concat(value.type, "-node");
235
+ if (isNode(value))
236
+ return "".concat(getNodeTypeName(value[0]), "-node");
235
237
  if (value === null)
236
238
  return 'null';
237
239
  if (typeof value === 'object' && value instanceof RegExp)
@@ -252,59 +254,56 @@ function getAssertionError(typeName, value, sourceCodeInfo) {
252
254
  }
253
255
 
254
256
  function assertNumberOfParams(count, node) {
255
- assertCount({
256
- count: count,
257
- length: node.params.length,
258
- name: node.name,
259
- sourceCodeInfo: node.sourceCodeInfo,
260
- });
261
- }
262
- function isNonUndefined(value) {
263
- return value !== undefined;
264
- }
265
- function asNonUndefined(value, sourceCodeInfo) {
266
- assertNonUndefined(value, sourceCodeInfo);
267
- return value;
268
- }
269
- function assertNonUndefined(value, sourceCodeInfo) {
270
- if (!isNonUndefined(value))
271
- throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
272
- }
273
- function isUnknownRecord(value) {
274
- return value !== null && typeof value === 'object' && !Array.isArray(value);
275
- }
276
- function assertUnknownRecord(value, sourceCodeInfo) {
277
- if (!isUnknownRecord(value)) {
278
- throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
279
- }
280
- }
281
- function assertCount(_a) {
282
- var count = _a.count, length = _a.length, name = _a.name, sourceCodeInfo = _a.sourceCodeInfo;
257
+ var length = node[1][1].length;
283
258
  if (typeof count === 'number') {
284
259
  if (length !== count) {
285
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
260
+ var name_1 = getNodeTypeName(node[0]);
261
+ throw new LitsError("Wrong number of arguments to \"".concat(name_1, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), node[2]);
286
262
  }
287
263
  }
288
264
  else {
289
265
  var min = count.min, max = count.max, even = count.even, odd = count.odd;
290
266
  if (even) {
267
+ var name_2 = getNodeTypeName(node[0]);
291
268
  if (length % 2 !== 0) {
292
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an even number, got ").concat(valueToString(length), "."), sourceCodeInfo);
269
+ throw new LitsError("Wrong number of arguments to \"".concat(name_2, "\",, expected an even number, got ").concat(valueToString(length), "."), node[2]);
293
270
  }
294
271
  }
295
272
  if (odd) {
296
273
  if (length % 2 !== 1) {
297
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an odd number, got ").concat(valueToString(length), "."), sourceCodeInfo);
274
+ var name_3 = getNodeTypeName(node[0]);
275
+ throw new LitsError("Wrong number of arguments to \"".concat(name_3, "\",, expected an odd number, got ").concat(valueToString(length), "."), node[2]);
298
276
  }
299
277
  }
300
278
  if (typeof min === 'number' && length < min) {
301
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
279
+ var name_4 = getNodeTypeName(node[0]);
280
+ throw new LitsError("Wrong number of arguments to \"".concat(name_4, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), node[2]);
302
281
  }
303
282
  if (typeof max === 'number' && length > max) {
304
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
283
+ var name_5 = getNodeTypeName(node[0]);
284
+ throw new LitsError("Wrong number of arguments to \"".concat(name_5, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), node[2]);
305
285
  }
306
286
  }
307
287
  }
288
+ function isNonUndefined(value) {
289
+ return value !== undefined;
290
+ }
291
+ function asNonUndefined(value, sourceCodeInfo) {
292
+ assertNonUndefined(value, sourceCodeInfo);
293
+ return value;
294
+ }
295
+ function assertNonUndefined(value, sourceCodeInfo) {
296
+ if (!isNonUndefined(value))
297
+ throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
298
+ }
299
+ function isUnknownRecord(value) {
300
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
301
+ }
302
+ function assertUnknownRecord(value, sourceCodeInfo) {
303
+ if (!isUnknownRecord(value)) {
304
+ throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
305
+ }
306
+ }
308
307
  function canBeOperator(count) {
309
308
  if (typeof count === 'number') {
310
309
  return count === 2;
@@ -742,12 +741,6 @@ function createNativeJsFunction(fn, name) {
742
741
  _a.functionType = 'NativeJsFunction',
743
742
  _a;
744
743
  }
745
- function arrayToPairs(arr) {
746
- var pairs = [];
747
- for (var i = 0; i < arr.length; i += 2)
748
- pairs.push([arr[i], arr[i + 1]]);
749
- return pairs;
750
- }
751
744
  function joinSets() {
752
745
  var e_1, _a;
753
746
  var results = [];
@@ -3645,17 +3638,24 @@ Object.values(expressions).forEach(function (normalExpression) {
3645
3638
  });
3646
3639
  });
3647
3640
  var normalExpressions = __assign(__assign({}, expressions), aliases);
3641
+ var normalExpressionTypes = {};
3642
+ var allNormalExpressions = [];
3643
+ Object.entries(normalExpressions).forEach(function (_a, index) {
3644
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
3645
+ normalExpressionTypes[key] = index;
3646
+ allNormalExpressions.push(value);
3647
+ });
3648
3648
 
3649
3649
  var andSpecialExpression = {
3650
3650
  paramCount: {},
3651
3651
  evaluate: function (node, contextStack, _a) {
3652
3652
  var e_1, _b;
3653
- var evaluateAstNode = _a.evaluateAstNode;
3653
+ var evaluateNode = _a.evaluateNode;
3654
3654
  var value = true;
3655
3655
  try {
3656
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
3656
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3657
3657
  var param = _d.value;
3658
- value = evaluateAstNode(param, contextStack);
3658
+ value = evaluateNode(param, contextStack);
3659
3659
  if (!value)
3660
3660
  break;
3661
3661
  }
@@ -3670,8 +3670,8 @@ var andSpecialExpression = {
3670
3670
  return value;
3671
3671
  },
3672
3672
  getUndefinedSymbols: function (node, contextStack, _a) {
3673
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3674
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3673
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3674
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
3675
3675
  },
3676
3676
  };
3677
3677
 
@@ -3679,28 +3679,29 @@ var condSpecialExpression = {
3679
3679
  paramCount: { even: true },
3680
3680
  evaluate: function (node, contextStack, _a) {
3681
3681
  var e_1, _b;
3682
- var evaluateAstNode = _a.evaluateAstNode;
3682
+ var evaluateNode = _a.evaluateNode;
3683
+ var params = node[1][1];
3683
3684
  try {
3684
- for (var _c = __values(arrayToPairs(node.params)), _d = _c.next(); !_d.done; _d = _c.next()) {
3685
- var _e = __read(_d.value, 2), test = _e[0], form = _e[1];
3686
- var value = evaluateAstNode(test, contextStack);
3685
+ for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
3686
+ var _c = __read(params_1_1.value, 2), test = _c[0], form = _c[1];
3687
+ var value = evaluateNode(test, contextStack);
3687
3688
  if (!value)
3688
3689
  continue;
3689
- return evaluateAstNode(form, contextStack);
3690
+ return evaluateNode(form, contextStack);
3690
3691
  }
3691
3692
  }
3692
3693
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3693
3694
  finally {
3694
3695
  try {
3695
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3696
+ if (params_1_1 && !params_1_1.done && (_b = params_1.return)) _b.call(params_1);
3696
3697
  }
3697
3698
  finally { if (e_1) throw e_1.error; }
3698
3699
  }
3699
3700
  return null;
3700
3701
  },
3701
3702
  getUndefinedSymbols: function (node, contextStack, _a) {
3702
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3703
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3703
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3704
+ return getUndefinedSymbols(node[1][1].flat(), contextStack, builtin, evaluateNode);
3704
3705
  },
3705
3706
  };
3706
3707
 
@@ -3708,66 +3709,159 @@ var switchSpecialExpression = {
3708
3709
  paramCount: { odd: true },
3709
3710
  evaluate: function (node, contextStack, _a) {
3710
3711
  var e_1, _b;
3711
- var evaluateAstNode = _a.evaluateAstNode;
3712
- var switchValue = evaluateAstNode(node.params[0], contextStack);
3712
+ var evaluateNode = _a.evaluateNode;
3713
+ var _c = __read(node[1], 3), switchValueNode = _c[1], cases = _c[2];
3714
+ var switchValue = evaluateNode(switchValueNode, contextStack);
3713
3715
  try {
3714
- for (var _c = __values(arrayToPairs(node.params.slice(1))), _d = _c.next(); !_d.done; _d = _c.next()) {
3715
- var _e = __read(_d.value, 2), test = _e[0], form = _e[1];
3716
- var value = evaluateAstNode(test, contextStack);
3716
+ for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
3717
+ var _d = __read(cases_1_1.value, 2), test = _d[0], form = _d[1];
3718
+ var value = evaluateNode(test, contextStack);
3717
3719
  if (value === switchValue) {
3718
- return evaluateAstNode(form, contextStack);
3720
+ return evaluateNode(form, contextStack);
3719
3721
  }
3720
3722
  }
3721
3723
  }
3722
3724
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3723
3725
  finally {
3724
3726
  try {
3725
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3727
+ if (cases_1_1 && !cases_1_1.done && (_b = cases_1.return)) _b.call(cases_1);
3726
3728
  }
3727
3729
  finally { if (e_1) throw e_1.error; }
3728
3730
  }
3729
3731
  return null;
3730
3732
  },
3731
3733
  getUndefinedSymbols: function (node, contextStack, _a) {
3732
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3733
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3734
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3735
+ return getUndefinedSymbols(__spreadArray([node[1][1]], __read(node[1][2].flat()), false), contextStack, builtin, evaluateNode);
3734
3736
  },
3735
3737
  };
3736
3738
 
3737
- var declaredSpecialExpression = {
3739
+ var specialExpressionTypes = {
3740
+ '??': 0,
3741
+ '&&': 1,
3742
+ '||': 2,
3743
+ 'array': 3,
3744
+ 'cond': 4,
3745
+ 'def': 5,
3746
+ 'defined?': 6,
3747
+ 'defn': 7,
3748
+ 'do': 8,
3749
+ 'doseq': 9,
3750
+ 'fn': 10,
3751
+ 'for': 11,
3752
+ 'function': 12,
3753
+ 'if': 13,
3754
+ 'let': 14,
3755
+ 'loop': 15,
3756
+ 'object': 16,
3757
+ 'recur': 17,
3758
+ 'switch': 18,
3759
+ 'throw': 19,
3760
+ 'try': 20,
3761
+ 'unless': 21,
3762
+ };
3763
+
3764
+ function isSymbolNode(node) {
3765
+ var nodeType = node[0];
3766
+ return NodeTypes.UserDefinedSymbol === nodeType
3767
+ || NodeTypes.NormalBuiltinSymbol === nodeType
3768
+ || NodeTypes.SpecialBuiltinSymbol === nodeType;
3769
+ }
3770
+ function assertSymbolNode(node, sourceCodeInfo) {
3771
+ if (!isSymbolNode(node))
3772
+ throw getAssertionError('SymbolNode', node, sourceCodeInfo);
3773
+ }
3774
+ function isUserDefinedSymbolNode(node) {
3775
+ return NodeTypes.UserDefinedSymbol === node[0];
3776
+ }
3777
+ function asUserDefinedSymbolNode(node, sourceCodeInfo) {
3778
+ assertUserDefinedSymbolNode(node, sourceCodeInfo);
3779
+ return node;
3780
+ }
3781
+ function assertUserDefinedSymbolNode(node, sourceCodeInfo) {
3782
+ if (!isUserDefinedSymbolNode(node))
3783
+ throw getAssertionError('UserDefinedSymbolNode', node, sourceCodeInfo);
3784
+ }
3785
+ function isNormalBuiltinSymbolNode(node) {
3786
+ return NodeTypes.NormalBuiltinSymbol === node[0];
3787
+ }
3788
+ function isSpecialBuiltinSymbolNode(node, name) {
3789
+ if (NodeTypes.SpecialBuiltinSymbol !== node[0]) {
3790
+ return false;
3791
+ }
3792
+ {
3793
+ return true;
3794
+ }
3795
+ }
3796
+ // export function isNumberNode(node: Node): node is NumberNode {
3797
+ // return node[0] === NodeTypes.Number
3798
+ // }
3799
+ // export function asNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): NumberNode {
3800
+ // assertNumberNode(node, sourceCodeInfo)
3801
+ // return node
3802
+ // }
3803
+ // export function assertNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): asserts node is NumberNode {
3804
+ // if (!isNumberNode(node))
3805
+ // throw getAssertionError('NumberNode', node, sourceCodeInfo)
3806
+ // }
3807
+ function isNormalExpressionNode(node) {
3808
+ return node[0] === NodeTypes.NormalExpression;
3809
+ }
3810
+ function isNormalExpressionNodeWithName(node) {
3811
+ if (!isNormalExpressionNode(node)) {
3812
+ return false;
3813
+ }
3814
+ return isSymbolNode(node[1][0]);
3815
+ }
3816
+ function isSpreadNode(node) {
3817
+ return node[0] === NodeTypes.Spread;
3818
+ }
3819
+
3820
+ var definedSpecialExpression = {
3738
3821
  paramCount: 1,
3739
3822
  evaluate: function (node, contextStack) {
3740
- var lookUpResult = contextStack.lookUp(node.params[0]);
3823
+ var symbolNode = node[1][1];
3824
+ assertSymbolNode(symbolNode);
3825
+ if (!isUserDefinedSymbolNode(symbolNode)) {
3826
+ return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
3827
+ }
3828
+ var lookUpResult = contextStack.lookUp(symbolNode);
3741
3829
  return lookUpResult !== null;
3742
3830
  },
3743
3831
  getUndefinedSymbols: function (node, contextStack, _a) {
3744
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3745
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3832
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3833
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
3746
3834
  },
3747
3835
  };
3748
3836
 
3749
- function evalueateBindingNodeValues(input, value, evaluate) {
3750
- var target = 'target' in input ? input.target : input;
3751
- var sourceCodeInfo = input.sourceCodeInfo;
3837
+ var bindingTargetTypes = {
3838
+ symbol: 11,
3839
+ rest: 12,
3840
+ object: 13,
3841
+ array: 14,
3842
+ };
3843
+
3844
+ function evalueateBindingNodeValues(target, value, evaluate) {
3845
+ var sourceCodeInfo = target[2];
3752
3846
  var record = {};
3753
3847
  createRecord(target, value, evaluate, sourceCodeInfo, record);
3754
3848
  return record;
3755
3849
  }
3756
3850
  function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3757
3851
  var _a, _b;
3758
- if (bindingTarget.type === 'object') {
3852
+ if (bindingTarget[0] === bindingTargetTypes.object) {
3759
3853
  assertUnknownRecord(value, sourceCodeInfo);
3760
3854
  var capturedKeys_1 = new Set();
3761
3855
  var restElement_1;
3762
- Object.entries(bindingTarget.elements).forEach(function (_a) {
3856
+ Object.entries(bindingTarget[1][0]).forEach(function (_a) {
3763
3857
  var _b;
3764
3858
  var _c = __read(_a, 2), key = _c[0], element = _c[1];
3765
- if (element.type === 'rest') {
3859
+ if (element[0] === bindingTargetTypes.rest) {
3766
3860
  restElement_1 = element;
3767
3861
  return;
3768
3862
  }
3769
3863
  capturedKeys_1.add(key);
3770
- var val = (_b = (value[key] !== undefined ? value[key] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3864
+ var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3771
3865
  assertAny(val, sourceCodeInfo);
3772
3866
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3773
3867
  });
@@ -3782,33 +3876,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3782
3876
  acc[key] = asAny(val);
3783
3877
  return acc;
3784
3878
  }, {});
3785
- record[restElement_1.name] = restValues;
3879
+ record[restElement_1[1][0]] = restValues;
3786
3880
  }
3787
3881
  }
3788
- else if (bindingTarget.type === 'array') {
3882
+ else if (bindingTarget[0] === bindingTargetTypes.array) {
3789
3883
  var restIndex = null;
3790
3884
  assertArray(value, sourceCodeInfo);
3791
- for (var index = 0; index < bindingTarget.elements.length; index += 1) {
3792
- var element = (_a = bindingTarget.elements[index]) !== null && _a !== void 0 ? _a : null;
3885
+ for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
3886
+ var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
3793
3887
  if (element === null) {
3794
3888
  continue;
3795
3889
  }
3796
- if (element.type === 'rest') {
3890
+ if (element[0] === bindingTargetTypes.rest) {
3797
3891
  restIndex = index;
3798
3892
  break;
3799
3893
  }
3800
- var val = (_b = (value[index] !== undefined ? value[index] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3894
+ var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3801
3895
  assertAny(val, sourceCodeInfo);
3802
3896
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3803
3897
  }
3804
3898
  if (restIndex !== null) {
3805
3899
  var restValues = value.slice(restIndex);
3806
- var restElement = bindingTarget.elements[restIndex];
3807
- record[restElement.name] = restValues;
3900
+ var restElement = bindingTarget[1][0][restIndex];
3901
+ record[restElement[1][0]] = restValues;
3808
3902
  }
3809
3903
  }
3904
+ else if (bindingTarget[0] === bindingTargetTypes.rest) {
3905
+ record[bindingTarget[1][0]] = asAny(value);
3906
+ }
3810
3907
  else {
3811
- record[bindingTarget.name] = asAny(value);
3908
+ record[bindingTarget[1][0][1]] = asAny(value);
3812
3909
  }
3813
3910
  }
3814
3911
  function getAllBindingTargetNames(bindingTarget) {
@@ -3821,9 +3918,9 @@ function getNamesFromBindingTarget(target, names) {
3821
3918
  if (target === null) {
3822
3919
  return;
3823
3920
  }
3824
- if (target.type === 'array') {
3921
+ if (target[0] === bindingTargetTypes.array) {
3825
3922
  try {
3826
- for (var _c = __values(target.elements), _d = _c.next(); !_d.done; _d = _c.next()) {
3923
+ for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
3827
3924
  var element = _d.value;
3828
3925
  getNamesFromBindingTarget(element, names);
3829
3926
  }
@@ -3836,9 +3933,9 @@ function getNamesFromBindingTarget(target, names) {
3836
3933
  finally { if (e_1) throw e_1.error; }
3837
3934
  }
3838
3935
  }
3839
- else if (target.type === 'object') {
3936
+ else if (target[0] === bindingTargetTypes.object) {
3840
3937
  try {
3841
- for (var _e = __values(Object.values(target.elements)), _f = _e.next(); !_f.done; _f = _e.next()) {
3938
+ for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
3842
3939
  var element = _f.value;
3843
3940
  getNamesFromBindingTarget(element, names);
3844
3941
  }
@@ -3851,27 +3948,39 @@ function getNamesFromBindingTarget(target, names) {
3851
3948
  finally { if (e_2) throw e_2.error; }
3852
3949
  }
3853
3950
  }
3951
+ else if (target[0] === bindingTargetTypes.rest) {
3952
+ if (names[target[1][0]]) {
3953
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
3954
+ }
3955
+ names[target[1][0]] = true;
3956
+ }
3854
3957
  else {
3855
- if (names[target.name]) {
3856
- throw new LitsError("Duplicate binding name: ".concat(target.name), target.sourceCodeInfo);
3958
+ if (names[target[1][0][1]]) {
3959
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
3857
3960
  }
3858
- names[target.name] = true;
3961
+ names[target[1][0][1]] = true;
3859
3962
  }
3860
3963
  }
3861
3964
 
3862
3965
  var defSpecialExpression = {
3863
3966
  paramCount: 2,
3864
3967
  evaluate: function (node, contextStack, _a) {
3865
- var evaluateAstNode = _a.evaluateAstNode;
3866
- var bindingValue = evaluateAstNode(node.bindingNode.value, contextStack);
3867
- var values = evalueateBindingNodeValues(node.bindingNode, bindingValue, function (astNode) { return evaluateAstNode(astNode, contextStack); });
3968
+ var evaluateNode = _a.evaluateNode;
3969
+ var bindingNode = node[1][1];
3970
+ var target = bindingNode[1][0];
3971
+ var value = bindingNode[1][1];
3972
+ var bindingValue = evaluateNode(value, contextStack);
3973
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
3868
3974
  contextStack.exportValues(values);
3869
3975
  return null;
3870
3976
  },
3871
3977
  getUndefinedSymbols: function (node, contextStack, _a) {
3872
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3873
- var bindingResult = getUndefinedSymbols([node.bindingNode.value], contextStack, builtin, evaluateAstNode);
3874
- contextStack.addValues(getAllBindingTargetNames(node.bindingNode.target));
3978
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3979
+ var bindingNode = node[1][1];
3980
+ var target = bindingNode[1][0];
3981
+ var value = bindingNode[1][1];
3982
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
3983
+ contextStack.addValues(getAllBindingTargetNames(target));
3875
3984
  return bindingResult;
3876
3985
  },
3877
3986
  };
@@ -3880,14 +3989,14 @@ var doSpecialExpression = {
3880
3989
  paramCount: {},
3881
3990
  evaluate: function (node, contextStack, _a) {
3882
3991
  var e_1, _b;
3883
- var evaluateAstNode = _a.evaluateAstNode;
3992
+ var evaluateNode = _a.evaluateNode;
3884
3993
  var newContext = {};
3885
3994
  var newContextStack = contextStack.create(newContext);
3886
3995
  var result = null;
3887
3996
  try {
3888
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
3997
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3889
3998
  var form = _d.value;
3890
- result = evaluateAstNode(form, newContextStack);
3999
+ result = evaluateNode(form, newContextStack);
3891
4000
  }
3892
4001
  }
3893
4002
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -3900,8 +4009,8 @@ var doSpecialExpression = {
3900
4009
  return result;
3901
4010
  },
3902
4011
  getUndefinedSymbols: function (node, contextStack, _a) {
3903
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3904
- return getUndefinedSymbols(node.params, contextStack.create({}), builtin, evaluateAstNode);
4012
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4013
+ return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
3905
4014
  },
3906
4015
  };
3907
4016
 
@@ -3962,7 +4071,8 @@ function isNumberReservedSymbol(symbol) {
3962
4071
  function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
3963
4072
  if (typeof name !== 'string')
3964
4073
  return;
3965
- if (builtin.specialExpressions[name])
4074
+ // TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
4075
+ if (specialExpressionTypes[name])
3966
4076
  throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
3967
4077
  if (builtin.normalExpressions[name])
3968
4078
  throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
@@ -3976,63 +4086,69 @@ var functionSpecialExpression = {
3976
4086
  paramCount: {},
3977
4087
  evaluate: function (node, contextStack, _a) {
3978
4088
  var _b, _c;
3979
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
3980
- var name = node.functionName.value;
3981
- assertNameNotDefined(name, contextStack, builtin, node.sourceCodeInfo);
3982
- var evaluatedFunction = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4089
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4090
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4091
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4092
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4093
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
3983
4094
  var litsFunction = (_b = {},
3984
4095
  _b[FUNCTION_SYMBOL] = true,
3985
- _b.sourceCodeInfo = node.sourceCodeInfo,
4096
+ _b.sourceCodeInfo = node[2],
3986
4097
  _b.functionType = 'UserDefined',
3987
- _b.name = name,
4098
+ _b.name = functionSymbol[1],
3988
4099
  _b.evaluatedfunction = evaluatedFunction,
3989
4100
  _b);
3990
- contextStack.addValues((_c = {}, _c[name] = litsFunction, _c));
4101
+ contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
3991
4102
  return null;
3992
4103
  },
3993
4104
  getUndefinedSymbols: function (node, contextStack, _a) {
3994
4105
  var _b, _c;
3995
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3996
- contextStack.addValues((_b = {}, _b[node.functionName.value] = true, _b));
3997
- var newContext = (_c = {}, _c[node.functionName.value] = { value: true }, _c);
3998
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, newContext);
4106
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4107
+ var functionName = node[1][1][1];
4108
+ contextStack.addValues((_b = {}, _b[functionName] = true, _b));
4109
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4110
+ return addFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
3999
4111
  },
4000
4112
  };
4001
4113
  var defnSpecialExpression = {
4002
4114
  paramCount: {},
4003
4115
  evaluate: function (node, contextStack, _a) {
4004
4116
  var _b, _c;
4005
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4006
- var name = node.functionName.value;
4007
- assertNameNotDefined(name, contextStack, builtin, node.sourceCodeInfo);
4008
- var evaluatedFunctionOverloades = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4117
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4118
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4119
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4120
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4121
+ var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4009
4122
  var litsFunction = (_b = {},
4010
4123
  _b[FUNCTION_SYMBOL] = true,
4011
- _b.sourceCodeInfo = node.sourceCodeInfo,
4124
+ _b.sourceCodeInfo = node[2],
4012
4125
  _b.functionType = 'UserDefined',
4013
- _b.name = name,
4126
+ _b.name = functionSymbol[1],
4014
4127
  _b.evaluatedfunction = evaluatedFunctionOverloades,
4015
4128
  _b);
4016
- contextStack.exportValues((_c = {}, _c[name] = litsFunction, _c));
4129
+ contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
4017
4130
  return null;
4018
4131
  },
4019
4132
  getUndefinedSymbols: function (node, contextStack, _a) {
4020
4133
  var _b, _c;
4021
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4022
- contextStack.exportValues((_b = {}, _b[node.functionName.value] = true, _b));
4023
- var newContext = (_c = {}, _c[node.functionName.value] = { value: true }, _c);
4024
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, newContext);
4134
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4135
+ var functionName = node[1][1][1];
4136
+ var fn = node[1][2];
4137
+ contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
4138
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4139
+ return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
4025
4140
  },
4026
4141
  };
4027
4142
  var fnSpecialExpression = {
4028
4143
  paramCount: {},
4029
4144
  evaluate: function (node, contextStack, _a) {
4030
4145
  var _b;
4031
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4032
- var evaluatedFunction = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4146
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4147
+ var fn = node[1][1];
4148
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4033
4149
  var litsFunction = (_b = {},
4034
4150
  _b[FUNCTION_SYMBOL] = true,
4035
- _b.sourceCodeInfo = node.sourceCodeInfo,
4151
+ _b.sourceCodeInfo = node[2],
4036
4152
  _b.functionType = 'UserDefined',
4037
4153
  _b.name = undefined,
4038
4154
  _b.evaluatedfunction = evaluatedFunction,
@@ -4040,129 +4156,103 @@ var fnSpecialExpression = {
4040
4156
  return litsFunction;
4041
4157
  },
4042
4158
  getUndefinedSymbols: function (node, contextStack, _a) {
4043
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4044
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4159
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4160
+ var fn = node[1][1];
4161
+ return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4045
4162
  },
4046
4163
  };
4047
- function evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode) {
4048
- var fn = node.function;
4164
+ function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
4049
4165
  var functionContext = {};
4050
- var context = fn.arguments.reduce(function (ctx, arg) {
4166
+ var context = fn[0].reduce(function (ctx, arg) {
4051
4167
  Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
4052
4168
  ctx[name] = { value: null };
4053
4169
  });
4054
4170
  return ctx;
4055
4171
  }, {});
4056
- var undefinedSymbols = getUndefinedSymbols(fn.body, contextStack.new(context), builtin, evaluateAstNode);
4172
+ var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
4057
4173
  undefinedSymbols.forEach(function (name) {
4058
4174
  var value = contextStack.getValue(name);
4059
4175
  if (isAny(value)) {
4060
4176
  functionContext[name] = { value: value };
4061
4177
  }
4062
4178
  });
4063
- var evaluatedFunction = {
4064
- arguments: fn.arguments,
4065
- body: fn.body,
4066
- context: functionContext,
4067
- };
4179
+ var evaluatedFunction = [
4180
+ fn[0],
4181
+ fn[1],
4182
+ functionContext,
4183
+ ];
4068
4184
  return evaluatedFunction;
4069
4185
  }
4070
- function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, functionNameContext) {
4186
+ function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
4071
4187
  var result = new Set();
4072
4188
  var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
4073
4189
  var newContext = {};
4074
- fn.arguments.forEach(function (arg) {
4190
+ fn[0].forEach(function (arg) {
4075
4191
  Object.assign(newContext, getAllBindingTargetNames(arg));
4076
4192
  });
4077
4193
  var newContextStack = contextStackWithFunctionName.create(newContext);
4078
- var overloadResult = getUndefinedSymbols(fn.body, newContextStack, builtin, evaluateAstNode);
4194
+ var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
4079
4195
  addToSet(result, overloadResult);
4080
4196
  return result;
4081
4197
  }
4082
4198
 
4083
- function isAstNode(value) {
4084
- if (value === null || typeof value !== 'object')
4085
- return false;
4086
- if (!isAstNodeType(value.type))
4087
- return false;
4088
- return true;
4089
- }
4090
- function asAstNode(value, sourceCodeInfo) {
4091
- assertAstNode(value, sourceCodeInfo);
4092
- return value;
4093
- }
4094
- function assertAstNode(value, sourceCodeInfo) {
4095
- if (!isAstNode(value))
4096
- throw getAssertionError('AstNode', value, sourceCodeInfo);
4097
- }
4098
- function isSymbolNode(value) {
4099
- if (!isAstNode(value))
4100
- return false;
4101
- return value.type === 'Symbol';
4102
- }
4103
- function isNormalExpressionNodeWithName(value) {
4104
- if (!isAstNode(value))
4105
- return false;
4106
- return value.type === 'NormalExpression' && typeof value.name === 'string';
4107
- }
4108
-
4109
4199
  var ifSpecialExpression = {
4110
4200
  paramCount: { min: 2, max: 3 },
4111
4201
  evaluate: function (node, contextStack, _a) {
4112
- var evaluateAstNode = _a.evaluateAstNode;
4113
- var sourceCodeInfo = node.sourceCodeInfo;
4114
- var _b = __read(node.params, 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4115
- if (evaluateAstNode(asAstNode(conditionNode, sourceCodeInfo), contextStack)) {
4116
- return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
4202
+ var evaluateNode = _a.evaluateNode;
4203
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4204
+ if (evaluateNode(conditionNode, contextStack)) {
4205
+ return evaluateNode(trueNode, contextStack);
4117
4206
  }
4118
- else {
4119
- if (node.params.length === 3)
4120
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4121
- else
4122
- return null;
4207
+ else if (falseNode) {
4208
+ return evaluateNode(falseNode, contextStack);
4123
4209
  }
4210
+ return null;
4124
4211
  },
4125
4212
  getUndefinedSymbols: function (node, contextStack, _a) {
4126
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4127
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4213
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4214
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4128
4215
  },
4129
4216
  };
4130
4217
 
4131
4218
  var unlessSpecialExpression = {
4132
4219
  paramCount: { min: 2, max: 3 },
4133
4220
  evaluate: function (node, contextStack, _a) {
4134
- var evaluateAstNode = _a.evaluateAstNode;
4135
- var sourceCodeInfo = node.sourceCodeInfo;
4136
- var _b = __read(node.params, 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4137
- if (!evaluateAstNode(asAstNode(conditionNode, sourceCodeInfo), contextStack)) {
4138
- return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
4221
+ var evaluateNode = _a.evaluateNode;
4222
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4223
+ if (!evaluateNode(conditionNode, contextStack)) {
4224
+ return evaluateNode(trueNode, contextStack);
4139
4225
  }
4140
- else {
4141
- if (node.params.length === 3)
4142
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4143
- else
4144
- return null;
4226
+ else if (falseNode) {
4227
+ return evaluateNode(falseNode, contextStack);
4145
4228
  }
4229
+ return null;
4146
4230
  },
4147
4231
  getUndefinedSymbols: function (node, contextStack, _a) {
4148
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4149
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4232
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4233
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4150
4234
  },
4151
4235
  };
4152
4236
 
4153
4237
  var letSpecialExpression = {
4154
4238
  paramCount: 0,
4155
4239
  evaluate: function (node, contextStack, _a) {
4156
- var evaluateAstNode = _a.evaluateAstNode;
4157
- var bindingValue = evaluateAstNode(node.bindingNode.value, contextStack);
4158
- var values = evalueateBindingNodeValues(node.bindingNode, bindingValue, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4240
+ var evaluateNode = _a.evaluateNode;
4241
+ var bindingNode = node[1][1];
4242
+ var target = bindingNode[1][0];
4243
+ var value = bindingNode[1][1];
4244
+ var bindingValue = evaluateNode(value, contextStack);
4245
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
4159
4246
  contextStack.addValues(values);
4160
4247
  return null;
4161
4248
  },
4162
4249
  getUndefinedSymbols: function (node, contextStack, _a) {
4163
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4164
- var bindingResult = getUndefinedSymbols([node.bindingNode.value], contextStack, builtin, evaluateAstNode);
4165
- contextStack.addValues(getAllBindingTargetNames(node.bindingNode.target));
4250
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4251
+ var bindingNode = node[1][1];
4252
+ var target = bindingNode[1][0];
4253
+ var value = bindingNode[1][1];
4254
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
4255
+ contextStack.addValues(getAllBindingTargetNames(target));
4166
4256
  return bindingResult;
4167
4257
  },
4168
4258
  };
@@ -4170,11 +4260,11 @@ var letSpecialExpression = {
4170
4260
  var loopSpecialExpression = {
4171
4261
  paramCount: {},
4172
4262
  evaluate: function (node, contextStack, _a) {
4173
- var evaluateAstNode = _a.evaluateAstNode;
4174
- var sourceCodeInfo = node.sourceCodeInfo;
4175
- var bindingContext = node.bindingNodes.reduce(function (result, binding) {
4176
- var val = evaluateAstNode(binding.value, contextStack.create(result));
4177
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4263
+ var evaluateNode = _a.evaluateNode;
4264
+ var bindingNodes = node[1][1];
4265
+ var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
4266
+ var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
4267
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
4178
4268
  Object.entries(valueRecord).forEach(function (_a) {
4179
4269
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4180
4270
  result[name] = { value: value };
@@ -4182,20 +4272,21 @@ var loopSpecialExpression = {
4182
4272
  return result;
4183
4273
  }, {});
4184
4274
  var newContextStack = contextStack.create(bindingContext);
4275
+ var body = node[1][2];
4185
4276
  var _loop_1 = function () {
4186
4277
  var e_1, _b;
4187
4278
  var result = null;
4188
4279
  try {
4189
4280
  try {
4190
- for (var _c = (e_1 = void 0, __values(node.params)), _d = _c.next(); !_d.done; _d = _c.next()) {
4191
- var form = _d.value;
4192
- result = evaluateAstNode(form, newContextStack);
4281
+ for (var body_1 = (e_1 = void 0, __values(body)), body_1_1 = body_1.next(); !body_1_1.done; body_1_1 = body_1.next()) {
4282
+ var form = body_1_1.value;
4283
+ result = evaluateNode(form, newContextStack);
4193
4284
  }
4194
4285
  }
4195
4286
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
4196
4287
  finally {
4197
4288
  try {
4198
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
4289
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4199
4290
  }
4200
4291
  finally { if (e_1) throw e_1.error; }
4201
4292
  }
@@ -4203,16 +4294,16 @@ var loopSpecialExpression = {
4203
4294
  catch (error) {
4204
4295
  if (error instanceof RecurSignal) {
4205
4296
  var params_1 = error.params;
4206
- if (params_1.length !== node.bindingNodes.length) {
4207
- throw new LitsError("recur expected ".concat(node.bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), sourceCodeInfo);
4297
+ if (params_1.length !== bindingNodes.length) {
4298
+ throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
4208
4299
  }
4209
- node.bindingNodes.forEach(function (binding, index) {
4300
+ bindingNodes.forEach(function (bindingNode, index) {
4210
4301
  var e_2, _a;
4211
- var valueRecord = evalueateBindingNodeValues(binding, asAny(params_1[index], sourceCodeInfo), function (astNode) { return evaluateAstNode(astNode, contextStack); });
4302
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
4212
4303
  try {
4213
4304
  for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
4214
4305
  var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
4215
- asNonUndefined(bindingContext[name_1], sourceCodeInfo).value = value;
4306
+ bindingContext[name_1].value = value;
4216
4307
  }
4217
4308
  }
4218
4309
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
@@ -4236,29 +4327,31 @@ var loopSpecialExpression = {
4236
4327
  }
4237
4328
  },
4238
4329
  getUndefinedSymbols: function (node, contextStack, _a) {
4239
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4240
- var newContext = node.bindingNodes
4330
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4331
+ var bindingNodes = node[1][1];
4332
+ var newContext = bindingNodes
4241
4333
  .reduce(function (context, bindingNode) {
4242
- var names = getAllBindingTargetNames(bindingNode.target);
4334
+ var names = getAllBindingTargetNames(bindingNode[1][0]);
4243
4335
  Object.keys(names).forEach(function (name) {
4244
4336
  context[name] = { value: true };
4245
4337
  });
4246
4338
  return context;
4247
4339
  }, {});
4248
- var bindingValueNodes = node.bindingNodes.map(function (binding) { return binding.value; });
4249
- var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateAstNode);
4250
- var paramsResult = getUndefinedSymbols(node.params, contextStack.create(newContext), builtin, evaluateAstNode);
4340
+ var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
4341
+ var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
4342
+ var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
4251
4343
  return joinSets(bindingsResult, paramsResult);
4252
4344
  },
4253
4345
  };
4254
4346
 
4255
- function addToContext(bindings, context, contextStack, evaluateAstNode) {
4347
+ function addToContext(bindings, context, contextStack, evaluateNode) {
4256
4348
  var e_1, _a;
4257
4349
  try {
4258
4350
  for (var bindings_1 = __values(bindings), bindings_1_1 = bindings_1.next(); !bindings_1_1.done; bindings_1_1 = bindings_1.next()) {
4259
- var binding = bindings_1_1.value;
4260
- var val = evaluateAstNode(binding.value, contextStack);
4261
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4351
+ var bindingNode = bindings_1_1.value;
4352
+ var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
4353
+ var val = evaluateNode(bindingValue, contextStack);
4354
+ var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
4262
4355
  Object.entries(valueRecord).forEach(function (_a) {
4263
4356
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4264
4357
  context[name] = { value: value };
@@ -4273,9 +4366,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
4273
4366
  finally { if (e_1) throw e_1.error; }
4274
4367
  }
4275
4368
  }
4276
- function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4277
- var sourceCodeInfo = node.sourceCodeInfo;
4278
- var _a = node, loopBindings = _a.l, params = _a.params;
4369
+ function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
4370
+ var sourceCodeInfo = loopNode[2];
4371
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4279
4372
  var result = [];
4280
4373
  var bindingIndices = loopBindings.map(function () { return 0; });
4281
4374
  var abort = false;
@@ -4285,8 +4378,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4285
4378
  var newContextStack = contextStack.create(context);
4286
4379
  var skip = false;
4287
4380
  bindingsLoop: for (var bindingIndex = 0; bindingIndex < loopBindings.length; bindingIndex += 1) {
4288
- var _c = asNonUndefined(loopBindings[bindingIndex], sourceCodeInfo), binding = _c.b, letBindings = _c.l, whenNode = _c.wn, whileNode = _c.we, modifiers = _c.m;
4289
- var coll = asColl(evaluateAstNode(binding.value, newContextStack), sourceCodeInfo);
4381
+ var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
4382
+ var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
4383
+ var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
4290
4384
  var seq = isSeq(coll) ? coll : Object.entries(coll);
4291
4385
  if (seq.length === 0) {
4292
4386
  skip = true;
@@ -4305,45 +4399,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4305
4399
  break;
4306
4400
  }
4307
4401
  var val = asAny(seq[index], sourceCodeInfo);
4308
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, newContextStack); });
4402
+ var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
4309
4403
  Object.entries(valueRecord).forEach(function (_a) {
4310
4404
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4311
4405
  context[name] = { value: value };
4312
4406
  });
4407
+ if (letBindings) {
4408
+ addToContext(letBindings, context, newContextStack, evaluateNode);
4409
+ }
4410
+ if (whenNode && !evaluateNode(whenNode, newContextStack)) {
4411
+ bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
4412
+ skip = true;
4413
+ break bindingsLoop;
4414
+ }
4415
+ if (whileNode && !evaluateNode(whileNode, newContextStack)) {
4416
+ bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
4417
+ skip = true;
4418
+ break bindingsLoop;
4419
+ }
4420
+ }
4421
+ if (!skip) {
4422
+ var value = null;
4313
4423
  try {
4314
- for (var modifiers_1 = (e_2 = void 0, __values(modifiers)), modifiers_1_1 = modifiers_1.next(); !modifiers_1_1.done; modifiers_1_1 = modifiers_1.next()) {
4315
- var modifier = modifiers_1_1.value;
4316
- switch (modifier) {
4317
- case '&let':
4318
- addToContext(asNonUndefined(letBindings, sourceCodeInfo), context, newContextStack, evaluateAstNode);
4319
- break;
4320
- case '&when':
4321
- if (!evaluateAstNode(asAstNode(whenNode, sourceCodeInfo), newContextStack)) {
4322
- bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
4323
- skip = true;
4324
- break bindingsLoop;
4325
- }
4326
- break;
4327
- case '&while':
4328
- if (!evaluateAstNode(asAstNode(whileNode, sourceCodeInfo), newContextStack)) {
4329
- bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
4330
- skip = true;
4331
- break bindingsLoop;
4332
- }
4333
- break;
4334
- }
4424
+ for (var body_1 = (e_2 = void 0, __values(body)), body_1_1 = body_1.next(); !body_1_1.done; body_1_1 = body_1.next()) {
4425
+ var form = body_1_1.value;
4426
+ value = evaluateNode(form, newContextStack);
4335
4427
  }
4336
4428
  }
4337
4429
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
4338
4430
  finally {
4339
4431
  try {
4340
- if (modifiers_1_1 && !modifiers_1_1.done && (_b = modifiers_1.return)) _b.call(modifiers_1);
4432
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4341
4433
  }
4342
4434
  finally { if (e_2) throw e_2.error; }
4343
4435
  }
4344
- }
4345
- if (!skip) {
4346
- var value = evaluateAstNode(params[0], newContextStack);
4347
4436
  if (returnResult)
4348
4437
  result.push(value);
4349
4438
  if (bindingIndices.length > 0)
@@ -4355,57 +4444,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4355
4444
  }
4356
4445
  return returnResult ? result : null;
4357
4446
  }
4358
- function analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode) {
4447
+ function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
4359
4448
  var result = new Set();
4360
4449
  var newContext = {};
4361
- var loopBindings = node.l;
4362
- loopBindings.forEach(function (loopBinding) {
4363
- var binding = loopBinding.b, letBindings = loopBinding.l, whenNode = loopBinding.wn, whileNode = loopBinding.we;
4364
- getUndefinedSymbols([binding.value], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4450
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4451
+ loopBindings.forEach(function (loopBindingNode) {
4452
+ var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
4453
+ var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
4454
+ getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4365
4455
  return result.add(symbol);
4366
4456
  });
4367
- Object.assign(newContext, getAllBindingTargetNames(binding.target));
4457
+ Object.assign(newContext, getAllBindingTargetNames(target));
4368
4458
  if (letBindings) {
4369
- letBindings.forEach(function (letBinding) {
4370
- getUndefinedSymbols([letBinding.value], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4459
+ letBindings.forEach(function (letBindingNode) {
4460
+ var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
4461
+ getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4371
4462
  return result.add(symbol);
4372
4463
  });
4373
- Object.assign(newContext, getAllBindingTargetNames(letBinding.target));
4464
+ Object.assign(newContext, getAllBindingTargetNames(letTarget));
4374
4465
  });
4375
4466
  }
4376
4467
  if (whenNode) {
4377
- getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4468
+ getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4378
4469
  return result.add(symbol);
4379
4470
  });
4380
4471
  }
4381
4472
  if (whileNode) {
4382
- getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4473
+ getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4383
4474
  return result.add(symbol);
4384
4475
  });
4385
4476
  }
4386
4477
  });
4387
- getUndefinedSymbols(node.params, contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4478
+ getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4388
4479
  return result.add(symbol);
4389
4480
  });
4390
4481
  return result;
4391
4482
  }
4392
4483
  var forSpecialExpression = {
4393
4484
  paramCount: 1,
4394
- evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateAstNode); },
4485
+ evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
4395
4486
  getUndefinedSymbols: function (node, contextStack, _a) {
4396
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4397
- return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4487
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4488
+ return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4398
4489
  },
4399
4490
  };
4400
4491
  var doseqSpecialExpression = {
4401
4492
  paramCount: 1,
4402
4493
  evaluate: function (node, contextStack, helpers) {
4403
- evaluateLoop(false, node, contextStack, helpers.evaluateAstNode);
4494
+ evaluateLoop(false, node, contextStack, helpers.evaluateNode);
4404
4495
  return null;
4405
4496
  },
4406
4497
  getUndefinedSymbols: function (node, contextStack, _a) {
4407
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4408
- return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4498
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4499
+ return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4409
4500
  },
4410
4501
  };
4411
4502
 
@@ -4413,12 +4504,12 @@ var orSpecialExpression = {
4413
4504
  paramCount: {},
4414
4505
  evaluate: function (node, contextStack, _a) {
4415
4506
  var e_1, _b;
4416
- var evaluateAstNode = _a.evaluateAstNode;
4507
+ var evaluateNode = _a.evaluateNode;
4417
4508
  var value = false;
4418
4509
  try {
4419
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4510
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4420
4511
  var param = _d.value;
4421
- value = evaluateAstNode(param, contextStack);
4512
+ value = evaluateNode(param, contextStack);
4422
4513
  if (value)
4423
4514
  break;
4424
4515
  }
@@ -4433,55 +4524,55 @@ var orSpecialExpression = {
4433
4524
  return value;
4434
4525
  },
4435
4526
  getUndefinedSymbols: function (node, contextStack, _a) {
4436
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4437
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4527
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4528
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4438
4529
  },
4439
4530
  };
4440
4531
 
4441
4532
  var qqSpecialExpression = {
4442
4533
  paramCount: { min: 1, max: 2 },
4443
4534
  evaluate: function (node, contextStack, _a) {
4444
- var evaluateAstNode = _a.evaluateAstNode;
4445
- var _b = __read(node.params, 2), firstNode = _b[0], secondNode = _b[1];
4446
- if (isSymbolNode(firstNode)) {
4447
- if (contextStack.lookUp(firstNode) === null)
4448
- return secondNode ? evaluateAstNode(secondNode, contextStack) : null;
4535
+ var evaluateNode = _a.evaluateNode;
4536
+ var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
4537
+ if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
4538
+ return secondNode ? evaluateNode(secondNode, contextStack) : null;
4449
4539
  }
4450
- assertAny(firstNode, node.sourceCodeInfo);
4451
- var firstResult = evaluateAstNode(firstNode, contextStack);
4452
- return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateAstNode(secondNode, contextStack) : null);
4540
+ assertAny(firstNode, node[2]);
4541
+ var firstResult = evaluateNode(firstNode, contextStack);
4542
+ return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
4453
4543
  },
4454
4544
  getUndefinedSymbols: function (node, contextStack, _a) {
4455
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4456
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4545
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4546
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4457
4547
  },
4458
4548
  };
4459
4549
 
4460
4550
  var recurSpecialExpression = {
4461
4551
  paramCount: {},
4462
4552
  evaluate: function (node, contextStack, _a) {
4463
- var evaluateAstNode = _a.evaluateAstNode;
4464
- var params = node.params.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
4465
- throw new RecurSignal(params);
4553
+ var evaluateNode = _a.evaluateNode;
4554
+ var params = node[1][1];
4555
+ var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4556
+ throw new RecurSignal(evaluatedParams);
4466
4557
  },
4467
4558
  getUndefinedSymbols: function (node, contextStack, _a) {
4468
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4469
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4559
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4560
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4470
4561
  },
4471
4562
  };
4472
4563
 
4473
4564
  var throwSpecialExpression = {
4474
4565
  paramCount: 1,
4475
4566
  evaluate: function (node, contextStack, _a) {
4476
- var evaluateAstNode = _a.evaluateAstNode;
4477
- var message = asString(evaluateAstNode(node.params[0], contextStack), node.sourceCodeInfo, {
4567
+ var evaluateNode = _a.evaluateNode;
4568
+ var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
4478
4569
  nonEmpty: true,
4479
4570
  });
4480
- throw new UserDefinedError(message, node.sourceCodeInfo);
4571
+ throw new UserDefinedError(message, node[2]);
4481
4572
  },
4482
4573
  getUndefinedSymbols: function (node, contextStack, _a) {
4483
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4484
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4574
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4575
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
4485
4576
  },
4486
4577
  };
4487
4578
 
@@ -4489,29 +4580,29 @@ var trySpecialExpression = {
4489
4580
  paramCount: 1,
4490
4581
  evaluate: function (node, contextStack, _a) {
4491
4582
  var _b;
4492
- var evaluateAstNode = _a.evaluateAstNode;
4493
- var tryExpressions = node.params, catchExpression = node.ce, errorNode = node.e;
4583
+ var evaluateNode = _a.evaluateNode;
4584
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4494
4585
  try {
4495
- return evaluateAstNode(tryExpressions[0], contextStack);
4586
+ return evaluateNode(tryExpression, contextStack);
4496
4587
  }
4497
4588
  catch (error) {
4498
- var newContext = errorNode
4589
+ var newContext = errorSymbol
4499
4590
  ? (_b = {},
4500
- _b[errorNode.value] = { value: asAny(error, node.sourceCodeInfo) },
4591
+ _b[errorSymbol[1]] = { value: error },
4501
4592
  _b) : {};
4502
- return evaluateAstNode(catchExpression, contextStack.create(newContext));
4593
+ return evaluateNode(catchExpression, contextStack.create(newContext));
4503
4594
  }
4504
4595
  },
4505
4596
  getUndefinedSymbols: function (node, contextStack, _a) {
4506
4597
  var _b;
4507
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4508
- var tryExpressions = node.params, catchExpression = node.ce, errorNode = node.e;
4509
- var tryResult = getUndefinedSymbols(tryExpressions, contextStack, builtin, evaluateAstNode);
4510
- var newContext = errorNode
4598
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4599
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4600
+ var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
4601
+ var newContext = errorSymbol
4511
4602
  ? (_b = {},
4512
- _b[errorNode.value] = { value: true },
4603
+ _b[errorSymbol[1]] = { value: true },
4513
4604
  _b) : {};
4514
- var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateAstNode);
4605
+ var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
4515
4606
  return joinSets(tryResult, catchResult);
4516
4607
  },
4517
4608
  };
@@ -4520,20 +4611,20 @@ var arraySpecialExpression = {
4520
4611
  paramCount: {},
4521
4612
  evaluate: function (node, contextStack, _a) {
4522
4613
  var e_1, _b;
4523
- var evaluateAstNode = _a.evaluateAstNode;
4614
+ var evaluateNode = _a.evaluateNode;
4524
4615
  var result = [];
4525
4616
  try {
4526
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4617
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4527
4618
  var param = _d.value;
4528
- if (param.type === 'Spread') {
4529
- var spreadValue = evaluateAstNode(param.value, contextStack);
4619
+ if (isSpreadNode(param)) {
4620
+ var spreadValue = evaluateNode(param[1], contextStack);
4530
4621
  if (!Array.isArray(spreadValue)) {
4531
- throw new LitsError('Spread value is not an array', param.sourceCodeInfo);
4622
+ throw new LitsError('Spread value is not an array', param[2]);
4532
4623
  }
4533
4624
  result.push.apply(result, __spreadArray([], __read(spreadValue), false));
4534
4625
  }
4535
4626
  else {
4536
- result.push(evaluateAstNode(param, contextStack));
4627
+ result.push(evaluateNode(param, contextStack));
4537
4628
  }
4538
4629
  }
4539
4630
  }
@@ -4547,156 +4638,171 @@ var arraySpecialExpression = {
4547
4638
  return result;
4548
4639
  },
4549
4640
  getUndefinedSymbols: function (node, contextStack, _a) {
4550
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4551
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4641
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4642
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4552
4643
  },
4553
4644
  };
4554
4645
 
4555
4646
  var objectSpecialExpression = {
4556
4647
  paramCount: {},
4557
4648
  evaluate: function (node, contextStack, _a) {
4558
- var evaluateAstNode = _a.evaluateAstNode;
4649
+ var evaluateNode = _a.evaluateNode;
4559
4650
  var result = {};
4560
- for (var i = 0; i < node.params.length; i += 2) {
4561
- var keyNode = asAstNode(node.params[i]);
4562
- if ((keyNode === null || keyNode === void 0 ? void 0 : keyNode.type) === 'Spread') {
4563
- var spreadObject = evaluateAstNode(keyNode.value, contextStack);
4651
+ var params = node[1][1];
4652
+ for (var i = 0; i < params.length; i += 2) {
4653
+ var keyNode = params[i];
4654
+ if (isSpreadNode(keyNode)) {
4655
+ var spreadObject = evaluateNode(keyNode[1], contextStack);
4564
4656
  if (!isUnknownRecord(spreadObject)) {
4565
- throw new LitsError('Spread value is not an object', keyNode.sourceCodeInfo);
4657
+ throw new LitsError('Spread value is not an object', keyNode[2]);
4566
4658
  }
4567
4659
  Object.assign(result, spreadObject);
4568
4660
  i -= 1;
4569
4661
  }
4570
4662
  else {
4571
- var key = evaluateAstNode(keyNode, contextStack);
4572
- var value = evaluateAstNode(node.params[i + 1], contextStack);
4573
- assertString(key, keyNode.sourceCodeInfo);
4663
+ var key = evaluateNode(keyNode, contextStack);
4664
+ var value = evaluateNode(params[i + 1], contextStack);
4665
+ assertString(key, keyNode[2]);
4574
4666
  result[key] = value;
4575
4667
  }
4576
4668
  }
4577
4669
  return result;
4578
4670
  },
4579
4671
  getUndefinedSymbols: function (node, contextStack, _a) {
4580
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4581
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4672
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4673
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4582
4674
  },
4583
4675
  };
4584
4676
 
4585
- var specialExpressions = {
4586
- '&&': andSpecialExpression,
4587
- 'cond': condSpecialExpression,
4588
- 'switch': switchSpecialExpression,
4589
- 'def': defSpecialExpression,
4590
- 'defn': defnSpecialExpression,
4591
- 'function': functionSpecialExpression,
4592
- 'do': doSpecialExpression,
4593
- 'doseq': doseqSpecialExpression,
4594
- 'for': forSpecialExpression,
4595
- 'fn': fnSpecialExpression,
4596
- 'if': ifSpecialExpression,
4597
- 'unless': unlessSpecialExpression,
4598
- 'let': letSpecialExpression,
4599
- 'loop': loopSpecialExpression,
4600
- '||': orSpecialExpression,
4601
- 'recur': recurSpecialExpression,
4602
- 'throw': throwSpecialExpression,
4603
- 'try': trySpecialExpression,
4604
- 'defined?': declaredSpecialExpression,
4605
- '??': qqSpecialExpression,
4606
- 'array': arraySpecialExpression,
4607
- 'object': objectSpecialExpression,
4608
- };
4677
+ var specialExpressions = [
4678
+ qqSpecialExpression,
4679
+ andSpecialExpression,
4680
+ orSpecialExpression,
4681
+ arraySpecialExpression,
4682
+ condSpecialExpression,
4683
+ defSpecialExpression,
4684
+ definedSpecialExpression,
4685
+ defnSpecialExpression,
4686
+ doSpecialExpression,
4687
+ doseqSpecialExpression,
4688
+ fnSpecialExpression,
4689
+ forSpecialExpression,
4690
+ functionSpecialExpression,
4691
+ ifSpecialExpression,
4692
+ letSpecialExpression,
4693
+ loopSpecialExpression,
4694
+ objectSpecialExpression,
4695
+ recurSpecialExpression,
4696
+ switchSpecialExpression,
4697
+ throwSpecialExpression,
4698
+ trySpecialExpression,
4699
+ unlessSpecialExpression,
4700
+ ];
4609
4701
  var builtin = {
4610
4702
  normalExpressions: normalExpressions,
4611
4703
  specialExpressions: specialExpressions,
4704
+ allNormalExpressions: allNormalExpressions,
4612
4705
  };
4613
4706
  var normalExpressionKeys = Object.keys(normalExpressions);
4614
- var specialExpressionKeys = Object.keys(specialExpressions);
4707
+ var specialExpressionKeys = Object.keys(specialExpressionTypes);
4708
+ new Set(specialExpressionKeys);
4615
4709
 
4616
- var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateAstNode) {
4710
+ var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
4617
4711
  var e_1, _a;
4618
4712
  var _b;
4619
- var astNodes = Array.isArray(ast)
4713
+ var nodes = Array.isArray(ast)
4620
4714
  ? ast
4621
- : [{
4622
- type: 'SpecialExpression',
4623
- name: 'do',
4624
- params: ast.body,
4625
- sourceCodeInfo: undefined,
4626
- }];
4715
+ : [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
4627
4716
  var unresolvedSymbols = new Set();
4628
4717
  try {
4629
- for (var astNodes_1 = __values(astNodes), astNodes_1_1 = astNodes_1.next(); !astNodes_1_1.done; astNodes_1_1 = astNodes_1.next()) {
4630
- var subNode = astNodes_1_1.value;
4631
- (_b = findUnresolvedSymbolsInAstNode(subNode, contextStack, builtin, evaluateAstNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
4718
+ for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
4719
+ var subNode = nodes_1_1.value;
4720
+ (_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
4632
4721
  }
4633
4722
  }
4634
4723
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
4635
4724
  finally {
4636
4725
  try {
4637
- if (astNodes_1_1 && !astNodes_1_1.done && (_a = astNodes_1.return)) _a.call(astNodes_1);
4726
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
4638
4727
  }
4639
4728
  finally { if (e_1) throw e_1.error; }
4640
4729
  }
4641
4730
  return unresolvedSymbols;
4642
4731
  };
4643
- function findUnresolvedSymbolsInAstNode(astNode, contextStack, builtin, evaluateAstNode) {
4732
+ function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
4644
4733
  var e_2, _a;
4645
- var _b;
4646
- switch (astNode.type) {
4647
- case 'Symbol': {
4648
- var lookUpResult = contextStack.lookUp(astNode);
4734
+ var _b, _c;
4735
+ var nodeType = node[0];
4736
+ switch (nodeType) {
4737
+ case NodeTypes.UserDefinedSymbol: {
4738
+ var symbolNode = node;
4739
+ var lookUpResult = contextStack.lookUp(symbolNode);
4649
4740
  if (lookUpResult === null)
4650
- return new Set([astNode.value]);
4741
+ return new Set([symbolNode[1]]);
4651
4742
  return null;
4652
4743
  }
4653
- case 'String':
4654
- case 'Number':
4655
- case 'Modifier':
4656
- case 'ReservedSymbol':
4657
- case 'Comment':
4744
+ case NodeTypes.NormalBuiltinSymbol:
4745
+ case NodeTypes.SpecialBuiltinSymbol:
4746
+ case NodeTypes.String:
4747
+ case NodeTypes.Number:
4748
+ case NodeTypes.ReservedSymbol:
4658
4749
  return null;
4659
- case 'NormalExpression': {
4750
+ case NodeTypes.NormalExpression: {
4751
+ var normalExpressionNode = node;
4660
4752
  var unresolvedSymbols_1 = new Set();
4661
- var name_1 = astNode.name, sourceCodeInfo = astNode.sourceCodeInfo;
4662
- if (typeof name_1 === 'string') {
4663
- var lookUpResult = contextStack.lookUp({ type: 'Symbol', value: name_1, sourceCodeInfo: sourceCodeInfo });
4664
- if (lookUpResult === null)
4665
- unresolvedSymbols_1.add(name_1);
4753
+ if (isNormalExpressionNodeWithName(normalExpressionNode)) {
4754
+ var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
4755
+ if (isUserDefinedSymbolNode(symbolNode)) {
4756
+ var lookUpResult = contextStack.lookUp(symbolNode);
4757
+ if (lookUpResult === null)
4758
+ unresolvedSymbols_1.add(symbolNode[1]);
4759
+ }
4760
+ }
4761
+ else {
4762
+ var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
4763
+ (_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
4666
4764
  }
4667
4765
  try {
4668
- for (var _c = __values(astNode.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4669
- var subNode = _d.value;
4670
- (_b = findUnresolvedSymbolsInAstNode(subNode, contextStack, builtin, evaluateAstNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
4766
+ for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
4767
+ var subNode = _j.value;
4768
+ (_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
4671
4769
  }
4672
4770
  }
4673
4771
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
4674
4772
  finally {
4675
4773
  try {
4676
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
4774
+ if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
4677
4775
  }
4678
4776
  finally { if (e_2) throw e_2.error; }
4679
4777
  }
4680
4778
  return unresolvedSymbols_1;
4681
4779
  }
4682
- case 'SpecialExpression': {
4683
- var specialExpression = asNonUndefined(builtin.specialExpressions[astNode.name], astNode.sourceCodeInfo);
4684
- // eslint-disable-next-line ts/no-unsafe-argument
4685
- return specialExpression.getUndefinedSymbols(astNode, contextStack, {
4780
+ case NodeTypes.SpecialExpression: {
4781
+ var specialExpressionNode = node;
4782
+ var specialExpressionType = specialExpressionNode[1][0];
4783
+ var specialExpression = builtin.specialExpressions[specialExpressionType];
4784
+ var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
4785
+ return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
4686
4786
  getUndefinedSymbols: getUndefinedSymbols,
4687
4787
  builtin: builtin,
4688
- evaluateAstNode: evaluateAstNode,
4788
+ evaluateNode: evaluateNode,
4689
4789
  });
4690
4790
  }
4691
- case 'Spread':
4692
- return findUnresolvedSymbolsInAstNode(astNode.value, contextStack, builtin, evaluateAstNode);
4791
+ case NodeTypes.Spread:
4792
+ return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
4793
+ case NodeTypes.Binding: {
4794
+ var bindingNode = node;
4795
+ return findUnresolvedSymbolsInNode(bindingNode[1][1], contextStack, builtin, evaluateNode);
4796
+ }
4797
+ default:
4798
+ throw new Error("Unhandled node type: ".concat(nodeType));
4693
4799
  }
4694
4800
  }
4695
4801
 
4696
4802
  function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
4697
- var hasRest = evaluatedFunction.arguments.some(function (arg) { return arg.type === 'rest'; });
4698
- var minArity = evaluatedFunction.arguments.filter(function (arg) { return arg.type !== 'rest' && !arg.default; }).length;
4699
- var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction.arguments.length;
4803
+ var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4804
+ var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
4805
+ var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
4700
4806
  if (nbrOfParams < minArity || nbrOfParams > maxArity) {
4701
4807
  throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
4702
4808
  }
@@ -4720,21 +4826,21 @@ var functionExecutors = {
4720
4826
  }
4721
4827
  },
4722
4828
  UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
4723
- var evaluateAstNode = _a.evaluateAstNode;
4829
+ var evaluateNode = _a.evaluateNode;
4724
4830
  var _loop_1 = function () {
4725
4831
  var e_1, _b;
4726
4832
  checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
4727
4833
  var evaluatedFunction = fn.evaluatedfunction;
4728
- var args = evaluatedFunction.arguments;
4729
- var nbrOfNonRestArgs = args.filter(function (arg) { return arg.type !== 'rest'; }).length;
4730
- var newContextStack = contextStack.create(fn.evaluatedfunction.context);
4834
+ var args = evaluatedFunction[0];
4835
+ var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
4836
+ var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
4731
4837
  var newContext = {};
4732
4838
  var rest = [];
4733
4839
  for (var i = 0; i < params.length; i += 1) {
4734
4840
  if (i < nbrOfNonRestArgs) {
4735
4841
  var param = toAny(params[i]);
4736
- var valueRecord = evalueateBindingNodeValues(args[i], param, function (astNode) {
4737
- return evaluateAstNode(astNode, newContextStack.create(newContext));
4842
+ var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
4843
+ return evaluateNode(Node, newContextStack.create(newContext));
4738
4844
  });
4739
4845
  Object.entries(valueRecord).forEach(function (_a) {
4740
4846
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
@@ -4747,18 +4853,18 @@ var functionExecutors = {
4747
4853
  }
4748
4854
  for (var i = params.length; i < nbrOfNonRestArgs; i++) {
4749
4855
  var arg = args[i];
4750
- var defaultValue = evaluateAstNode(arg.default, contextStack.create(newContext));
4751
- var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (astNode) {
4752
- return evaluateAstNode(astNode, contextStack.create(newContext));
4856
+ var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
4857
+ var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
4858
+ return evaluateNode(Node, contextStack.create(newContext));
4753
4859
  });
4754
4860
  Object.entries(valueRecord).forEach(function (_a) {
4755
4861
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4756
4862
  newContext[key] = { value: value };
4757
4863
  });
4758
4864
  }
4759
- var restArgument = args.find(function (arg) { return arg.type === 'rest'; });
4865
+ var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4760
4866
  if (restArgument !== undefined) {
4761
- var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (astNode) { return evaluateAstNode(astNode, contextStack.create(newContext)); });
4867
+ var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
4762
4868
  Object.entries(valueRecord).forEach(function (_a) {
4763
4869
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4764
4870
  newContext[key] = { value: value };
@@ -4768,9 +4874,9 @@ var functionExecutors = {
4768
4874
  var result = null;
4769
4875
  var newContextStack2 = newContextStack.create(newContext);
4770
4876
  try {
4771
- for (var _c = (e_1 = void 0, __values(evaluatedFunction.body)), _d = _c.next(); !_d.done; _d = _c.next()) {
4877
+ for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
4772
4878
  var node = _d.value;
4773
- result = evaluateAstNode(node, newContextStack2);
4879
+ result = evaluateNode(node, newContextStack2);
4774
4880
  }
4775
4881
  }
4776
4882
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4894,7 +5000,7 @@ var functionExecutors = {
4894
5000
  },
4895
5001
  Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
4896
5002
  var executeFunction = _a.executeFunction;
4897
- var normalExpression = asNonUndefined(normalExpressions[fn.n], sourceCodeInfo);
5003
+ var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
4898
5004
  return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
4899
5005
  },
4900
5006
  };
@@ -4905,7 +5011,7 @@ function evaluate(ast, contextStack) {
4905
5011
  try {
4906
5012
  for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
4907
5013
  var node = _c.value;
4908
- result = evaluateAstNode(node, contextStack);
5014
+ result = evaluateNode(node, contextStack);
4909
5015
  }
4910
5016
  }
4911
5017
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4917,53 +5023,66 @@ function evaluate(ast, contextStack) {
4917
5023
  }
4918
5024
  return result;
4919
5025
  }
4920
- function evaluateAstNode(node, contextStack) {
4921
- switch (node.type) {
4922
- case 'Number':
5026
+ function evaluateNode(node, contextStack) {
5027
+ switch (node[0]) {
5028
+ case NodeTypes.Number:
4923
5029
  return evaluateNumber(node);
4924
- case 'String':
5030
+ case NodeTypes.String:
4925
5031
  return evaluateString(node);
4926
- case 'Symbol':
4927
- return contextStack.evaluateName(node);
4928
- case 'ReservedSymbol':
4929
- return evaluateReservedName(node);
4930
- case 'NormalExpression':
5032
+ case NodeTypes.NormalBuiltinSymbol:
5033
+ case NodeTypes.SpecialBuiltinSymbol:
5034
+ case NodeTypes.UserDefinedSymbol:
5035
+ return contextStack.evaluateSymbol(node);
5036
+ case NodeTypes.ReservedSymbol:
5037
+ return evaluateReservedSymbol(node);
5038
+ case NodeTypes.NormalExpression:
4931
5039
  return evaluateNormalExpression(node, contextStack);
4932
- case 'SpecialExpression':
5040
+ case NodeTypes.SpecialExpression:
4933
5041
  return evaluateSpecialExpression(node, contextStack);
4934
5042
  /* v8 ignore next 2 */
4935
5043
  default:
4936
- throw new LitsError("".concat(node.type, "-node cannot be evaluated"), node.sourceCodeInfo);
5044
+ throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
4937
5045
  }
4938
5046
  }
4939
5047
  function evaluateNumber(node) {
4940
- return node.value;
5048
+ return node[1];
4941
5049
  }
4942
5050
  function evaluateString(node) {
4943
- return node.value;
5051
+ return node[1];
4944
5052
  }
4945
- function evaluateReservedName(node) {
4946
- var reservedName = node.value;
5053
+ function evaluateReservedSymbol(node) {
5054
+ var reservedName = node[1];
4947
5055
  var value = reservedSymbolRecord[reservedName];
4948
- return asNonUndefined(value, node.sourceCodeInfo);
5056
+ return asNonUndefined(value, node[2]);
4949
5057
  }
4950
5058
  function evaluateNormalExpression(node, contextStack) {
4951
- var params = node.params.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
4952
- var sourceCodeInfo = node.sourceCodeInfo;
5059
+ var sourceCodeInfo = node[2];
5060
+ var paramNodes = node[1][1];
5061
+ var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4953
5062
  if (isNormalExpressionNodeWithName(node)) {
4954
- var value = contextStack.getValue(node.name);
4955
- if (value !== undefined)
4956
- return executeFunction(asAny(value), params, contextStack, sourceCodeInfo);
4957
- return evaluateBuiltinNormalExpression(node, params, contextStack);
5063
+ var nameSymbol = node[1][0];
5064
+ if (isNormalBuiltinSymbolNode(nameSymbol)) {
5065
+ var type = nameSymbol[1];
5066
+ var normalExpression = builtin.allNormalExpressions[type];
5067
+ return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
5068
+ }
5069
+ else {
5070
+ var fn = contextStack.getValue(nameSymbol[1]);
5071
+ if (fn !== undefined) {
5072
+ return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
5073
+ }
5074
+ throw new UndefinedSymbolError(nameSymbol[1], node[2]);
5075
+ }
4958
5076
  }
4959
5077
  else {
4960
- var fn = params[0];
4961
- return executeFunction(fn, params.slice(1), contextStack, sourceCodeInfo);
5078
+ var fnNode = node[1][0];
5079
+ var fn = evaluateNode(fnNode, contextStack);
5080
+ return executeFunction(fn, params, contextStack, sourceCodeInfo);
4962
5081
  }
4963
5082
  }
4964
5083
  function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4965
5084
  if (isLitsFunction(fn))
4966
- return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateAstNode: evaluateAstNode, executeFunction: executeFunction });
5085
+ return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
4967
5086
  if (Array.isArray(fn))
4968
5087
  return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
4969
5088
  if (isObj(fn))
@@ -4974,16 +5093,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4974
5093
  return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
4975
5094
  throw new NotAFunctionError(fn, sourceCodeInfo);
4976
5095
  }
4977
- function evaluateBuiltinNormalExpression(node, params, contextStack) {
4978
- var normalExpression = builtin.normalExpressions[node.name];
4979
- if (!normalExpression)
4980
- throw new UndefinedSymbolError(node.name, node.sourceCodeInfo);
4981
- return normalExpression.evaluate(params, node.sourceCodeInfo, contextStack, { executeFunction: executeFunction });
4982
- }
4983
5096
  function evaluateSpecialExpression(node, contextStack) {
4984
- var specialExpression = asNonUndefined(builtin.specialExpressions[node.name], node.sourceCodeInfo);
4985
- // eslint-disable-next-line ts/no-unsafe-argument
4986
- return specialExpression.evaluate(node, contextStack, { evaluateAstNode: evaluateAstNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
5097
+ var specialExpressionType = node[1][0];
5098
+ var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
5099
+ var castedEvaluate = specialExpression.evaluate;
5100
+ return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
4987
5101
  }
4988
5102
  function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
4989
5103
  if (params.length !== 1)
@@ -5125,13 +5239,13 @@ var ContextStackImpl = /** @class */ (function () {
5125
5239
  return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
5126
5240
  };
5127
5241
  ContextStackImpl.prototype.lookUp = function (node) {
5128
- var e_4, _a, _b;
5129
- var _c, _d, _e;
5130
- var value = node.value;
5131
- var sourceCodeInfo = node.sourceCodeInfo;
5242
+ var e_4, _a;
5243
+ var _b, _c, _d;
5244
+ var value = node[1];
5132
5245
  try {
5133
- for (var _f = __values(this.contexts), _g = _f.next(); !_g.done; _g = _f.next()) {
5134
- var context = _g.value;
5246
+ // const sourceCodeInfo = node[2]
5247
+ for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
5248
+ var context = _f.value;
5135
5249
  var contextEntry = context[value];
5136
5250
  if (contextEntry)
5137
5251
  return contextEntry;
@@ -5140,32 +5254,23 @@ var ContextStackImpl = /** @class */ (function () {
5140
5254
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
5141
5255
  finally {
5142
5256
  try {
5143
- if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
5257
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
5144
5258
  }
5145
5259
  finally { if (e_4) throw e_4.error; }
5146
5260
  }
5147
- var lazyHostValue = (_c = this.lazyValues) === null || _c === void 0 ? void 0 : _c[value];
5261
+ var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
5148
5262
  if (lazyHostValue !== undefined) {
5149
5263
  return {
5150
5264
  value: toAny(lazyHostValue.read()),
5151
5265
  };
5152
5266
  }
5153
- var hostValue = (_d = this.values) === null || _d === void 0 ? void 0 : _d[value];
5267
+ var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
5154
5268
  if (hostValue !== undefined) {
5155
5269
  return {
5156
5270
  value: toAny(hostValue),
5157
5271
  };
5158
5272
  }
5159
- if (builtin.normalExpressions[value]) {
5160
- var builtinFunction = (_b = {},
5161
- _b[FUNCTION_SYMBOL] = true,
5162
- _b.sourceCodeInfo = sourceCodeInfo,
5163
- _b.functionType = 'Builtin',
5164
- _b.n = value,
5165
- _b);
5166
- return builtinFunction;
5167
- }
5168
- var nativeJsFunction = (_e = this.nativeJsFunctions) === null || _e === void 0 ? void 0 : _e[value];
5273
+ var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
5169
5274
  if (nativeJsFunction) {
5170
5275
  return {
5171
5276
  value: nativeJsFunction,
@@ -5173,13 +5278,26 @@ var ContextStackImpl = /** @class */ (function () {
5173
5278
  }
5174
5279
  return null;
5175
5280
  };
5176
- ContextStackImpl.prototype.evaluateName = function (node) {
5281
+ ContextStackImpl.prototype.evaluateSymbol = function (node) {
5282
+ var _a;
5283
+ if (isSpecialBuiltinSymbolNode(node)) {
5284
+ throw new Error('Special builtin symbols should not be evaluated');
5285
+ }
5286
+ if (isNormalBuiltinSymbolNode(node)) {
5287
+ var type = node[1];
5288
+ return _a = {},
5289
+ _a[FUNCTION_SYMBOL] = true,
5290
+ _a.functionType = 'Builtin',
5291
+ _a.normalBuitinSymbolType = type,
5292
+ _a.sourceCodeInfo = node[2],
5293
+ _a;
5294
+ }
5177
5295
  var lookUpResult = this.lookUp(node);
5178
5296
  if (isContextEntry(lookUpResult))
5179
5297
  return lookUpResult.value;
5180
5298
  else if (isBuiltinFunction(lookUpResult))
5181
5299
  return lookUpResult;
5182
- throw new UndefinedSymbolError(node.value, node.sourceCodeInfo);
5300
+ throw new UndefinedSymbolError(node[1], node[2]);
5183
5301
  };
5184
5302
  return ContextStackImpl;
5185
5303
  }());
@@ -5714,6 +5832,10 @@ function assertReservedSymbolToken(token, symbolName) {
5714
5832
  throwUnexpectedToken('ReservedSymbol', symbolName, token);
5715
5833
  }
5716
5834
  }
5835
+ function asReservedSymbolToken(token, symbolName) {
5836
+ assertReservedSymbolToken(token, symbolName);
5837
+ return token;
5838
+ }
5717
5839
  function isSingleLineCommentToken(token) {
5718
5840
  return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
5719
5841
  }
@@ -5796,6 +5918,9 @@ function assertRBraceToken(token) {
5796
5918
  throwUnexpectedToken('RBrace', undefined, token);
5797
5919
  }
5798
5920
  }
5921
+ function isStringToken(token) {
5922
+ return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
5923
+ }
5799
5924
  function isA_BinaryOperatorToken(token) {
5800
5925
  return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
5801
5926
  }
@@ -5833,6 +5958,12 @@ function untokenize(tokenStream) {
5833
5958
  var exponentiationPrecedence = 10;
5834
5959
  var binaryFunctionalOperatorPrecedence = 1;
5835
5960
  var placeholderRegexp = /^\$([1-9]\d?)?$/;
5961
+ function withSourceCodeInfo(node, sourceCodeInfo) {
5962
+ if (sourceCodeInfo) {
5963
+ node[2] = sourceCodeInfo;
5964
+ }
5965
+ return node;
5966
+ }
5836
5967
  function getPrecedence(operatorSign) {
5837
5968
  switch (operatorSign) {
5838
5969
  case '**': // exponentiation
@@ -5875,29 +6006,18 @@ function getPrecedence(operatorSign) {
5875
6006
  throw new Error("Unknown binary operator: ".concat(operatorSign));
5876
6007
  }
5877
6008
  }
5878
- function createNamedNormalExpressionNode(name, params, sourceCodeInfo) {
5879
- var node = {
5880
- type: 'NormalExpression',
5881
- name: name,
5882
- params: params,
5883
- sourceCodeInfo: sourceCodeInfo,
5884
- };
5885
- var builtinExpression = builtin.normalExpressions[node.name];
5886
- if (builtinExpression) {
5887
- assertNumberOfParams(builtinExpression.paramCount, node);
6009
+ function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
6010
+ var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
6011
+ if (isNormalBuiltinSymbolNode(symbolNode)) {
6012
+ assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
5888
6013
  }
5889
6014
  return node;
5890
6015
  }
5891
6016
  function createAccessorNode(left, right, sourceCodeInfo) {
5892
6017
  // Unnamed normal expression
5893
- return {
5894
- type: 'NormalExpression',
5895
- params: [left, right],
5896
- name: undefined,
5897
- sourceCodeInfo: sourceCodeInfo,
5898
- };
6018
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
5899
6019
  }
5900
- function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
6020
+ function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
5901
6021
  var operatorName = operator[1];
5902
6022
  switch (operatorName) {
5903
6023
  case '**': // exponentiation
@@ -5922,16 +6042,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
5922
6042
  case '&':
5923
6043
  case '^':
5924
6044
  case '|':
5925
- return createNamedNormalExpressionNode(operatorName, [left, right], sourceCodeInfo);
6045
+ return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
5926
6046
  case '&&':
5927
6047
  case '||':
5928
6048
  case '??':
5929
- return {
5930
- type: 'SpecialExpression',
5931
- name: operatorName,
5932
- params: [left, right],
5933
- sourceCodeInfo: sourceCodeInfo,
5934
- };
6049
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
5935
6050
  /* v8 ignore next 10 */
5936
6051
  case '.':
5937
6052
  case ';':
@@ -6027,9 +6142,12 @@ var Parser = /** @class */ (function () {
6027
6142
  && !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
6028
6143
  break;
6029
6144
  }
6145
+ var symbol = specialExpressionTypes[name_1]
6146
+ ? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
6147
+ : withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
6030
6148
  this.advance();
6031
6149
  var right = this.parseExpression(newPrecedece);
6032
- left = fromBinaryOperatorToAstNode(operator, left, right, operator[2]);
6150
+ left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
6033
6151
  }
6034
6152
  else if (isSymbolToken(operator)) {
6035
6153
  if (!isFunctionOperator(operator[1])) {
@@ -6039,9 +6157,12 @@ var Parser = /** @class */ (function () {
6039
6157
  if (newPrecedece <= precedence) {
6040
6158
  break;
6041
6159
  }
6042
- this.advance();
6160
+ var operatorSymbol = this.parseSymbol();
6043
6161
  var right = this.parseExpression(newPrecedece);
6044
- left = createNamedNormalExpressionNode(operator[1], [left, right], operator[2]);
6162
+ if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
6163
+ throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
6164
+ }
6165
+ left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
6045
6166
  }
6046
6167
  else {
6047
6168
  break;
@@ -6060,11 +6181,7 @@ var Parser = /** @class */ (function () {
6060
6181
  if (!isSymbolToken(symbolToken)) {
6061
6182
  throw new LitsError('Expected symbol', this.peek()[2]);
6062
6183
  }
6063
- var stringNode = {
6064
- type: 'String',
6065
- value: symbolToken[1],
6066
- sourceCodeInfo: symbolToken[2],
6067
- };
6184
+ var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
6068
6185
  operand = createAccessorNode(operand, stringNode, token[2]);
6069
6186
  this.advance();
6070
6187
  token = this.peek();
@@ -6104,16 +6221,17 @@ var Parser = /** @class */ (function () {
6104
6221
  this.advance();
6105
6222
  return expression;
6106
6223
  }
6107
- // Unary operators
6108
6224
  else if (isOperatorToken(token)) {
6109
6225
  var operatorName = token[1];
6110
6226
  if (isBinaryOperator(operatorName)) {
6111
6227
  this.advance();
6112
- return {
6113
- type: 'Symbol',
6114
- value: operatorName,
6115
- sourceCodeInfo: token[2],
6116
- };
6228
+ if (specialExpressionTypes[operatorName] !== undefined) {
6229
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
6230
+ }
6231
+ else if (normalExpressionTypes[operatorName] !== undefined) {
6232
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
6233
+ }
6234
+ return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, operatorName], token[2]);
6117
6235
  }
6118
6236
  if (operatorName === '->') {
6119
6237
  return this.parseShorthandLamdaFunction();
@@ -6161,22 +6279,24 @@ var Parser = /** @class */ (function () {
6161
6279
  while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
6162
6280
  if (isOperatorToken(this.peek(), '...')) {
6163
6281
  this.advance();
6164
- params.push({
6165
- type: 'Spread',
6166
- value: this.parseExpression(),
6167
- sourceCodeInfo: this.peek()[2],
6168
- });
6282
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6169
6283
  }
6170
6284
  else {
6171
- var key = this.parseOperand();
6172
- if (key.type !== 'Symbol' && key.type !== 'String') {
6285
+ var token = this.peek();
6286
+ if (isStringToken(token)) {
6287
+ var stringNode = this.parseString();
6288
+ params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
6289
+ }
6290
+ else if (isSymbolToken(token)) {
6291
+ var value = token[1].startsWith('\'')
6292
+ ? this.stringFromQuotedSymbol(token[1])
6293
+ : token[1];
6294
+ params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
6295
+ this.advance();
6296
+ }
6297
+ else {
6173
6298
  throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
6174
6299
  }
6175
- params.push({
6176
- type: 'String',
6177
- value: key.value,
6178
- sourceCodeInfo: key.sourceCodeInfo,
6179
- });
6180
6300
  assertOperatorToken(this.peek(), ':=');
6181
6301
  this.advance();
6182
6302
  params.push(this.parseExpression());
@@ -6191,12 +6311,7 @@ var Parser = /** @class */ (function () {
6191
6311
  }
6192
6312
  assertRBraceToken(this.peek());
6193
6313
  this.advance();
6194
- return {
6195
- type: 'SpecialExpression',
6196
- name: 'object',
6197
- params: params,
6198
- sourceCodeInfo: firstToken[2],
6199
- };
6314
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
6200
6315
  };
6201
6316
  Parser.prototype.parseArray = function () {
6202
6317
  var firstToken = asLBracketToken(this.peek());
@@ -6205,11 +6320,7 @@ var Parser = /** @class */ (function () {
6205
6320
  while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
6206
6321
  if (isOperatorToken(this.peek(), '...')) {
6207
6322
  this.advance();
6208
- params.push({
6209
- type: 'Spread',
6210
- value: this.parseExpression(),
6211
- sourceCodeInfo: this.peek()[2],
6212
- });
6323
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6213
6324
  }
6214
6325
  else {
6215
6326
  params.push(this.parseExpression());
@@ -6224,15 +6335,9 @@ var Parser = /** @class */ (function () {
6224
6335
  }
6225
6336
  assertRBracketToken(this.peek());
6226
6337
  this.advance();
6227
- return {
6228
- type: 'SpecialExpression',
6229
- name: 'array',
6230
- params: params,
6231
- sourceCodeInfo: firstToken[2],
6232
- };
6338
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
6233
6339
  };
6234
6340
  Parser.prototype.parseFunctionCall = function (symbol) {
6235
- var isNamedFunction = symbol.type === 'Symbol';
6236
6341
  this.advance();
6237
6342
  var params = [];
6238
6343
  while (!this.isAtEnd() && !isRParenToken(this.peek())) {
@@ -6249,45 +6354,57 @@ var Parser = /** @class */ (function () {
6249
6354
  throw new LitsError('Expected closing parenthesis', this.peek()[2]);
6250
6355
  }
6251
6356
  this.advance();
6252
- if (isNamedFunction) {
6253
- if (specialExpressionKeys.includes(symbol.value)) {
6254
- var name_2 = symbol.value;
6255
- switch (name_2) {
6256
- case '??':
6257
- case '&&':
6258
- case 'defined?':
6259
- case '||':
6260
- case 'recur':
6261
- case 'array':
6262
- case 'object':
6263
- case 'throw': {
6264
- var node = {
6265
- type: 'SpecialExpression',
6266
- name: name_2,
6267
- params: params,
6268
- sourceCodeInfo: symbol.sourceCodeInfo,
6269
- };
6270
- assertNumberOfParams(builtin.specialExpressions[node.name].paramCount, node);
6271
- return node;
6357
+ if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
6358
+ var specialExpressionType = symbol[1];
6359
+ var type = specialExpressionType;
6360
+ switch (type) {
6361
+ case specialExpressionTypes['||']:
6362
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6363
+ case specialExpressionTypes['&&']:
6364
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6365
+ case specialExpressionTypes.recur:
6366
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6367
+ case specialExpressionTypes.array:
6368
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6369
+ case specialExpressionTypes.object:
6370
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6371
+ case specialExpressionTypes['??']: {
6372
+ if (params.length === 1) {
6373
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
6374
+ }
6375
+ if (params.length === 2) {
6376
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
6377
+ }
6378
+ throw new LitsError('Expected exactly two parameters', symbol[2]);
6379
+ }
6380
+ case specialExpressionTypes['defined?']: {
6381
+ if (params.length !== 1) {
6382
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6272
6383
  }
6273
- case 'fn':
6274
- case 'def':
6275
- case 'defn':
6276
- throw new Error("".concat(name_2, " is not allowed"));
6277
- /* v8 ignore next 2 */
6278
- default:
6279
- throw new Error("Unknown special expression: ".concat(name_2));
6384
+ var _a = __read(params, 1), param = _a[0];
6385
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6280
6386
  }
6387
+ case specialExpressionTypes.throw: {
6388
+ if (params.length !== 1) {
6389
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6390
+ }
6391
+ var _b = __read(params, 1), param = _b[0];
6392
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6393
+ }
6394
+ case specialExpressionTypes.fn:
6395
+ case specialExpressionTypes.def:
6396
+ case specialExpressionTypes.defn:
6397
+ throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
6398
+ /* v8 ignore next 2 */
6399
+ default:
6400
+ throw new Error("Unknown special expression: ".concat(type));
6281
6401
  }
6282
- return createNamedNormalExpressionNode(symbol.value, params, symbol.sourceCodeInfo);
6402
+ }
6403
+ else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
6404
+ return createNamedNormalExpressionNode(symbol, params, symbol[2]);
6283
6405
  }
6284
6406
  else {
6285
- return {
6286
- type: 'NormalExpression',
6287
- name: undefined,
6288
- params: __spreadArray([symbol], __read(params), false),
6289
- sourceCodeInfo: symbol.sourceCodeInfo,
6290
- };
6407
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
6291
6408
  }
6292
6409
  };
6293
6410
  Parser.prototype.parseLambdaFunction = function () {
@@ -6304,16 +6421,10 @@ var Parser = /** @class */ (function () {
6304
6421
  }
6305
6422
  this.advance();
6306
6423
  var body = this.parseExpression();
6307
- return {
6308
- type: 'SpecialExpression',
6309
- name: 'fn',
6310
- params: [],
6311
- function: {
6312
- arguments: functionArguments,
6313
- body: [body],
6314
- },
6315
- sourceCodeInfo: firstToken[2],
6316
- };
6424
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
6425
+ functionArguments,
6426
+ [body],
6427
+ ]]], firstToken[2]);
6317
6428
  }
6318
6429
  catch (_a) {
6319
6430
  return null;
@@ -6322,11 +6433,7 @@ var Parser = /** @class */ (function () {
6322
6433
  Parser.prototype.parseFunctionArguments = function () {
6323
6434
  var firstToken = this.peek();
6324
6435
  if (isSymbolToken(firstToken)) {
6325
- return [{
6326
- type: 'symbol',
6327
- name: this.parseSymbol().value,
6328
- sourceCodeInfo: firstToken[2],
6329
- }];
6436
+ return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
6330
6437
  }
6331
6438
  assertLParenToken(firstToken);
6332
6439
  this.advance();
@@ -6338,13 +6445,13 @@ var Parser = /** @class */ (function () {
6338
6445
  throw new LitsError('Rest argument must be last', this.peek()[2]);
6339
6446
  }
6340
6447
  var bindingTarget = this.parseBindingTarget();
6341
- if (bindingTarget.default) {
6448
+ if (bindingTarget[1][1] !== undefined) {
6342
6449
  defaults = true;
6343
6450
  }
6344
- if (bindingTarget.type === 'rest') {
6451
+ if (bindingTarget[0] === bindingTargetTypes.rest) {
6345
6452
  rest = true;
6346
6453
  }
6347
- if (defaults && !bindingTarget.default) {
6454
+ if (defaults && !bindingTarget[1][1]) {
6348
6455
  throw new LitsError('Default arguments must be last', this.peek()[2]);
6349
6456
  }
6350
6457
  functionArguments.push(bindingTarget);
@@ -6391,22 +6498,16 @@ var Parser = /** @class */ (function () {
6391
6498
  var functionArguments = [];
6392
6499
  for (var i = 1; i <= arity; i += 1) {
6393
6500
  if (i === 1 && dollar1 === 'NAKED') {
6394
- functionArguments.push({ type: 'symbol', name: '$', sourceCodeInfo: firstToken[2] });
6501
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
6395
6502
  }
6396
6503
  else {
6397
- functionArguments.push({ type: 'symbol', name: "$".concat(i), sourceCodeInfo: firstToken[2] });
6504
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
6398
6505
  }
6399
6506
  }
6400
- var node = {
6401
- type: 'SpecialExpression',
6402
- name: 'fn',
6403
- params: [],
6404
- function: {
6405
- arguments: functionArguments,
6406
- body: [exprNode],
6407
- },
6408
- sourceCodeInfo: firstToken[2],
6409
- };
6507
+ var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
6508
+ functionArguments,
6509
+ [exprNode],
6510
+ ]]], firstToken[2]);
6410
6511
  return node;
6411
6512
  };
6412
6513
  Parser.prototype.parseOptionalDefaulValue = function () {
@@ -6422,16 +6523,14 @@ var Parser = /** @class */ (function () {
6422
6523
  // Symbol
6423
6524
  if (isSymbolToken(firstToken)) {
6424
6525
  var symbol = this.parseSymbol();
6526
+ if (!isUserDefinedSymbolNode(symbol)) {
6527
+ throw new LitsError('Expected user defined symbol', firstToken[2]);
6528
+ }
6425
6529
  var defaultValue = this.parseOptionalDefaulValue();
6426
6530
  if (requireDefaultValue && !defaultValue) {
6427
6531
  throw new LitsError('Expected assignment', this.peek()[2]);
6428
6532
  }
6429
- return {
6430
- type: 'symbol',
6431
- name: symbol.value,
6432
- default: defaultValue,
6433
- sourceCodeInfo: firstToken[2],
6434
- };
6533
+ return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
6435
6534
  }
6436
6535
  // Rest
6437
6536
  if (isOperatorToken(firstToken, '...')) {
@@ -6439,15 +6538,11 @@ var Parser = /** @class */ (function () {
6439
6538
  throw new LitsError('Rest element not allowed', firstToken[2]);
6440
6539
  }
6441
6540
  this.advance();
6442
- var symbol = this.parseSymbol();
6541
+ var symbol = asUserDefinedSymbolNode(this.parseSymbol());
6443
6542
  if (isOperatorToken(this.peek(), ':=')) {
6444
6543
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6445
6544
  }
6446
- return {
6447
- type: 'rest',
6448
- name: symbol.value,
6449
- sourceCodeInfo: firstToken[2],
6450
- };
6545
+ return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
6451
6546
  }
6452
6547
  // Array
6453
6548
  if (isLBracketToken(firstToken)) {
@@ -6466,7 +6561,7 @@ var Parser = /** @class */ (function () {
6466
6561
  continue;
6467
6562
  }
6468
6563
  var target = this.parseBindingTarget();
6469
- if (target.type === 'rest') {
6564
+ if (target[0] === bindingTargetTypes.rest) {
6470
6565
  rest = true;
6471
6566
  }
6472
6567
  elements.push(target);
@@ -6482,12 +6577,7 @@ var Parser = /** @class */ (function () {
6482
6577
  if (requireDefaultValue && !defaultValue) {
6483
6578
  throw new LitsError('Expected assignment', this.peek()[2]);
6484
6579
  }
6485
- return {
6486
- type: 'array',
6487
- elements: elements,
6488
- default: defaultValue,
6489
- sourceCodeInfo: firstToken[2],
6490
- };
6580
+ return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
6491
6581
  }
6492
6582
  // Object
6493
6583
  if (isLBraceToken(firstToken)) {
@@ -6503,40 +6593,32 @@ var Parser = /** @class */ (function () {
6503
6593
  rest = true;
6504
6594
  this.advance();
6505
6595
  }
6506
- var key = this.parseSymbol().value;
6596
+ var key = asUserDefinedSymbolNode(this.parseSymbol());
6507
6597
  token = this.peek();
6508
6598
  if (isReservedSymbolToken(token, 'as')) {
6509
6599
  if (rest) {
6510
6600
  throw new LitsError('Rest argument can not have alias', token[2]);
6511
6601
  }
6512
6602
  this.advance();
6513
- var name_3 = this.parseSymbol().value;
6514
- if (elements[name_3]) {
6515
- throw new LitsError("Duplicate binding name: ".concat(name_3), token[2]);
6603
+ var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
6604
+ if (elements[name_2[1]]) {
6605
+ throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
6516
6606
  }
6517
- elements[key] = {
6518
- type: 'symbol',
6519
- name: name_3,
6520
- default: this.parseOptionalDefaulValue(),
6521
- sourceCodeInfo: firstToken[2],
6522
- };
6607
+ elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
6523
6608
  }
6524
6609
  else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
6525
- if (elements[key]) {
6610
+ if (elements[key[1]]) {
6526
6611
  throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
6527
6612
  }
6528
6613
  if (rest && isOperatorToken(this.peek(), ':=')) {
6529
6614
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6530
6615
  }
6531
- elements[key] = {
6532
- type: rest ? 'rest' : 'symbol',
6533
- name: key,
6534
- default: this.parseOptionalDefaulValue(),
6535
- sourceCodeInfo: firstToken[2],
6536
- };
6616
+ elements[key[1]] = rest
6617
+ ? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
6618
+ : withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
6537
6619
  }
6538
6620
  else if (isLBraceToken(token) || isLBracketToken(token)) {
6539
- elements[key] = this.parseBindingTarget();
6621
+ elements[key[1]] = this.parseBindingTarget();
6540
6622
  }
6541
6623
  if (!isRBraceToken(this.peek())) {
6542
6624
  assertOperatorToken(this.peek(), ',');
@@ -6550,12 +6632,7 @@ var Parser = /** @class */ (function () {
6550
6632
  if (requireDefaultValue && !defaultValue) {
6551
6633
  throw new LitsError('Expected assignment', token[2]);
6552
6634
  }
6553
- return {
6554
- type: 'object',
6555
- elements: elements,
6556
- default: defaultValue,
6557
- sourceCodeInfo: firstToken[2],
6558
- };
6635
+ return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
6559
6636
  }
6560
6637
  throw new LitsError('Expected symbol', this.peek()[2]);
6561
6638
  };
@@ -6563,22 +6640,13 @@ var Parser = /** @class */ (function () {
6563
6640
  if (optionalSemicolon === void 0) { optionalSemicolon = false; }
6564
6641
  this.advance();
6565
6642
  var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
6566
- var value = target.default;
6567
- delete target.default;
6643
+ var value = target[1][1];
6644
+ target[1][1] = undefined;
6568
6645
  if (!optionalSemicolon) {
6569
6646
  assertOperatorToken(this.peek(), ';');
6570
6647
  }
6571
- return {
6572
- type: 'SpecialExpression',
6573
- name: 'let',
6574
- bindingNode: {
6575
- type: 'Binding',
6576
- target: target,
6577
- value: value,
6578
- sourceCodeInfo: token[2],
6579
- },
6580
- sourceCodeInfo: token[2],
6581
- };
6648
+ var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
6649
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
6582
6650
  };
6583
6651
  Parser.prototype.parseDo = function (token) {
6584
6652
  this.advance();
@@ -6594,12 +6662,7 @@ var Parser = /** @class */ (function () {
6594
6662
  }
6595
6663
  assertReservedSymbolToken(this.peek(), 'end');
6596
6664
  this.advance();
6597
- return {
6598
- type: 'SpecialExpression',
6599
- name: 'do',
6600
- params: expressions,
6601
- sourceCodeInfo: token[2],
6602
- };
6665
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6603
6666
  };
6604
6667
  Parser.prototype.parseLoop = function (firstToken) {
6605
6668
  this.advance();
@@ -6609,14 +6672,9 @@ var Parser = /** @class */ (function () {
6609
6672
  assertSymbolToken(token, 'let');
6610
6673
  this.advance();
6611
6674
  var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
6612
- var value = target.default;
6613
- delete target.default;
6614
- bindingNodes.push({
6615
- type: 'Binding',
6616
- target: target,
6617
- value: value,
6618
- sourceCodeInfo: token[2],
6619
- });
6675
+ var value = target[1][1];
6676
+ target[1][1] = undefined;
6677
+ bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
6620
6678
  if (isOperatorToken(this.peek(), ',')) {
6621
6679
  this.advance();
6622
6680
  }
@@ -6639,13 +6697,7 @@ var Parser = /** @class */ (function () {
6639
6697
  }
6640
6698
  assertReservedSymbolToken(this.peek(), 'end');
6641
6699
  this.advance();
6642
- return {
6643
- type: 'SpecialExpression',
6644
- name: 'loop',
6645
- params: params,
6646
- bindingNodes: bindingNodes,
6647
- sourceCodeInfo: firstToken[2],
6648
- };
6700
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
6649
6701
  };
6650
6702
  Parser.prototype.parseTry = function (token) {
6651
6703
  this.advance();
@@ -6661,12 +6713,7 @@ var Parser = /** @class */ (function () {
6661
6713
  }
6662
6714
  var tryExpression = tryExpressions.length === 1
6663
6715
  ? tryExpressions[0]
6664
- : {
6665
- type: 'SpecialExpression',
6666
- name: 'do',
6667
- params: tryExpressions,
6668
- sourceCodeInfo: token[2],
6669
- };
6716
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
6670
6717
  assertReservedSymbolToken(this.peek(), 'catch');
6671
6718
  this.advance();
6672
6719
  var errorSymbol;
@@ -6690,20 +6737,8 @@ var Parser = /** @class */ (function () {
6690
6737
  this.advance();
6691
6738
  var catchExpression = catchExpressions.length === 1
6692
6739
  ? catchExpressions[0]
6693
- : {
6694
- type: 'SpecialExpression',
6695
- name: 'do',
6696
- params: catchExpressions,
6697
- sourceCodeInfo: token[2],
6698
- };
6699
- return {
6700
- type: 'SpecialExpression',
6701
- name: 'try',
6702
- params: [tryExpression],
6703
- ce: catchExpression,
6704
- e: errorSymbol,
6705
- sourceCodeInfo: token[2],
6706
- };
6740
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
6741
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
6707
6742
  };
6708
6743
  Parser.prototype.parseForOrDoseq = function (firstToken) {
6709
6744
  var isDoseq = firstToken[1] === 'doseq';
@@ -6711,10 +6746,10 @@ var Parser = /** @class */ (function () {
6711
6746
  var forLoopBindings = [];
6712
6747
  var _loop_1 = function () {
6713
6748
  var loopBinding = this_1.parseForLoopBinding();
6714
- var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b.b.target)); });
6715
- var newBoundNames = getAllBindingTargetNames(loopBinding.b.target);
6749
+ var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
6750
+ var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
6716
6751
  if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
6717
- throw new LitsError('Duplicate binding', loopBinding.b.sourceCodeInfo);
6752
+ throw new LitsError('Duplicate binding', loopBinding[0][2]);
6718
6753
  }
6719
6754
  forLoopBindings.push(loopBinding);
6720
6755
  };
@@ -6736,13 +6771,9 @@ var Parser = /** @class */ (function () {
6736
6771
  }
6737
6772
  assertReservedSymbolToken(this.peek(), 'end');
6738
6773
  this.advance();
6739
- return {
6740
- type: 'SpecialExpression',
6741
- name: isDoseq ? 'doseq' : 'for',
6742
- params: expressions,
6743
- sourceCodeInfo: firstToken[2],
6744
- l: forLoopBindings,
6745
- };
6774
+ return isDoseq
6775
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
6776
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
6746
6777
  };
6747
6778
  Parser.prototype.parseForLoopBinding = function () {
6748
6779
  assertReservedSymbolToken(this.peek(), 'each');
@@ -6764,18 +6795,17 @@ var Parser = /** @class */ (function () {
6764
6795
  && !isReservedSymbolToken(token, 'each')) {
6765
6796
  throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
6766
6797
  }
6767
- var letBindings;
6798
+ var letBindings = [];
6768
6799
  if (token[1] === 'let') {
6769
6800
  modifiers.push('&let');
6770
- letBindings = [];
6771
6801
  var _loop_2 = function () {
6772
6802
  var letNode = this_2.parseLet(token, true);
6773
- var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b.target)); });
6774
- var newBoundNames = Object.keys(getAllBindingTargetNames(letNode.bindingNode.target));
6803
+ var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
6804
+ var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
6775
6805
  if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
6776
- throw new LitsError('Duplicate binding', letNode.bindingNode.sourceCodeInfo);
6806
+ throw new LitsError('Duplicate binding', letNode[1][1][2]);
6777
6807
  }
6778
- letBindings.push(letNode.bindingNode);
6808
+ letBindings.push(letNode[1][1]);
6779
6809
  token = this_2.peek();
6780
6810
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
6781
6811
  throw new LitsError('Expected do, each or comma', token[2]);
@@ -6821,31 +6851,21 @@ var Parser = /** @class */ (function () {
6821
6851
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
6822
6852
  throw new LitsError('Expected do or each', token[2]);
6823
6853
  }
6824
- return {
6825
- b: bindingNode,
6826
- m: modifiers,
6827
- l: letBindings,
6828
- wn: whenNode,
6829
- we: whileNode,
6830
- };
6854
+ return [bindingNode, letBindings, whenNode, whileNode];
6831
6855
  };
6832
6856
  Parser.prototype.parseBinding = function () {
6833
6857
  var firstToken = asSymbolToken(this.peek());
6834
- var name = firstToken[1];
6835
- this.advance();
6858
+ var name = asUserDefinedSymbolNode(this.parseSymbol());
6836
6859
  assertReservedSymbolToken(this.peek(), 'in');
6837
6860
  this.advance();
6838
6861
  var value = this.parseExpression();
6839
- var node = {
6840
- type: 'Binding',
6841
- target: {
6842
- type: 'symbol',
6843
- name: name,
6844
- sourceCodeInfo: firstToken[2],
6845
- },
6846
- value: value,
6847
- sourceCodeInfo: firstToken[2],
6848
- };
6862
+ var node = withSourceCodeInfo([
6863
+ NodeTypes.Binding,
6864
+ [
6865
+ withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
6866
+ value,
6867
+ ],
6868
+ ], firstToken[2]);
6849
6869
  return node;
6850
6870
  };
6851
6871
  Parser.prototype.parseIfOrUnless = function (token) {
@@ -6868,12 +6888,7 @@ var Parser = /** @class */ (function () {
6868
6888
  }
6869
6889
  var thenExpression = thenExpressions.length === 1
6870
6890
  ? thenExpressions[0]
6871
- : {
6872
- type: 'SpecialExpression',
6873
- name: 'do',
6874
- params: thenExpressions,
6875
- sourceCodeInfo: token[2],
6876
- };
6891
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
6877
6892
  var elseExpression;
6878
6893
  if (isReservedSymbolToken(this.peek(), 'else')) {
6879
6894
  this.advance();
@@ -6889,25 +6904,13 @@ var Parser = /** @class */ (function () {
6889
6904
  }
6890
6905
  elseExpression = elseExpressions.length === 1
6891
6906
  ? elseExpressions[0]
6892
- : {
6893
- type: 'SpecialExpression',
6894
- name: 'do',
6895
- params: elseExpressions,
6896
- sourceCodeInfo: token[2],
6897
- };
6907
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
6898
6908
  }
6899
6909
  assertReservedSymbolToken(this.peek(), 'end');
6900
6910
  this.advance();
6901
- var params = [condition, thenExpression];
6902
- if (elseExpression) {
6903
- params.push(elseExpression);
6904
- }
6905
- return {
6906
- type: 'SpecialExpression',
6907
- name: isUnless ? 'unless' : 'if',
6908
- params: params,
6909
- sourceCodeInfo: token[2],
6910
- };
6911
+ return isUnless
6912
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
6913
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
6911
6914
  };
6912
6915
  Parser.prototype.parseCond = function (token) {
6913
6916
  this.advance();
@@ -6915,7 +6918,7 @@ var Parser = /** @class */ (function () {
6915
6918
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6916
6919
  assertReservedSymbolToken(this.peek(), 'case');
6917
6920
  this.advance();
6918
- params.push(this.parseExpression());
6921
+ var caseExpression = this.parseExpression();
6919
6922
  assertReservedSymbolToken(this.peek(), 'then');
6920
6923
  this.advance();
6921
6924
  var expressions = [];
@@ -6930,14 +6933,10 @@ var Parser = /** @class */ (function () {
6930
6933
  throw new LitsError('Expected ;', this.peek()[2]);
6931
6934
  }
6932
6935
  }
6933
- params.push(expressions.length === 1
6936
+ var thenExpression = expressions.length === 1
6934
6937
  ? expressions[0]
6935
- : {
6936
- type: 'SpecialExpression',
6937
- name: 'do',
6938
- params: expressions,
6939
- sourceCodeInfo: token[2],
6940
- });
6938
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6939
+ params.push([caseExpression, thenExpression]);
6941
6940
  if (isReservedSymbolToken(this.peek(), 'end')) {
6942
6941
  break;
6943
6942
  }
@@ -6945,20 +6944,16 @@ var Parser = /** @class */ (function () {
6945
6944
  }
6946
6945
  assertReservedSymbolToken(this.peek(), 'end');
6947
6946
  this.advance();
6948
- return {
6949
- type: 'SpecialExpression',
6950
- name: 'cond',
6951
- params: params,
6952
- sourceCodeInfo: token[2],
6953
- };
6947
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
6954
6948
  };
6955
6949
  Parser.prototype.parseSwitch = function (token) {
6956
6950
  this.advance();
6957
- var params = [this.parseExpression()];
6951
+ var valueExpression = this.parseExpression();
6952
+ var params = [];
6958
6953
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6959
6954
  assertReservedSymbolToken(this.peek(), 'case');
6960
6955
  this.advance();
6961
- params.push(this.parseExpression());
6956
+ var caseExpression = this.parseExpression();
6962
6957
  assertReservedSymbolToken(this.peek(), 'then');
6963
6958
  this.advance();
6964
6959
  var expressions = [];
@@ -6973,14 +6968,10 @@ var Parser = /** @class */ (function () {
6973
6968
  throw new LitsError('Expected ;', this.peek()[2]);
6974
6969
  }
6975
6970
  }
6976
- params.push(expressions.length === 1
6971
+ var thenExpression = expressions.length === 1
6977
6972
  ? expressions[0]
6978
- : {
6979
- type: 'SpecialExpression',
6980
- name: 'do',
6981
- params: expressions,
6982
- sourceCodeInfo: token[2],
6983
- });
6973
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6974
+ params.push([caseExpression, thenExpression]);
6984
6975
  if (isReservedSymbolToken(this.peek(), 'end')) {
6985
6976
  break;
6986
6977
  }
@@ -6988,12 +6979,7 @@ var Parser = /** @class */ (function () {
6988
6979
  }
6989
6980
  assertReservedSymbolToken(this.peek(), 'end');
6990
6981
  this.advance();
6991
- return {
6992
- type: 'SpecialExpression',
6993
- name: 'switch',
6994
- params: params,
6995
- sourceCodeInfo: token[2],
6996
- };
6982
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
6997
6983
  };
6998
6984
  Parser.prototype.parseFunction = function (token) {
6999
6985
  this.advance();
@@ -7012,17 +6998,10 @@ var Parser = /** @class */ (function () {
7012
6998
  assertReservedSymbolToken(this.peek(), 'end');
7013
6999
  this.advance();
7014
7000
  assertOperatorToken(this.peek(), ';');
7015
- return {
7016
- type: 'SpecialExpression',
7017
- name: 'function',
7018
- functionName: symbol,
7019
- params: [],
7020
- function: {
7021
- arguments: functionArguments,
7022
- body: body,
7023
- },
7024
- sourceCodeInfo: token[2],
7025
- };
7001
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
7002
+ functionArguments,
7003
+ body,
7004
+ ]]], token[2]);
7026
7005
  };
7027
7006
  Parser.prototype.isAtEnd = function () {
7028
7007
  return this.parseState.position >= this.tokenStream.tokens.length;
@@ -7044,7 +7023,7 @@ var Parser = /** @class */ (function () {
7044
7023
  this.advance();
7045
7024
  if (isSymbolToken(this.peek(), 'let')) {
7046
7025
  var letNode = this.parseLet(asSymbolToken(this.peek()));
7047
- return __assign(__assign({}, letNode), { name: 'def' });
7026
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.def, letNode[1][1]]], token[2]);
7048
7027
  }
7049
7028
  else if (isReservedSymbolToken(this.peek(), 'function')) {
7050
7029
  this.advance();
@@ -7062,71 +7041,57 @@ var Parser = /** @class */ (function () {
7062
7041
  }
7063
7042
  assertReservedSymbolToken(this.peek(), 'end');
7064
7043
  this.advance();
7065
- return {
7066
- type: 'SpecialExpression',
7067
- name: 'defn',
7068
- functionName: symbol,
7069
- params: [],
7070
- function: {
7071
- arguments: functionArguments,
7072
- body: body,
7073
- },
7074
- sourceCodeInfo: token[2],
7075
- };
7044
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.defn, symbol, [
7045
+ functionArguments,
7046
+ body,
7047
+ ]]], token[2]);
7076
7048
  }
7077
7049
  else {
7078
7050
  throw new LitsError('Expected let or function', this.peek()[2]);
7079
7051
  }
7080
7052
  };
7053
+ Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
7054
+ if (specialExpressionTypes[value] !== undefined) {
7055
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
7056
+ }
7057
+ if (normalExpressionTypes[value] !== undefined) {
7058
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
7059
+ }
7060
+ return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
7061
+ };
7062
+ Parser.prototype.stringFromQuotedSymbol = function (value) {
7063
+ return value.substring(1, value.length - 1)
7064
+ .replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
7065
+ if (backslash) {
7066
+ return '\\';
7067
+ }
7068
+ if (singleQuote) {
7069
+ return '\'';
7070
+ }
7071
+ return "\\".concat(normalChar);
7072
+ });
7073
+ };
7081
7074
  Parser.prototype.parseSymbol = function () {
7082
7075
  var token = this.peek();
7083
7076
  this.advance();
7084
7077
  if (!isSymbolToken(token)) {
7085
7078
  throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
7086
7079
  }
7087
- if (token[1][0] !== '\'') {
7088
- return {
7089
- type: 'Symbol',
7090
- value: token[1],
7091
- sourceCodeInfo: token[2],
7092
- };
7080
+ if (token[1][0] === '\'') {
7081
+ return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
7093
7082
  }
7094
7083
  else {
7095
- var value = token[1].substring(1, token[1].length - 1)
7096
- .replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
7097
- if (backslash) {
7098
- return '\\';
7099
- }
7100
- if (singleQuote) {
7101
- return '\'';
7102
- }
7103
- return "\\".concat(normalChar);
7104
- });
7105
- return {
7106
- type: 'Symbol',
7107
- value: value,
7108
- sourceCodeInfo: token[2],
7109
- };
7084
+ return this.stringToSymbolNode(token[1], token[2]);
7110
7085
  }
7111
7086
  };
7112
7087
  Parser.prototype.parseReservedSymbol = function () {
7113
- var token = this.peek();
7088
+ var token = asReservedSymbolToken(this.peek());
7114
7089
  this.advance();
7115
- if (isReservedSymbolToken(token)) {
7116
- var symbol = token[1];
7117
- if (isNumberReservedSymbol(symbol)) {
7118
- return {
7119
- type: 'Number',
7120
- value: numberReservedSymbolRecord[symbol],
7121
- sourceCodeInfo: token[2],
7122
- };
7123
- }
7090
+ var symbol = token[1];
7091
+ if (isNumberReservedSymbol(symbol)) {
7092
+ return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
7124
7093
  }
7125
- return {
7126
- type: 'ReservedSymbol',
7127
- value: token[1],
7128
- sourceCodeInfo: token[2],
7129
- };
7094
+ return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
7130
7095
  };
7131
7096
  Parser.prototype.parseNumber = function () {
7132
7097
  var token = this.peek();
@@ -7134,11 +7099,7 @@ var Parser = /** @class */ (function () {
7134
7099
  var value = token[1];
7135
7100
  var negative = value[0] === '-';
7136
7101
  var numberString = (negative ? value.substring(1) : value).replace(/_/g, '');
7137
- return {
7138
- type: 'Number',
7139
- value: negative ? -Number(numberString) : Number(numberString),
7140
- sourceCodeInfo: token[2],
7141
- };
7102
+ return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
7142
7103
  };
7143
7104
  Parser.prototype.parseString = function () {
7144
7105
  var token = this.peek();
@@ -7170,11 +7131,7 @@ var Parser = /** @class */ (function () {
7170
7131
  }
7171
7132
  return normalChar;
7172
7133
  });
7173
- return {
7174
- type: 'String',
7175
- value: value,
7176
- sourceCodeInfo: token[2],
7177
- };
7134
+ return withSourceCodeInfo([NodeTypes.String, value], token[2]);
7178
7135
  };
7179
7136
  Parser.prototype.parseRegexpShorthand = function () {
7180
7137
  var token = this.peek();
@@ -7182,22 +7139,15 @@ var Parser = /** @class */ (function () {
7182
7139
  var endStringPosition = token[1].lastIndexOf('"');
7183
7140
  var regexpString = token[1].substring(2, endStringPosition);
7184
7141
  var optionsString = token[1].substring(endStringPosition + 1);
7185
- var stringNode = {
7186
- type: 'String',
7187
- value: regexpString,
7188
- sourceCodeInfo: token[2],
7189
- };
7190
- var optionsNode = {
7191
- type: 'String',
7192
- value: optionsString,
7193
- sourceCodeInfo: token[2],
7194
- };
7195
- var node = {
7196
- type: 'NormalExpression',
7197
- name: 'regexp',
7198
- params: [stringNode, optionsNode],
7199
- sourceCodeInfo: token[2],
7200
- };
7142
+ var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
7143
+ var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
7144
+ var node = withSourceCodeInfo([
7145
+ NodeTypes.NormalExpression,
7146
+ [
7147
+ withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
7148
+ [stringNode, optionsNode],
7149
+ ],
7150
+ ], token[2]);
7201
7151
  return node;
7202
7152
  };
7203
7153
  return Parser;
@@ -7314,7 +7264,7 @@ var Lits = /** @class */ (function () {
7314
7264
  if (params === void 0) { params = {}; }
7315
7265
  var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
7316
7266
  var contextStack = createContextStack(params);
7317
- return getUndefinedSymbols(ast, contextStack, builtin, evaluateAstNode);
7267
+ return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
7318
7268
  };
7319
7269
  Lits.prototype.tokenize = function (program, tokenizeParams) {
7320
7270
  if (tokenizeParams === void 0) { tokenizeParams = {}; }
@@ -13216,8 +13166,7 @@ Object.entries(specialExpressionsReference).forEach(function (_a) {
13216
13166
  var _b;
13217
13167
  var _c = __read(_a, 2), key = _c[0], obj = _c[1];
13218
13168
  if (isFunctionReference(obj)) {
13219
- var specialExpressions = builtin.specialExpressions;
13220
- var paramCount = (_b = specialExpressions[key]) === null || _b === void 0 ? void 0 : _b.paramCount;
13169
+ var paramCount = (_b = specialExpressions[specialExpressionTypes[key]]) === null || _b === void 0 ? void 0 : _b.paramCount;
13221
13170
  if (paramCount && canBeOperator(paramCount)) {
13222
13171
  obj._isOperator = true;
13223
13172
  }