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