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