@mojir/lits 2.1.0 → 2.1.2

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