@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
@@ -179,23 +179,50 @@ var UndefinedSymbolError = /** @class */ (function (_super) {
179
179
  return UndefinedSymbolError;
180
180
  }(LitsError));
181
181
 
182
- var astNodeTypeNames = [
183
- 'Number',
184
- 'String',
185
- 'NormalExpression',
186
- 'SpecialExpression',
187
- 'Symbol',
188
- 'Modifier',
189
- 'ReservedSymbol',
190
- 'Binding',
191
- 'Argument',
192
- 'Partial',
193
- 'Comment',
194
- 'Spread',
195
- ];
196
- var astNodeTypeSet = new Set(astNodeTypeNames);
197
- function isAstNodeType(type) {
198
- return typeof type === 'string' && astNodeTypeSet.has(type);
182
+ var specialExpressionTypes = {
183
+ '??': 0,
184
+ '&&': 1,
185
+ '||': 2,
186
+ 'array': 3,
187
+ 'cond': 4,
188
+ '0_def': 5,
189
+ 'defined?': 6,
190
+ '0_defn': 7,
191
+ 'do': 8,
192
+ 'doseq': 9,
193
+ '0_fn': 10,
194
+ 'for': 11,
195
+ 'function': 12,
196
+ 'if': 13,
197
+ 'let': 14,
198
+ 'loop': 15,
199
+ 'object': 16,
200
+ 'recur': 17,
201
+ 'switch': 18,
202
+ 'throw': 19,
203
+ 'try': 20,
204
+ 'unless': 21,
205
+ };
206
+
207
+ var NodeTypes = {
208
+ Number: 1,
209
+ String: 2,
210
+ NormalExpression: 3,
211
+ SpecialExpression: 4,
212
+ UserDefinedSymbol: 5,
213
+ NormalBuiltinSymbol: 6,
214
+ SpecialBuiltinSymbol: 7,
215
+ ReservedSymbol: 8,
216
+ Binding: 9,
217
+ Spread: 10,
218
+ };
219
+ var NodeTypesSet = new Set(Object.values(NodeTypes));
220
+ function getNodeTypeName(type) {
221
+ return Object.keys(NodeTypes).find(function (key) { return NodeTypes[key] === type; });
222
+ }
223
+ // TODO, is this needed?
224
+ function isNodeType(type) {
225
+ return typeof type === 'number' && NodeTypesSet.has(type);
199
226
  }
200
227
  var functionTypes = [
201
228
  'UserDefined',
@@ -223,17 +250,17 @@ function isLitsFunction$1(func) {
223
250
  return false;
224
251
  return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType);
225
252
  }
226
- function isAstNode$1(value) {
227
- if (value === null || typeof value !== 'object')
253
+ function isNode(value) {
254
+ if (!Array.isArray(value) || value.length < 2)
228
255
  return false;
229
- return 'type' in value && isAstNodeType(value.type);
256
+ return isNodeType(value[0]);
230
257
  }
231
258
  function valueToString(value) {
232
259
  if (isLitsFunction$1(value))
233
260
  // eslint-disable-next-line ts/no-unsafe-member-access
234
261
  return "<function ".concat(value.name || '\u03BB', ">");
235
- if (isAstNode$1(value))
236
- return "".concat(value.type, "-node");
262
+ if (isNode(value))
263
+ return "".concat(getNodeTypeName(value[0]), "-node");
237
264
  if (value === null)
238
265
  return 'null';
239
266
  if (typeof value === 'object' && value instanceof RegExp)
@@ -249,138 +276,137 @@ function getSourceCodeInfo(anyValue, sourceCodeInfo) {
249
276
  return (_a = anyValue === null || anyValue === void 0 ? void 0 : anyValue.sourceCodeInfo) !== null && _a !== void 0 ? _a : sourceCodeInfo;
250
277
  }
251
278
 
252
- function assertNumberOfParams(count, node) {
253
- assertCount({
254
- count: count,
255
- length: node.params.length,
256
- name: node.name,
257
- sourceCodeInfo: node.sourceCodeInfo,
258
- });
279
+ function getAssertionError(typeName, value, sourceCodeInfo) {
280
+ return new LitsError("Expected ".concat(typeName, ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
259
281
  }
260
- function isNonUndefined(value) {
261
- return value !== undefined;
282
+
283
+ function isSymbolNode(node) {
284
+ var nodeType = node[0];
285
+ return NodeTypes.UserDefinedSymbol === nodeType
286
+ || NodeTypes.NormalBuiltinSymbol === nodeType
287
+ || NodeTypes.SpecialBuiltinSymbol === nodeType;
262
288
  }
263
- function asNonUndefined(value, sourceCodeInfo) {
264
- assertNonUndefined(value, sourceCodeInfo);
265
- return value;
289
+ function assertSymbolNode(node, sourceCodeInfo) {
290
+ if (!isSymbolNode(node))
291
+ throw getAssertionError('SymbolNode', node, sourceCodeInfo);
266
292
  }
267
- function assertNonUndefined(value, sourceCodeInfo) {
268
- if (!isNonUndefined(value))
269
- throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
293
+ function isUserDefinedSymbolNode(node) {
294
+ return NodeTypes.UserDefinedSymbol === node[0];
270
295
  }
271
- function isUnknownRecord(value) {
272
- return value !== null && typeof value === 'object' && !Array.isArray(value);
296
+ function asUserDefinedSymbolNode(node, sourceCodeInfo) {
297
+ assertUserDefinedSymbolNode(node, sourceCodeInfo);
298
+ return node;
273
299
  }
274
- function assertUnknownRecord(value, sourceCodeInfo) {
275
- if (!isUnknownRecord(value)) {
276
- throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
277
- }
300
+ function assertUserDefinedSymbolNode(node, sourceCodeInfo) {
301
+ if (!isUserDefinedSymbolNode(node))
302
+ throw getAssertionError('UserDefinedSymbolNode', node, sourceCodeInfo);
278
303
  }
279
- function assertCount(_a) {
280
- var count = _a.count, length = _a.length, name = _a.name, sourceCodeInfo = _a.sourceCodeInfo;
281
- if (typeof count === 'number') {
282
- if (length !== count) {
283
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
284
- }
285
- }
286
- else {
287
- var min = count.min, max = count.max, even = count.even, odd = count.odd;
288
- if (even) {
289
- if (length % 2 !== 0) {
290
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an even number, got ").concat(valueToString(length), "."), sourceCodeInfo);
291
- }
292
- }
293
- if (odd) {
294
- if (length % 2 !== 1) {
295
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an odd number, got ").concat(valueToString(length), "."), sourceCodeInfo);
296
- }
297
- }
298
- if (typeof min === 'number' && length < min) {
299
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
300
- }
301
- if (typeof max === 'number' && length > max) {
302
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
303
- }
304
+ function isNormalBuiltinSymbolNode(node) {
305
+ return NodeTypes.NormalBuiltinSymbol === node[0];
306
+ }
307
+ function isSpecialBuiltinSymbolNode(node) {
308
+ return NodeTypes.SpecialBuiltinSymbol === node[0];
309
+ }
310
+ function isNormalExpressionNode(node) {
311
+ return node[0] === NodeTypes.NormalExpression;
312
+ }
313
+ function isNormalExpressionNodeWithName(node) {
314
+ if (!isNormalExpressionNode(node)) {
315
+ return false;
304
316
  }
317
+ return isSymbolNode(node[1][0]);
318
+ }
319
+ function isSpreadNode(node) {
320
+ return node[0] === NodeTypes.Spread;
305
321
  }
306
322
 
307
- var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateAstNode) {
323
+ var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
308
324
  var e_1, _a;
309
325
  var _b;
310
- var astNodes = Array.isArray(ast)
326
+ var nodes = Array.isArray(ast)
311
327
  ? ast
312
- : [{
313
- type: 'SpecialExpression',
314
- name: 'do',
315
- params: ast.body,
316
- sourceCodeInfo: undefined,
317
- }];
328
+ : [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
318
329
  var unresolvedSymbols = new Set();
319
330
  try {
320
- for (var astNodes_1 = __values(astNodes), astNodes_1_1 = astNodes_1.next(); !astNodes_1_1.done; astNodes_1_1 = astNodes_1.next()) {
321
- var subNode = astNodes_1_1.value;
322
- (_b = findUnresolvedSymbolsInAstNode(subNode, contextStack, builtin, evaluateAstNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
331
+ for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
332
+ var subNode = nodes_1_1.value;
333
+ (_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
323
334
  }
324
335
  }
325
336
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
326
337
  finally {
327
338
  try {
328
- if (astNodes_1_1 && !astNodes_1_1.done && (_a = astNodes_1.return)) _a.call(astNodes_1);
339
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
329
340
  }
330
341
  finally { if (e_1) throw e_1.error; }
331
342
  }
332
343
  return unresolvedSymbols;
333
344
  };
334
- function findUnresolvedSymbolsInAstNode(astNode, contextStack, builtin, evaluateAstNode) {
345
+ function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
335
346
  var e_2, _a;
336
- var _b;
337
- switch (astNode.type) {
338
- case 'Symbol': {
339
- var lookUpResult = contextStack.lookUp(astNode);
347
+ var _b, _c;
348
+ var nodeType = node[0];
349
+ switch (nodeType) {
350
+ case NodeTypes.UserDefinedSymbol: {
351
+ var symbolNode = node;
352
+ var lookUpResult = contextStack.lookUp(symbolNode);
340
353
  if (lookUpResult === null)
341
- return new Set([astNode.value]);
354
+ return new Set([symbolNode[1]]);
342
355
  return null;
343
356
  }
344
- case 'String':
345
- case 'Number':
346
- case 'Modifier':
347
- case 'ReservedSymbol':
348
- case 'Comment':
357
+ case NodeTypes.NormalBuiltinSymbol:
358
+ case NodeTypes.SpecialBuiltinSymbol:
359
+ case NodeTypes.String:
360
+ case NodeTypes.Number:
361
+ case NodeTypes.ReservedSymbol:
362
+ case NodeTypes.Binding:
349
363
  return null;
350
- case 'NormalExpression': {
364
+ case NodeTypes.NormalExpression: {
365
+ var normalExpressionNode = node;
351
366
  var unresolvedSymbols_1 = new Set();
352
- var name_1 = astNode.name, sourceCodeInfo = astNode.sourceCodeInfo;
353
- if (typeof name_1 === 'string') {
354
- var lookUpResult = contextStack.lookUp({ type: 'Symbol', value: name_1, sourceCodeInfo: sourceCodeInfo });
355
- if (lookUpResult === null)
356
- unresolvedSymbols_1.add(name_1);
367
+ if (isNormalExpressionNodeWithName(normalExpressionNode)) {
368
+ var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
369
+ if (isUserDefinedSymbolNode(symbolNode)) {
370
+ var lookUpResult = contextStack.lookUp(symbolNode);
371
+ if (lookUpResult === null)
372
+ unresolvedSymbols_1.add(symbolNode[1]);
373
+ }
374
+ }
375
+ else {
376
+ var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
377
+ (_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
357
378
  }
358
379
  try {
359
- for (var _c = __values(astNode.params), _d = _c.next(); !_d.done; _d = _c.next()) {
360
- var subNode = _d.value;
361
- (_b = findUnresolvedSymbolsInAstNode(subNode, contextStack, builtin, evaluateAstNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
380
+ for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
381
+ var subNode = _j.value;
382
+ (_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
362
383
  }
363
384
  }
364
385
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
365
386
  finally {
366
387
  try {
367
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
388
+ if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
368
389
  }
369
390
  finally { if (e_2) throw e_2.error; }
370
391
  }
371
392
  return unresolvedSymbols_1;
372
393
  }
373
- case 'SpecialExpression': {
374
- var specialExpression = asNonUndefined(builtin.specialExpressions[astNode.name], astNode.sourceCodeInfo);
375
- // eslint-disable-next-line ts/no-unsafe-argument
376
- return specialExpression.getUndefinedSymbols(astNode, contextStack, {
394
+ case NodeTypes.SpecialExpression: {
395
+ var specialExpressionNode = node;
396
+ var specialExpressionType = specialExpressionNode[1][0];
397
+ var specialExpression = builtin.specialExpressions[specialExpressionType];
398
+ var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
399
+ return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
377
400
  getUndefinedSymbols: getUndefinedSymbols,
378
401
  builtin: builtin,
379
- evaluateAstNode: evaluateAstNode,
402
+ evaluateNode: evaluateNode,
380
403
  });
381
404
  }
382
- case 'Spread':
383
- return findUnresolvedSymbolsInAstNode(astNode.value, contextStack, builtin, evaluateAstNode);
405
+ case NodeTypes.Spread:
406
+ return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
407
+ /* v8 ignore next 2 */
408
+ default:
409
+ throw new Error("Unhandled node type: ".concat(nodeType));
384
410
  }
385
411
  }
386
412
 
@@ -586,8 +612,56 @@ var bitwiseNormalExpression = {
586
612
  },
587
613
  };
588
614
 
589
- function getAssertionError(typeName, value, sourceCodeInfo) {
590
- return new LitsError("Expected ".concat(typeName, ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
615
+ function assertNumberOfParams(count, node) {
616
+ var length = node[1][1].length;
617
+ if (typeof count === 'number') {
618
+ if (length !== count) {
619
+ var name_1 = getNodeTypeName(node[0]);
620
+ throw new LitsError("Wrong number of arguments to \"".concat(name_1, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), node[2]);
621
+ }
622
+ }
623
+ else {
624
+ var min = count.min, max = count.max, even = count.even, odd = count.odd;
625
+ if (even) {
626
+ var name_2 = getNodeTypeName(node[0]);
627
+ if (length % 2 !== 0) {
628
+ throw new LitsError("Wrong number of arguments to \"".concat(name_2, "\",, expected an even number, got ").concat(valueToString(length), "."), node[2]);
629
+ }
630
+ }
631
+ if (odd) {
632
+ if (length % 2 !== 1) {
633
+ var name_3 = getNodeTypeName(node[0]);
634
+ throw new LitsError("Wrong number of arguments to \"".concat(name_3, "\",, expected an odd number, got ").concat(valueToString(length), "."), node[2]);
635
+ }
636
+ }
637
+ if (typeof min === 'number' && length < min) {
638
+ var name_4 = getNodeTypeName(node[0]);
639
+ throw new LitsError("Wrong number of arguments to \"".concat(name_4, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), node[2]);
640
+ }
641
+ if (typeof max === 'number' && length > max) {
642
+ var name_5 = getNodeTypeName(node[0]);
643
+ throw new LitsError("Wrong number of arguments to \"".concat(name_5, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), node[2]);
644
+ }
645
+ }
646
+ }
647
+ function isNonUndefined(value) {
648
+ return value !== undefined;
649
+ }
650
+ function asNonUndefined(value, sourceCodeInfo) {
651
+ assertNonUndefined(value, sourceCodeInfo);
652
+ return value;
653
+ }
654
+ function assertNonUndefined(value, sourceCodeInfo) {
655
+ if (!isNonUndefined(value))
656
+ throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
657
+ }
658
+ function isUnknownRecord(value) {
659
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
660
+ }
661
+ function assertUnknownRecord(value, sourceCodeInfo) {
662
+ if (!isUnknownRecord(value)) {
663
+ throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
664
+ }
591
665
  }
592
666
 
593
667
  function isLitsFunction(value) {
@@ -599,9 +673,6 @@ function assertLitsFunction(value, sourceCodeInfo) {
599
673
  if (!isLitsFunction(value))
600
674
  throw getAssertionError('LitsFunction', value, sourceCodeInfo);
601
675
  }
602
- function isBuiltinFunction(value) {
603
- return isUnknownRecord(value) && value.functionType === 'Builtin';
604
- }
605
676
 
606
677
  function isAny(value) {
607
678
  // TODO weak test
@@ -772,12 +843,6 @@ function clone(value) {
772
843
  function cloneColl(value) {
773
844
  return clone(value);
774
845
  }
775
- function arrayToPairs(arr) {
776
- var pairs = [];
777
- for (var i = 0; i < arr.length; i += 2)
778
- pairs.push([arr[i], arr[i + 1]]);
779
- return pairs;
780
- }
781
846
  function joinSets() {
782
847
  var e_1, _a;
783
848
  var results = [];
@@ -3675,17 +3740,24 @@ Object.values(expressions).forEach(function (normalExpression) {
3675
3740
  });
3676
3741
  });
3677
3742
  var normalExpressions = __assign(__assign({}, expressions), aliases);
3743
+ var normalExpressionTypes = {};
3744
+ var allNormalExpressions = [];
3745
+ Object.entries(normalExpressions).forEach(function (_a, index) {
3746
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
3747
+ normalExpressionTypes[key] = index;
3748
+ allNormalExpressions.push(value);
3749
+ });
3678
3750
 
3679
3751
  var andSpecialExpression = {
3680
3752
  paramCount: {},
3681
3753
  evaluate: function (node, contextStack, _a) {
3682
3754
  var e_1, _b;
3683
- var evaluateAstNode = _a.evaluateAstNode;
3755
+ var evaluateNode = _a.evaluateNode;
3684
3756
  var value = true;
3685
3757
  try {
3686
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
3758
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3687
3759
  var param = _d.value;
3688
- value = evaluateAstNode(param, contextStack);
3760
+ value = evaluateNode(param, contextStack);
3689
3761
  if (!value)
3690
3762
  break;
3691
3763
  }
@@ -3700,8 +3772,8 @@ var andSpecialExpression = {
3700
3772
  return value;
3701
3773
  },
3702
3774
  getUndefinedSymbols: function (node, contextStack, _a) {
3703
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3704
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3775
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3776
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
3705
3777
  },
3706
3778
  };
3707
3779
 
@@ -3709,28 +3781,29 @@ var condSpecialExpression = {
3709
3781
  paramCount: { even: true },
3710
3782
  evaluate: function (node, contextStack, _a) {
3711
3783
  var e_1, _b;
3712
- var evaluateAstNode = _a.evaluateAstNode;
3784
+ var evaluateNode = _a.evaluateNode;
3785
+ var params = node[1][1];
3713
3786
  try {
3714
- for (var _c = __values(arrayToPairs(node.params)), _d = _c.next(); !_d.done; _d = _c.next()) {
3715
- var _e = __read(_d.value, 2), test = _e[0], form = _e[1];
3716
- var value = evaluateAstNode(test, contextStack);
3787
+ for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
3788
+ var _c = __read(params_1_1.value, 2), test = _c[0], form = _c[1];
3789
+ var value = evaluateNode(test, contextStack);
3717
3790
  if (!value)
3718
3791
  continue;
3719
- return evaluateAstNode(form, contextStack);
3792
+ return evaluateNode(form, contextStack);
3720
3793
  }
3721
3794
  }
3722
3795
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3723
3796
  finally {
3724
3797
  try {
3725
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3798
+ if (params_1_1 && !params_1_1.done && (_b = params_1.return)) _b.call(params_1);
3726
3799
  }
3727
3800
  finally { if (e_1) throw e_1.error; }
3728
3801
  }
3729
3802
  return null;
3730
3803
  },
3731
3804
  getUndefinedSymbols: function (node, contextStack, _a) {
3732
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3733
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3805
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3806
+ return getUndefinedSymbols(node[1][1].flat(), contextStack, builtin, evaluateNode);
3734
3807
  },
3735
3808
  };
3736
3809
 
@@ -3738,66 +3811,101 @@ var switchSpecialExpression = {
3738
3811
  paramCount: { odd: true },
3739
3812
  evaluate: function (node, contextStack, _a) {
3740
3813
  var e_1, _b;
3741
- var evaluateAstNode = _a.evaluateAstNode;
3742
- var switchValue = evaluateAstNode(node.params[0], contextStack);
3814
+ var evaluateNode = _a.evaluateNode;
3815
+ var _c = __read(node[1], 3), switchValueNode = _c[1], cases = _c[2];
3816
+ var switchValue = evaluateNode(switchValueNode, contextStack);
3743
3817
  try {
3744
- for (var _c = __values(arrayToPairs(node.params.slice(1))), _d = _c.next(); !_d.done; _d = _c.next()) {
3745
- var _e = __read(_d.value, 2), test = _e[0], form = _e[1];
3746
- var value = evaluateAstNode(test, contextStack);
3818
+ for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
3819
+ var _d = __read(cases_1_1.value, 2), test = _d[0], form = _d[1];
3820
+ var value = evaluateNode(test, contextStack);
3747
3821
  if (value === switchValue) {
3748
- return evaluateAstNode(form, contextStack);
3822
+ return evaluateNode(form, contextStack);
3749
3823
  }
3750
3824
  }
3751
3825
  }
3752
3826
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3753
3827
  finally {
3754
3828
  try {
3755
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3829
+ if (cases_1_1 && !cases_1_1.done && (_b = cases_1.return)) _b.call(cases_1);
3756
3830
  }
3757
3831
  finally { if (e_1) throw e_1.error; }
3758
3832
  }
3759
3833
  return null;
3760
3834
  },
3761
3835
  getUndefinedSymbols: function (node, contextStack, _a) {
3762
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3763
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3836
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3837
+ return getUndefinedSymbols(__spreadArray([node[1][1]], __read(node[1][2].flat()), false), contextStack, builtin, evaluateNode);
3764
3838
  },
3765
3839
  };
3766
3840
 
3767
- var declaredSpecialExpression = {
3841
+ var definedSpecialExpression = {
3768
3842
  paramCount: 1,
3769
3843
  evaluate: function (node, contextStack) {
3770
- var lookUpResult = contextStack.lookUp(node.params[0]);
3844
+ var symbolNode = node[1][1];
3845
+ assertSymbolNode(symbolNode);
3846
+ if (!isUserDefinedSymbolNode(symbolNode)) {
3847
+ return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
3848
+ }
3849
+ var lookUpResult = contextStack.lookUp(symbolNode);
3771
3850
  return lookUpResult !== null;
3772
3851
  },
3773
3852
  getUndefinedSymbols: function (node, contextStack, _a) {
3774
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3775
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3853
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3854
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
3776
3855
  },
3777
3856
  };
3778
3857
 
3779
- function evalueateBindingNodeValues(input, value, evaluate) {
3780
- var target = 'target' in input ? input.target : input;
3781
- var sourceCodeInfo = input.sourceCodeInfo;
3858
+ var bindingTargetTypes = {
3859
+ symbol: 11,
3860
+ rest: 12,
3861
+ object: 13,
3862
+ array: 14,
3863
+ };
3864
+
3865
+ function walkDefaults(bindingTarget, onDefault) {
3866
+ var _a;
3867
+ if (bindingTarget[0] === bindingTargetTypes.object) {
3868
+ Object.values(bindingTarget[1][0]).forEach(function (element) {
3869
+ if (element[1][1]) {
3870
+ onDefault(element[1][1]);
3871
+ }
3872
+ walkDefaults(element, onDefault);
3873
+ });
3874
+ }
3875
+ else if (bindingTarget[0] === bindingTargetTypes.array) {
3876
+ for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
3877
+ var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
3878
+ if (element === null) {
3879
+ continue;
3880
+ }
3881
+ if (element[1][1]) {
3882
+ onDefault(element[1][1]);
3883
+ }
3884
+ walkDefaults(element, onDefault);
3885
+ }
3886
+ }
3887
+ }
3888
+ function evalueateBindingNodeValues(target, value, evaluate) {
3889
+ var sourceCodeInfo = target[2];
3782
3890
  var record = {};
3783
3891
  createRecord(target, value, evaluate, sourceCodeInfo, record);
3784
3892
  return record;
3785
3893
  }
3786
3894
  function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3787
3895
  var _a, _b;
3788
- if (bindingTarget.type === 'object') {
3896
+ if (bindingTarget[0] === bindingTargetTypes.object) {
3789
3897
  assertUnknownRecord(value, sourceCodeInfo);
3790
3898
  var capturedKeys_1 = new Set();
3791
3899
  var restElement_1;
3792
- Object.entries(bindingTarget.elements).forEach(function (_a) {
3900
+ Object.entries(bindingTarget[1][0]).forEach(function (_a) {
3793
3901
  var _b;
3794
3902
  var _c = __read(_a, 2), key = _c[0], element = _c[1];
3795
- if (element.type === 'rest') {
3903
+ if (element[0] === bindingTargetTypes.rest) {
3796
3904
  restElement_1 = element;
3797
3905
  return;
3798
3906
  }
3799
3907
  capturedKeys_1.add(key);
3800
- var val = (_b = (value[key] !== undefined ? value[key] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3908
+ var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3801
3909
  assertAny(val, sourceCodeInfo);
3802
3910
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3803
3911
  });
@@ -3812,33 +3920,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3812
3920
  acc[key] = asAny(val);
3813
3921
  return acc;
3814
3922
  }, {});
3815
- record[restElement_1.name] = restValues;
3923
+ record[restElement_1[1][0]] = restValues;
3816
3924
  }
3817
3925
  }
3818
- else if (bindingTarget.type === 'array') {
3926
+ else if (bindingTarget[0] === bindingTargetTypes.array) {
3819
3927
  var restIndex = null;
3820
3928
  assertArray(value, sourceCodeInfo);
3821
- for (var index = 0; index < bindingTarget.elements.length; index += 1) {
3822
- var element = (_a = bindingTarget.elements[index]) !== null && _a !== void 0 ? _a : null;
3929
+ for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
3930
+ var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
3823
3931
  if (element === null) {
3824
3932
  continue;
3825
3933
  }
3826
- if (element.type === 'rest') {
3934
+ if (element[0] === bindingTargetTypes.rest) {
3827
3935
  restIndex = index;
3828
3936
  break;
3829
3937
  }
3830
- var val = (_b = (value[index] !== undefined ? value[index] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3938
+ var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3831
3939
  assertAny(val, sourceCodeInfo);
3832
3940
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3833
3941
  }
3834
3942
  if (restIndex !== null) {
3835
3943
  var restValues = value.slice(restIndex);
3836
- var restElement = bindingTarget.elements[restIndex];
3837
- record[restElement.name] = restValues;
3944
+ var restElement = bindingTarget[1][0][restIndex];
3945
+ record[restElement[1][0]] = restValues;
3838
3946
  }
3839
3947
  }
3948
+ else if (bindingTarget[0] === bindingTargetTypes.rest) {
3949
+ record[bindingTarget[1][0]] = asAny(value);
3950
+ }
3840
3951
  else {
3841
- record[bindingTarget.name] = asAny(value);
3952
+ record[bindingTarget[1][0][1]] = asAny(value);
3842
3953
  }
3843
3954
  }
3844
3955
  function getAllBindingTargetNames(bindingTarget) {
@@ -3851,9 +3962,9 @@ function getNamesFromBindingTarget(target, names) {
3851
3962
  if (target === null) {
3852
3963
  return;
3853
3964
  }
3854
- if (target.type === 'array') {
3965
+ if (target[0] === bindingTargetTypes.array) {
3855
3966
  try {
3856
- for (var _c = __values(target.elements), _d = _c.next(); !_d.done; _d = _c.next()) {
3967
+ for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
3857
3968
  var element = _d.value;
3858
3969
  getNamesFromBindingTarget(element, names);
3859
3970
  }
@@ -3866,9 +3977,9 @@ function getNamesFromBindingTarget(target, names) {
3866
3977
  finally { if (e_1) throw e_1.error; }
3867
3978
  }
3868
3979
  }
3869
- else if (target.type === 'object') {
3980
+ else if (target[0] === bindingTargetTypes.object) {
3870
3981
  try {
3871
- for (var _e = __values(Object.values(target.elements)), _f = _e.next(); !_f.done; _f = _e.next()) {
3982
+ for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
3872
3983
  var element = _f.value;
3873
3984
  getNamesFromBindingTarget(element, names);
3874
3985
  }
@@ -3881,27 +3992,42 @@ function getNamesFromBindingTarget(target, names) {
3881
3992
  finally { if (e_2) throw e_2.error; }
3882
3993
  }
3883
3994
  }
3995
+ else if (target[0] === bindingTargetTypes.rest) {
3996
+ if (names[target[1][0]]) {
3997
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
3998
+ }
3999
+ names[target[1][0]] = true;
4000
+ }
3884
4001
  else {
3885
- if (names[target.name]) {
3886
- throw new LitsError("Duplicate binding name: ".concat(target.name), target.sourceCodeInfo);
4002
+ if (names[target[1][0][1]]) {
4003
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
3887
4004
  }
3888
- names[target.name] = true;
4005
+ names[target[1][0][1]] = true;
3889
4006
  }
3890
4007
  }
3891
4008
 
3892
4009
  var defSpecialExpression = {
3893
4010
  paramCount: 2,
3894
4011
  evaluate: function (node, contextStack, _a) {
3895
- var evaluateAstNode = _a.evaluateAstNode;
3896
- var bindingValue = evaluateAstNode(node.bindingNode.value, contextStack);
3897
- var values = evalueateBindingNodeValues(node.bindingNode, bindingValue, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4012
+ var evaluateNode = _a.evaluateNode;
4013
+ var bindingNode = node[1][1];
4014
+ var target = bindingNode[1][0];
4015
+ var value = bindingNode[1][1];
4016
+ var bindingValue = evaluateNode(value, contextStack);
4017
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
3898
4018
  contextStack.exportValues(values);
3899
4019
  return null;
3900
4020
  },
3901
4021
  getUndefinedSymbols: function (node, contextStack, _a) {
3902
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3903
- var bindingResult = getUndefinedSymbols([node.bindingNode.value], contextStack, builtin, evaluateAstNode);
3904
- contextStack.addValues(getAllBindingTargetNames(node.bindingNode.target));
4022
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4023
+ var bindingNode = node[1][1];
4024
+ var target = bindingNode[1][0];
4025
+ var value = bindingNode[1][1];
4026
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
4027
+ walkDefaults(target, function (defaultNode) {
4028
+ addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
4029
+ });
4030
+ contextStack.addValues(getAllBindingTargetNames(target));
3905
4031
  return bindingResult;
3906
4032
  },
3907
4033
  };
@@ -3910,14 +4036,14 @@ var doSpecialExpression = {
3910
4036
  paramCount: {},
3911
4037
  evaluate: function (node, contextStack, _a) {
3912
4038
  var e_1, _b;
3913
- var evaluateAstNode = _a.evaluateAstNode;
4039
+ var evaluateNode = _a.evaluateNode;
3914
4040
  var newContext = {};
3915
4041
  var newContextStack = contextStack.create(newContext);
3916
4042
  var result = null;
3917
4043
  try {
3918
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4044
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3919
4045
  var form = _d.value;
3920
- result = evaluateAstNode(form, newContextStack);
4046
+ result = evaluateNode(form, newContextStack);
3921
4047
  }
3922
4048
  }
3923
4049
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -3930,8 +4056,8 @@ var doSpecialExpression = {
3930
4056
  return result;
3931
4057
  },
3932
4058
  getUndefinedSymbols: function (node, contextStack, _a) {
3933
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3934
- return getUndefinedSymbols(node.params, contextStack.create({}), builtin, evaluateAstNode);
4059
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4060
+ return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
3935
4061
  },
3936
4062
  };
3937
4063
 
@@ -3992,7 +4118,8 @@ function isNumberReservedSymbol(symbol) {
3992
4118
  function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
3993
4119
  if (typeof name !== 'string')
3994
4120
  return;
3995
- if (builtin.specialExpressions[name])
4121
+ // TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
4122
+ if (specialExpressionTypes[name])
3996
4123
  throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
3997
4124
  if (builtin.normalExpressions[name])
3998
4125
  throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
@@ -4006,63 +4133,69 @@ var functionSpecialExpression = {
4006
4133
  paramCount: {},
4007
4134
  evaluate: function (node, contextStack, _a) {
4008
4135
  var _b, _c;
4009
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4010
- var name = node.functionName.value;
4011
- assertNameNotDefined(name, contextStack, builtin, node.sourceCodeInfo);
4012
- var evaluatedFunction = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4136
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4137
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4138
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4139
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4140
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4013
4141
  var litsFunction = (_b = {},
4014
4142
  _b[FUNCTION_SYMBOL] = true,
4015
- _b.sourceCodeInfo = node.sourceCodeInfo,
4143
+ _b.sourceCodeInfo = node[2],
4016
4144
  _b.functionType = 'UserDefined',
4017
- _b.name = name,
4145
+ _b.name = functionSymbol[1],
4018
4146
  _b.evaluatedfunction = evaluatedFunction,
4019
4147
  _b);
4020
- contextStack.addValues((_c = {}, _c[name] = litsFunction, _c));
4148
+ contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
4021
4149
  return null;
4022
4150
  },
4023
4151
  getUndefinedSymbols: function (node, contextStack, _a) {
4024
4152
  var _b, _c;
4025
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4026
- contextStack.addValues((_b = {}, _b[node.functionName.value] = true, _b));
4027
- var newContext = (_c = {}, _c[node.functionName.value] = { value: true }, _c);
4028
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, newContext);
4153
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4154
+ var functionName = node[1][1][1];
4155
+ contextStack.addValues((_b = {}, _b[functionName] = true, _b));
4156
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4157
+ return getFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
4029
4158
  },
4030
4159
  };
4031
4160
  var defnSpecialExpression = {
4032
4161
  paramCount: {},
4033
4162
  evaluate: function (node, contextStack, _a) {
4034
4163
  var _b, _c;
4035
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4036
- var name = node.functionName.value;
4037
- assertNameNotDefined(name, contextStack, builtin, node.sourceCodeInfo);
4038
- var evaluatedFunctionOverloades = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4164
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4165
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4166
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4167
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4168
+ var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4039
4169
  var litsFunction = (_b = {},
4040
4170
  _b[FUNCTION_SYMBOL] = true,
4041
- _b.sourceCodeInfo = node.sourceCodeInfo,
4171
+ _b.sourceCodeInfo = node[2],
4042
4172
  _b.functionType = 'UserDefined',
4043
- _b.name = name,
4173
+ _b.name = functionSymbol[1],
4044
4174
  _b.evaluatedfunction = evaluatedFunctionOverloades,
4045
4175
  _b);
4046
- contextStack.exportValues((_c = {}, _c[name] = litsFunction, _c));
4176
+ contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
4047
4177
  return null;
4048
4178
  },
4049
4179
  getUndefinedSymbols: function (node, contextStack, _a) {
4050
4180
  var _b, _c;
4051
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4052
- contextStack.exportValues((_b = {}, _b[node.functionName.value] = true, _b));
4053
- var newContext = (_c = {}, _c[node.functionName.value] = { value: true }, _c);
4054
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, newContext);
4181
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4182
+ var functionName = node[1][1][1];
4183
+ var fn = node[1][2];
4184
+ contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
4185
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4186
+ return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
4055
4187
  },
4056
4188
  };
4057
4189
  var fnSpecialExpression = {
4058
4190
  paramCount: {},
4059
4191
  evaluate: function (node, contextStack, _a) {
4060
4192
  var _b;
4061
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4062
- var evaluatedFunction = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4193
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4194
+ var fn = node[1][1];
4195
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4063
4196
  var litsFunction = (_b = {},
4064
4197
  _b[FUNCTION_SYMBOL] = true,
4065
- _b.sourceCodeInfo = node.sourceCodeInfo,
4198
+ _b.sourceCodeInfo = node[2],
4066
4199
  _b.functionType = 'UserDefined',
4067
4200
  _b.name = undefined,
4068
4201
  _b.evaluatedfunction = evaluatedFunction,
@@ -4070,129 +4203,109 @@ var fnSpecialExpression = {
4070
4203
  return litsFunction;
4071
4204
  },
4072
4205
  getUndefinedSymbols: function (node, contextStack, _a) {
4073
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4074
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4206
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4207
+ var fn = node[1][1];
4208
+ return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4075
4209
  },
4076
4210
  };
4077
- function evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode) {
4078
- var fn = node.function;
4211
+ function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
4079
4212
  var functionContext = {};
4080
- var context = fn.arguments.reduce(function (ctx, arg) {
4213
+ var context = fn[0].reduce(function (ctx, arg) {
4081
4214
  Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
4082
4215
  ctx[name] = { value: null };
4083
4216
  });
4084
4217
  return ctx;
4085
4218
  }, {});
4086
- var undefinedSymbols = getUndefinedSymbols(fn.body, contextStack.new(context), builtin, evaluateAstNode);
4219
+ var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
4087
4220
  undefinedSymbols.forEach(function (name) {
4088
4221
  var value = contextStack.getValue(name);
4089
4222
  if (isAny(value)) {
4090
4223
  functionContext[name] = { value: value };
4091
4224
  }
4092
4225
  });
4093
- var evaluatedFunction = {
4094
- arguments: fn.arguments,
4095
- body: fn.body,
4096
- context: functionContext,
4097
- };
4226
+ var evaluatedFunction = [
4227
+ fn[0],
4228
+ fn[1],
4229
+ functionContext,
4230
+ ];
4098
4231
  return evaluatedFunction;
4099
4232
  }
4100
- function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, functionNameContext) {
4233
+ function getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
4101
4234
  var result = new Set();
4102
4235
  var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
4103
4236
  var newContext = {};
4104
- fn.arguments.forEach(function (arg) {
4237
+ fn[0].forEach(function (arg) {
4105
4238
  Object.assign(newContext, getAllBindingTargetNames(arg));
4239
+ walkDefaults(arg, function (defaultNode) {
4240
+ addToSet(result, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
4241
+ });
4106
4242
  });
4107
4243
  var newContextStack = contextStackWithFunctionName.create(newContext);
4108
- var overloadResult = getUndefinedSymbols(fn.body, newContextStack, builtin, evaluateAstNode);
4244
+ var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
4109
4245
  addToSet(result, overloadResult);
4110
4246
  return result;
4111
4247
  }
4112
4248
 
4113
- function isAstNode(value) {
4114
- if (value === null || typeof value !== 'object')
4115
- return false;
4116
- if (!isAstNodeType(value.type))
4117
- return false;
4118
- return true;
4119
- }
4120
- function asAstNode(value, sourceCodeInfo) {
4121
- assertAstNode(value, sourceCodeInfo);
4122
- return value;
4123
- }
4124
- function assertAstNode(value, sourceCodeInfo) {
4125
- if (!isAstNode(value))
4126
- throw getAssertionError('AstNode', value, sourceCodeInfo);
4127
- }
4128
- function isSymbolNode(value) {
4129
- if (!isAstNode(value))
4130
- return false;
4131
- return value.type === 'Symbol';
4132
- }
4133
- function isNormalExpressionNodeWithName(value) {
4134
- if (!isAstNode(value))
4135
- return false;
4136
- return value.type === 'NormalExpression' && typeof value.name === 'string';
4137
- }
4138
-
4139
4249
  var ifSpecialExpression = {
4140
4250
  paramCount: { min: 2, max: 3 },
4141
4251
  evaluate: function (node, contextStack, _a) {
4142
- var evaluateAstNode = _a.evaluateAstNode;
4143
- var sourceCodeInfo = node.sourceCodeInfo;
4144
- var _b = __read(node.params, 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4145
- if (evaluateAstNode(asAstNode(conditionNode, sourceCodeInfo), contextStack)) {
4146
- return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
4252
+ var evaluateNode = _a.evaluateNode;
4253
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4254
+ if (evaluateNode(conditionNode, contextStack)) {
4255
+ return evaluateNode(trueNode, contextStack);
4147
4256
  }
4148
- else {
4149
- if (node.params.length === 3)
4150
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4151
- else
4152
- return null;
4257
+ else if (falseNode) {
4258
+ return evaluateNode(falseNode, contextStack);
4153
4259
  }
4260
+ return null;
4154
4261
  },
4155
4262
  getUndefinedSymbols: function (node, contextStack, _a) {
4156
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4157
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4263
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4264
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4158
4265
  },
4159
4266
  };
4160
4267
 
4161
4268
  var unlessSpecialExpression = {
4162
4269
  paramCount: { min: 2, max: 3 },
4163
4270
  evaluate: function (node, contextStack, _a) {
4164
- var evaluateAstNode = _a.evaluateAstNode;
4165
- var sourceCodeInfo = node.sourceCodeInfo;
4166
- var _b = __read(node.params, 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4167
- if (!evaluateAstNode(asAstNode(conditionNode, sourceCodeInfo), contextStack)) {
4168
- return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
4271
+ var evaluateNode = _a.evaluateNode;
4272
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4273
+ if (!evaluateNode(conditionNode, contextStack)) {
4274
+ return evaluateNode(trueNode, contextStack);
4169
4275
  }
4170
- else {
4171
- if (node.params.length === 3)
4172
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4173
- else
4174
- return null;
4276
+ else if (falseNode) {
4277
+ return evaluateNode(falseNode, contextStack);
4175
4278
  }
4279
+ return null;
4176
4280
  },
4177
4281
  getUndefinedSymbols: function (node, contextStack, _a) {
4178
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4179
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4282
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4283
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4180
4284
  },
4181
4285
  };
4182
4286
 
4183
4287
  var letSpecialExpression = {
4184
4288
  paramCount: 0,
4185
4289
  evaluate: function (node, contextStack, _a) {
4186
- var evaluateAstNode = _a.evaluateAstNode;
4187
- var bindingValue = evaluateAstNode(node.bindingNode.value, contextStack);
4188
- var values = evalueateBindingNodeValues(node.bindingNode, bindingValue, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4290
+ var evaluateNode = _a.evaluateNode;
4291
+ var bindingNode = node[1][1];
4292
+ var target = bindingNode[1][0];
4293
+ var value = bindingNode[1][1];
4294
+ var bindingValue = evaluateNode(value, contextStack);
4295
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
4189
4296
  contextStack.addValues(values);
4190
4297
  return null;
4191
4298
  },
4192
4299
  getUndefinedSymbols: function (node, contextStack, _a) {
4193
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4194
- var bindingResult = getUndefinedSymbols([node.bindingNode.value], contextStack, builtin, evaluateAstNode);
4195
- contextStack.addValues(getAllBindingTargetNames(node.bindingNode.target));
4300
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4301
+ var bindingNode = node[1][1];
4302
+ var target = bindingNode[1][0];
4303
+ var value = bindingNode[1][1];
4304
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
4305
+ walkDefaults(target, function (defaultNode) {
4306
+ addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
4307
+ });
4308
+ contextStack.addValues(getAllBindingTargetNames(target));
4196
4309
  return bindingResult;
4197
4310
  },
4198
4311
  };
@@ -4200,11 +4313,11 @@ var letSpecialExpression = {
4200
4313
  var loopSpecialExpression = {
4201
4314
  paramCount: {},
4202
4315
  evaluate: function (node, contextStack, _a) {
4203
- var evaluateAstNode = _a.evaluateAstNode;
4204
- var sourceCodeInfo = node.sourceCodeInfo;
4205
- var bindingContext = node.bindingNodes.reduce(function (result, binding) {
4206
- var val = evaluateAstNode(binding.value, contextStack.create(result));
4207
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4316
+ var evaluateNode = _a.evaluateNode;
4317
+ var bindingNodes = node[1][1];
4318
+ var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
4319
+ var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
4320
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
4208
4321
  Object.entries(valueRecord).forEach(function (_a) {
4209
4322
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4210
4323
  result[name] = { value: value };
@@ -4212,20 +4325,21 @@ var loopSpecialExpression = {
4212
4325
  return result;
4213
4326
  }, {});
4214
4327
  var newContextStack = contextStack.create(bindingContext);
4328
+ var body = node[1][2];
4215
4329
  var _loop_1 = function () {
4216
4330
  var e_1, _b;
4217
4331
  var result = null;
4218
4332
  try {
4219
4333
  try {
4220
- for (var _c = (e_1 = void 0, __values(node.params)), _d = _c.next(); !_d.done; _d = _c.next()) {
4221
- var form = _d.value;
4222
- result = evaluateAstNode(form, newContextStack);
4334
+ 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()) {
4335
+ var form = body_1_1.value;
4336
+ result = evaluateNode(form, newContextStack);
4223
4337
  }
4224
4338
  }
4225
4339
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
4226
4340
  finally {
4227
4341
  try {
4228
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
4342
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4229
4343
  }
4230
4344
  finally { if (e_1) throw e_1.error; }
4231
4345
  }
@@ -4233,16 +4347,16 @@ var loopSpecialExpression = {
4233
4347
  catch (error) {
4234
4348
  if (error instanceof RecurSignal) {
4235
4349
  var params_1 = error.params;
4236
- if (params_1.length !== node.bindingNodes.length) {
4237
- throw new LitsError("recur expected ".concat(node.bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), sourceCodeInfo);
4350
+ if (params_1.length !== bindingNodes.length) {
4351
+ throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
4238
4352
  }
4239
- node.bindingNodes.forEach(function (binding, index) {
4353
+ bindingNodes.forEach(function (bindingNode, index) {
4240
4354
  var e_2, _a;
4241
- var valueRecord = evalueateBindingNodeValues(binding, asAny(params_1[index], sourceCodeInfo), function (astNode) { return evaluateAstNode(astNode, contextStack); });
4355
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
4242
4356
  try {
4243
4357
  for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
4244
4358
  var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
4245
- asNonUndefined(bindingContext[name_1], sourceCodeInfo).value = value;
4359
+ bindingContext[name_1].value = value;
4246
4360
  }
4247
4361
  }
4248
4362
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
@@ -4266,29 +4380,31 @@ var loopSpecialExpression = {
4266
4380
  }
4267
4381
  },
4268
4382
  getUndefinedSymbols: function (node, contextStack, _a) {
4269
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4270
- var newContext = node.bindingNodes
4383
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4384
+ var bindingNodes = node[1][1];
4385
+ var newContext = bindingNodes
4271
4386
  .reduce(function (context, bindingNode) {
4272
- var names = getAllBindingTargetNames(bindingNode.target);
4387
+ var names = getAllBindingTargetNames(bindingNode[1][0]);
4273
4388
  Object.keys(names).forEach(function (name) {
4274
4389
  context[name] = { value: true };
4275
4390
  });
4276
4391
  return context;
4277
4392
  }, {});
4278
- var bindingValueNodes = node.bindingNodes.map(function (binding) { return binding.value; });
4279
- var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateAstNode);
4280
- var paramsResult = getUndefinedSymbols(node.params, contextStack.create(newContext), builtin, evaluateAstNode);
4393
+ var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
4394
+ var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
4395
+ var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
4281
4396
  return joinSets(bindingsResult, paramsResult);
4282
4397
  },
4283
4398
  };
4284
4399
 
4285
- function addToContext(bindings, context, contextStack, evaluateAstNode) {
4400
+ function addToContext(bindings, context, contextStack, evaluateNode) {
4286
4401
  var e_1, _a;
4287
4402
  try {
4288
4403
  for (var bindings_1 = __values(bindings), bindings_1_1 = bindings_1.next(); !bindings_1_1.done; bindings_1_1 = bindings_1.next()) {
4289
- var binding = bindings_1_1.value;
4290
- var val = evaluateAstNode(binding.value, contextStack);
4291
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4404
+ var bindingNode = bindings_1_1.value;
4405
+ var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
4406
+ var val = evaluateNode(bindingValue, contextStack);
4407
+ var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
4292
4408
  Object.entries(valueRecord).forEach(function (_a) {
4293
4409
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4294
4410
  context[name] = { value: value };
@@ -4303,9 +4419,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
4303
4419
  finally { if (e_1) throw e_1.error; }
4304
4420
  }
4305
4421
  }
4306
- function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4307
- var sourceCodeInfo = node.sourceCodeInfo;
4308
- var _a = node, loopBindings = _a.l, params = _a.params;
4422
+ function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
4423
+ var sourceCodeInfo = loopNode[2];
4424
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4309
4425
  var result = [];
4310
4426
  var bindingIndices = loopBindings.map(function () { return 0; });
4311
4427
  var abort = false;
@@ -4315,8 +4431,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4315
4431
  var newContextStack = contextStack.create(context);
4316
4432
  var skip = false;
4317
4433
  bindingsLoop: for (var bindingIndex = 0; bindingIndex < loopBindings.length; bindingIndex += 1) {
4318
- var _c = asNonUndefined(loopBindings[bindingIndex], sourceCodeInfo), binding = _c.b, letBindings = _c.l, whenNode = _c.wn, whileNode = _c.we, modifiers = _c.m;
4319
- var coll = asColl(evaluateAstNode(binding.value, newContextStack), sourceCodeInfo);
4434
+ var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
4435
+ var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
4436
+ var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
4320
4437
  var seq = isSeq(coll) ? coll : Object.entries(coll);
4321
4438
  if (seq.length === 0) {
4322
4439
  skip = true;
@@ -4335,45 +4452,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4335
4452
  break;
4336
4453
  }
4337
4454
  var val = asAny(seq[index], sourceCodeInfo);
4338
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, newContextStack); });
4455
+ var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
4339
4456
  Object.entries(valueRecord).forEach(function (_a) {
4340
4457
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4341
4458
  context[name] = { value: value };
4342
4459
  });
4460
+ if (letBindings) {
4461
+ addToContext(letBindings, context, newContextStack, evaluateNode);
4462
+ }
4463
+ if (whenNode && !evaluateNode(whenNode, newContextStack)) {
4464
+ bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
4465
+ skip = true;
4466
+ break bindingsLoop;
4467
+ }
4468
+ if (whileNode && !evaluateNode(whileNode, newContextStack)) {
4469
+ bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
4470
+ skip = true;
4471
+ break bindingsLoop;
4472
+ }
4473
+ }
4474
+ if (!skip) {
4475
+ var value = null;
4343
4476
  try {
4344
- 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()) {
4345
- var modifier = modifiers_1_1.value;
4346
- switch (modifier) {
4347
- case '&let':
4348
- addToContext(asNonUndefined(letBindings, sourceCodeInfo), context, newContextStack, evaluateAstNode);
4349
- break;
4350
- case '&when':
4351
- if (!evaluateAstNode(asAstNode(whenNode, sourceCodeInfo), newContextStack)) {
4352
- bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
4353
- skip = true;
4354
- break bindingsLoop;
4355
- }
4356
- break;
4357
- case '&while':
4358
- if (!evaluateAstNode(asAstNode(whileNode, sourceCodeInfo), newContextStack)) {
4359
- bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
4360
- skip = true;
4361
- break bindingsLoop;
4362
- }
4363
- break;
4364
- }
4477
+ 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()) {
4478
+ var form = body_1_1.value;
4479
+ value = evaluateNode(form, newContextStack);
4365
4480
  }
4366
4481
  }
4367
4482
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
4368
4483
  finally {
4369
4484
  try {
4370
- if (modifiers_1_1 && !modifiers_1_1.done && (_b = modifiers_1.return)) _b.call(modifiers_1);
4485
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4371
4486
  }
4372
4487
  finally { if (e_2) throw e_2.error; }
4373
4488
  }
4374
- }
4375
- if (!skip) {
4376
- var value = evaluateAstNode(params[0], newContextStack);
4377
4489
  if (returnResult)
4378
4490
  result.push(value);
4379
4491
  if (bindingIndices.length > 0)
@@ -4385,57 +4497,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4385
4497
  }
4386
4498
  return returnResult ? result : null;
4387
4499
  }
4388
- function analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode) {
4500
+ function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
4389
4501
  var result = new Set();
4390
4502
  var newContext = {};
4391
- var loopBindings = node.l;
4392
- loopBindings.forEach(function (loopBinding) {
4393
- var binding = loopBinding.b, letBindings = loopBinding.l, whenNode = loopBinding.wn, whileNode = loopBinding.we;
4394
- getUndefinedSymbols([binding.value], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4503
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4504
+ loopBindings.forEach(function (loopBindingNode) {
4505
+ var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
4506
+ var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
4507
+ getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4395
4508
  return result.add(symbol);
4396
4509
  });
4397
- Object.assign(newContext, getAllBindingTargetNames(binding.target));
4510
+ Object.assign(newContext, getAllBindingTargetNames(target));
4398
4511
  if (letBindings) {
4399
- letBindings.forEach(function (letBinding) {
4400
- getUndefinedSymbols([letBinding.value], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4512
+ letBindings.forEach(function (letBindingNode) {
4513
+ var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
4514
+ getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4401
4515
  return result.add(symbol);
4402
4516
  });
4403
- Object.assign(newContext, getAllBindingTargetNames(letBinding.target));
4517
+ Object.assign(newContext, getAllBindingTargetNames(letTarget));
4404
4518
  });
4405
4519
  }
4406
4520
  if (whenNode) {
4407
- getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4521
+ getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4408
4522
  return result.add(symbol);
4409
4523
  });
4410
4524
  }
4411
4525
  if (whileNode) {
4412
- getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4526
+ getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4413
4527
  return result.add(symbol);
4414
4528
  });
4415
4529
  }
4416
4530
  });
4417
- getUndefinedSymbols(node.params, contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4531
+ getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4418
4532
  return result.add(symbol);
4419
4533
  });
4420
4534
  return result;
4421
4535
  }
4422
4536
  var forSpecialExpression = {
4423
4537
  paramCount: 1,
4424
- evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateAstNode); },
4538
+ evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
4425
4539
  getUndefinedSymbols: function (node, contextStack, _a) {
4426
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4427
- return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4540
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4541
+ return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4428
4542
  },
4429
4543
  };
4430
4544
  var doseqSpecialExpression = {
4431
4545
  paramCount: 1,
4432
4546
  evaluate: function (node, contextStack, helpers) {
4433
- evaluateLoop(false, node, contextStack, helpers.evaluateAstNode);
4547
+ evaluateLoop(false, node, contextStack, helpers.evaluateNode);
4434
4548
  return null;
4435
4549
  },
4436
4550
  getUndefinedSymbols: function (node, contextStack, _a) {
4437
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4438
- return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4551
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4552
+ return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4439
4553
  },
4440
4554
  };
4441
4555
 
@@ -4443,12 +4557,12 @@ var orSpecialExpression = {
4443
4557
  paramCount: {},
4444
4558
  evaluate: function (node, contextStack, _a) {
4445
4559
  var e_1, _b;
4446
- var evaluateAstNode = _a.evaluateAstNode;
4560
+ var evaluateNode = _a.evaluateNode;
4447
4561
  var value = false;
4448
4562
  try {
4449
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4563
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4450
4564
  var param = _d.value;
4451
- value = evaluateAstNode(param, contextStack);
4565
+ value = evaluateNode(param, contextStack);
4452
4566
  if (value)
4453
4567
  break;
4454
4568
  }
@@ -4463,55 +4577,55 @@ var orSpecialExpression = {
4463
4577
  return value;
4464
4578
  },
4465
4579
  getUndefinedSymbols: function (node, contextStack, _a) {
4466
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4467
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4580
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4581
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4468
4582
  },
4469
4583
  };
4470
4584
 
4471
4585
  var qqSpecialExpression = {
4472
4586
  paramCount: { min: 1, max: 2 },
4473
4587
  evaluate: function (node, contextStack, _a) {
4474
- var evaluateAstNode = _a.evaluateAstNode;
4475
- var _b = __read(node.params, 2), firstNode = _b[0], secondNode = _b[1];
4476
- if (isSymbolNode(firstNode)) {
4477
- if (contextStack.lookUp(firstNode) === null)
4478
- return secondNode ? evaluateAstNode(secondNode, contextStack) : null;
4588
+ var evaluateNode = _a.evaluateNode;
4589
+ var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
4590
+ if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
4591
+ return secondNode ? evaluateNode(secondNode, contextStack) : null;
4479
4592
  }
4480
- assertAny(firstNode, node.sourceCodeInfo);
4481
- var firstResult = evaluateAstNode(firstNode, contextStack);
4482
- return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateAstNode(secondNode, contextStack) : null);
4593
+ assertAny(firstNode, node[2]);
4594
+ var firstResult = evaluateNode(firstNode, contextStack);
4595
+ return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
4483
4596
  },
4484
4597
  getUndefinedSymbols: function (node, contextStack, _a) {
4485
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4486
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4598
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4599
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4487
4600
  },
4488
4601
  };
4489
4602
 
4490
4603
  var recurSpecialExpression = {
4491
4604
  paramCount: {},
4492
4605
  evaluate: function (node, contextStack, _a) {
4493
- var evaluateAstNode = _a.evaluateAstNode;
4494
- var params = node.params.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
4495
- throw new RecurSignal(params);
4606
+ var evaluateNode = _a.evaluateNode;
4607
+ var params = node[1][1];
4608
+ var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4609
+ throw new RecurSignal(evaluatedParams);
4496
4610
  },
4497
4611
  getUndefinedSymbols: function (node, contextStack, _a) {
4498
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4499
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4612
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4613
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4500
4614
  },
4501
4615
  };
4502
4616
 
4503
4617
  var throwSpecialExpression = {
4504
4618
  paramCount: 1,
4505
4619
  evaluate: function (node, contextStack, _a) {
4506
- var evaluateAstNode = _a.evaluateAstNode;
4507
- var message = asString(evaluateAstNode(node.params[0], contextStack), node.sourceCodeInfo, {
4620
+ var evaluateNode = _a.evaluateNode;
4621
+ var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
4508
4622
  nonEmpty: true,
4509
4623
  });
4510
- throw new UserDefinedError(message, node.sourceCodeInfo);
4624
+ throw new UserDefinedError(message, node[2]);
4511
4625
  },
4512
4626
  getUndefinedSymbols: function (node, contextStack, _a) {
4513
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4514
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4627
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4628
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
4515
4629
  },
4516
4630
  };
4517
4631
 
@@ -4519,29 +4633,29 @@ var trySpecialExpression = {
4519
4633
  paramCount: 1,
4520
4634
  evaluate: function (node, contextStack, _a) {
4521
4635
  var _b;
4522
- var evaluateAstNode = _a.evaluateAstNode;
4523
- var tryExpressions = node.params, catchExpression = node.ce, errorNode = node.e;
4636
+ var evaluateNode = _a.evaluateNode;
4637
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4524
4638
  try {
4525
- return evaluateAstNode(tryExpressions[0], contextStack);
4639
+ return evaluateNode(tryExpression, contextStack);
4526
4640
  }
4527
4641
  catch (error) {
4528
- var newContext = errorNode
4642
+ var newContext = errorSymbol
4529
4643
  ? (_b = {},
4530
- _b[errorNode.value] = { value: asAny(error, node.sourceCodeInfo) },
4644
+ _b[errorSymbol[1]] = { value: error },
4531
4645
  _b) : {};
4532
- return evaluateAstNode(catchExpression, contextStack.create(newContext));
4646
+ return evaluateNode(catchExpression, contextStack.create(newContext));
4533
4647
  }
4534
4648
  },
4535
4649
  getUndefinedSymbols: function (node, contextStack, _a) {
4536
4650
  var _b;
4537
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4538
- var tryExpressions = node.params, catchExpression = node.ce, errorNode = node.e;
4539
- var tryResult = getUndefinedSymbols(tryExpressions, contextStack, builtin, evaluateAstNode);
4540
- var newContext = errorNode
4651
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4652
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4653
+ var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
4654
+ var newContext = errorSymbol
4541
4655
  ? (_b = {},
4542
- _b[errorNode.value] = { value: true },
4656
+ _b[errorSymbol[1]] = { value: true },
4543
4657
  _b) : {};
4544
- var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateAstNode);
4658
+ var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
4545
4659
  return joinSets(tryResult, catchResult);
4546
4660
  },
4547
4661
  };
@@ -4550,20 +4664,20 @@ var arraySpecialExpression = {
4550
4664
  paramCount: {},
4551
4665
  evaluate: function (node, contextStack, _a) {
4552
4666
  var e_1, _b;
4553
- var evaluateAstNode = _a.evaluateAstNode;
4667
+ var evaluateNode = _a.evaluateNode;
4554
4668
  var result = [];
4555
4669
  try {
4556
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4670
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4557
4671
  var param = _d.value;
4558
- if (param.type === 'Spread') {
4559
- var spreadValue = evaluateAstNode(param.value, contextStack);
4672
+ if (isSpreadNode(param)) {
4673
+ var spreadValue = evaluateNode(param[1], contextStack);
4560
4674
  if (!Array.isArray(spreadValue)) {
4561
- throw new LitsError('Spread value is not an array', param.sourceCodeInfo);
4675
+ throw new LitsError('Spread value is not an array', param[2]);
4562
4676
  }
4563
4677
  result.push.apply(result, __spreadArray([], __read(spreadValue), false));
4564
4678
  }
4565
4679
  else {
4566
- result.push(evaluateAstNode(param, contextStack));
4680
+ result.push(evaluateNode(param, contextStack));
4567
4681
  }
4568
4682
  }
4569
4683
  }
@@ -4577,76 +4691,79 @@ var arraySpecialExpression = {
4577
4691
  return result;
4578
4692
  },
4579
4693
  getUndefinedSymbols: function (node, contextStack, _a) {
4580
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4581
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4694
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4695
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4582
4696
  },
4583
4697
  };
4584
4698
 
4585
4699
  var objectSpecialExpression = {
4586
4700
  paramCount: {},
4587
4701
  evaluate: function (node, contextStack, _a) {
4588
- var evaluateAstNode = _a.evaluateAstNode;
4702
+ var evaluateNode = _a.evaluateNode;
4589
4703
  var result = {};
4590
- for (var i = 0; i < node.params.length; i += 2) {
4591
- var keyNode = asAstNode(node.params[i]);
4592
- if ((keyNode === null || keyNode === void 0 ? void 0 : keyNode.type) === 'Spread') {
4593
- var spreadObject = evaluateAstNode(keyNode.value, contextStack);
4704
+ var params = node[1][1];
4705
+ for (var i = 0; i < params.length; i += 2) {
4706
+ var keyNode = params[i];
4707
+ if (isSpreadNode(keyNode)) {
4708
+ var spreadObject = evaluateNode(keyNode[1], contextStack);
4594
4709
  if (!isUnknownRecord(spreadObject)) {
4595
- throw new LitsError('Spread value is not an object', keyNode.sourceCodeInfo);
4710
+ throw new LitsError('Spread value is not an object', keyNode[2]);
4596
4711
  }
4597
4712
  Object.assign(result, spreadObject);
4598
4713
  i -= 1;
4599
4714
  }
4600
4715
  else {
4601
- var key = evaluateAstNode(keyNode, contextStack);
4602
- var value = evaluateAstNode(node.params[i + 1], contextStack);
4603
- assertString(key, keyNode.sourceCodeInfo);
4716
+ var key = evaluateNode(keyNode, contextStack);
4717
+ var value = evaluateNode(params[i + 1], contextStack);
4718
+ assertString(key, keyNode[2]);
4604
4719
  result[key] = value;
4605
4720
  }
4606
4721
  }
4607
4722
  return result;
4608
4723
  },
4609
4724
  getUndefinedSymbols: function (node, contextStack, _a) {
4610
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4611
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4725
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4726
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4612
4727
  },
4613
4728
  };
4614
4729
 
4615
- var specialExpressions = {
4616
- '&&': andSpecialExpression,
4617
- 'cond': condSpecialExpression,
4618
- 'switch': switchSpecialExpression,
4619
- 'def': defSpecialExpression,
4620
- 'defn': defnSpecialExpression,
4621
- 'function': functionSpecialExpression,
4622
- 'do': doSpecialExpression,
4623
- 'doseq': doseqSpecialExpression,
4624
- 'for': forSpecialExpression,
4625
- 'fn': fnSpecialExpression,
4626
- 'if': ifSpecialExpression,
4627
- 'unless': unlessSpecialExpression,
4628
- 'let': letSpecialExpression,
4629
- 'loop': loopSpecialExpression,
4630
- '||': orSpecialExpression,
4631
- 'recur': recurSpecialExpression,
4632
- 'throw': throwSpecialExpression,
4633
- 'try': trySpecialExpression,
4634
- 'defined?': declaredSpecialExpression,
4635
- '??': qqSpecialExpression,
4636
- 'array': arraySpecialExpression,
4637
- 'object': objectSpecialExpression,
4638
- };
4730
+ var specialExpressions = [
4731
+ qqSpecialExpression,
4732
+ andSpecialExpression,
4733
+ orSpecialExpression,
4734
+ arraySpecialExpression,
4735
+ condSpecialExpression,
4736
+ defSpecialExpression,
4737
+ definedSpecialExpression,
4738
+ defnSpecialExpression,
4739
+ doSpecialExpression,
4740
+ doseqSpecialExpression,
4741
+ fnSpecialExpression,
4742
+ forSpecialExpression,
4743
+ functionSpecialExpression,
4744
+ ifSpecialExpression,
4745
+ letSpecialExpression,
4746
+ loopSpecialExpression,
4747
+ objectSpecialExpression,
4748
+ recurSpecialExpression,
4749
+ switchSpecialExpression,
4750
+ throwSpecialExpression,
4751
+ trySpecialExpression,
4752
+ unlessSpecialExpression,
4753
+ ];
4639
4754
  var builtin = {
4640
4755
  normalExpressions: normalExpressions,
4641
4756
  specialExpressions: specialExpressions,
4757
+ allNormalExpressions: allNormalExpressions,
4642
4758
  };
4643
4759
  var normalExpressionKeys = Object.keys(normalExpressions);
4644
- var specialExpressionKeys = Object.keys(specialExpressions);
4760
+ var specialExpressionKeys = Object.keys(specialExpressionTypes);
4761
+ new Set(specialExpressionKeys);
4645
4762
 
4646
4763
  function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
4647
- var hasRest = evaluatedFunction.arguments.some(function (arg) { return arg.type === 'rest'; });
4648
- var minArity = evaluatedFunction.arguments.filter(function (arg) { return arg.type !== 'rest' && !arg.default; }).length;
4649
- var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction.arguments.length;
4764
+ var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4765
+ var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
4766
+ var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
4650
4767
  if (nbrOfParams < minArity || nbrOfParams > maxArity) {
4651
4768
  throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
4652
4769
  }
@@ -4670,21 +4787,21 @@ var functionExecutors = {
4670
4787
  }
4671
4788
  },
4672
4789
  UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
4673
- var evaluateAstNode = _a.evaluateAstNode;
4790
+ var evaluateNode = _a.evaluateNode;
4674
4791
  var _loop_1 = function () {
4675
4792
  var e_1, _b;
4676
4793
  checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
4677
4794
  var evaluatedFunction = fn.evaluatedfunction;
4678
- var args = evaluatedFunction.arguments;
4679
- var nbrOfNonRestArgs = args.filter(function (arg) { return arg.type !== 'rest'; }).length;
4680
- var newContextStack = contextStack.create(fn.evaluatedfunction.context);
4795
+ var args = evaluatedFunction[0];
4796
+ var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
4797
+ var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
4681
4798
  var newContext = {};
4682
4799
  var rest = [];
4683
4800
  for (var i = 0; i < params.length; i += 1) {
4684
4801
  if (i < nbrOfNonRestArgs) {
4685
4802
  var param = toAny(params[i]);
4686
- var valueRecord = evalueateBindingNodeValues(args[i], param, function (astNode) {
4687
- return evaluateAstNode(astNode, newContextStack.create(newContext));
4803
+ var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
4804
+ return evaluateNode(Node, newContextStack.create(newContext));
4688
4805
  });
4689
4806
  Object.entries(valueRecord).forEach(function (_a) {
4690
4807
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
@@ -4697,18 +4814,18 @@ var functionExecutors = {
4697
4814
  }
4698
4815
  for (var i = params.length; i < nbrOfNonRestArgs; i++) {
4699
4816
  var arg = args[i];
4700
- var defaultValue = evaluateAstNode(arg.default, contextStack.create(newContext));
4701
- var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (astNode) {
4702
- return evaluateAstNode(astNode, contextStack.create(newContext));
4817
+ var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
4818
+ var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
4819
+ return evaluateNode(Node, contextStack.create(newContext));
4703
4820
  });
4704
4821
  Object.entries(valueRecord).forEach(function (_a) {
4705
4822
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4706
4823
  newContext[key] = { value: value };
4707
4824
  });
4708
4825
  }
4709
- var restArgument = args.find(function (arg) { return arg.type === 'rest'; });
4826
+ var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4710
4827
  if (restArgument !== undefined) {
4711
- var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (astNode) { return evaluateAstNode(astNode, contextStack.create(newContext)); });
4828
+ var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
4712
4829
  Object.entries(valueRecord).forEach(function (_a) {
4713
4830
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4714
4831
  newContext[key] = { value: value };
@@ -4718,9 +4835,9 @@ var functionExecutors = {
4718
4835
  var result = null;
4719
4836
  var newContextStack2 = newContextStack.create(newContext);
4720
4837
  try {
4721
- for (var _c = (e_1 = void 0, __values(evaluatedFunction.body)), _d = _c.next(); !_d.done; _d = _c.next()) {
4838
+ for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
4722
4839
  var node = _d.value;
4723
- result = evaluateAstNode(node, newContextStack2);
4840
+ result = evaluateNode(node, newContextStack2);
4724
4841
  }
4725
4842
  }
4726
4843
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4844,7 +4961,7 @@ var functionExecutors = {
4844
4961
  },
4845
4962
  Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
4846
4963
  var executeFunction = _a.executeFunction;
4847
- var normalExpression = asNonUndefined(normalExpressions[fn.n], sourceCodeInfo);
4964
+ var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
4848
4965
  return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
4849
4966
  },
4850
4967
  };
@@ -4855,7 +4972,7 @@ function evaluate(ast, contextStack) {
4855
4972
  try {
4856
4973
  for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
4857
4974
  var node = _c.value;
4858
- result = evaluateAstNode(node, contextStack);
4975
+ result = evaluateNode(node, contextStack);
4859
4976
  }
4860
4977
  }
4861
4978
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4867,53 +4984,66 @@ function evaluate(ast, contextStack) {
4867
4984
  }
4868
4985
  return result;
4869
4986
  }
4870
- function evaluateAstNode(node, contextStack) {
4871
- switch (node.type) {
4872
- case 'Number':
4987
+ function evaluateNode(node, contextStack) {
4988
+ switch (node[0]) {
4989
+ case NodeTypes.Number:
4873
4990
  return evaluateNumber(node);
4874
- case 'String':
4991
+ case NodeTypes.String:
4875
4992
  return evaluateString(node);
4876
- case 'Symbol':
4877
- return contextStack.evaluateName(node);
4878
- case 'ReservedSymbol':
4879
- return evaluateReservedName(node);
4880
- case 'NormalExpression':
4993
+ case NodeTypes.NormalBuiltinSymbol:
4994
+ case NodeTypes.SpecialBuiltinSymbol:
4995
+ case NodeTypes.UserDefinedSymbol:
4996
+ return contextStack.evaluateSymbol(node);
4997
+ case NodeTypes.ReservedSymbol:
4998
+ return evaluateReservedSymbol(node);
4999
+ case NodeTypes.NormalExpression:
4881
5000
  return evaluateNormalExpression(node, contextStack);
4882
- case 'SpecialExpression':
5001
+ case NodeTypes.SpecialExpression:
4883
5002
  return evaluateSpecialExpression(node, contextStack);
4884
5003
  /* v8 ignore next 2 */
4885
5004
  default:
4886
- throw new LitsError("".concat(node.type, "-node cannot be evaluated"), node.sourceCodeInfo);
5005
+ throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
4887
5006
  }
4888
5007
  }
4889
5008
  function evaluateNumber(node) {
4890
- return node.value;
5009
+ return node[1];
4891
5010
  }
4892
5011
  function evaluateString(node) {
4893
- return node.value;
5012
+ return node[1];
4894
5013
  }
4895
- function evaluateReservedName(node) {
4896
- var reservedName = node.value;
5014
+ function evaluateReservedSymbol(node) {
5015
+ var reservedName = node[1];
4897
5016
  var value = reservedSymbolRecord[reservedName];
4898
- return asNonUndefined(value, node.sourceCodeInfo);
5017
+ return asNonUndefined(value, node[2]);
4899
5018
  }
4900
5019
  function evaluateNormalExpression(node, contextStack) {
4901
- var params = node.params.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
4902
- var sourceCodeInfo = node.sourceCodeInfo;
5020
+ var sourceCodeInfo = node[2];
5021
+ var paramNodes = node[1][1];
5022
+ var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4903
5023
  if (isNormalExpressionNodeWithName(node)) {
4904
- var value = contextStack.getValue(node.name);
4905
- if (value !== undefined)
4906
- return executeFunction(asAny(value), params, contextStack, sourceCodeInfo);
4907
- return evaluateBuiltinNormalExpression(node, params, contextStack);
5024
+ var nameSymbol = node[1][0];
5025
+ if (isNormalBuiltinSymbolNode(nameSymbol)) {
5026
+ var type = nameSymbol[1];
5027
+ var normalExpression = builtin.allNormalExpressions[type];
5028
+ return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
5029
+ }
5030
+ else {
5031
+ var fn = contextStack.getValue(nameSymbol[1]);
5032
+ if (fn !== undefined) {
5033
+ return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
5034
+ }
5035
+ throw new UndefinedSymbolError(nameSymbol[1], node[2]);
5036
+ }
4908
5037
  }
4909
5038
  else {
4910
- var fn = params[0];
4911
- return executeFunction(fn, params.slice(1), contextStack, sourceCodeInfo);
5039
+ var fnNode = node[1][0];
5040
+ var fn = evaluateNode(fnNode, contextStack);
5041
+ return executeFunction(fn, params, contextStack, sourceCodeInfo);
4912
5042
  }
4913
5043
  }
4914
5044
  function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4915
5045
  if (isLitsFunction(fn))
4916
- return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateAstNode: evaluateAstNode, executeFunction: executeFunction });
5046
+ return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
4917
5047
  if (Array.isArray(fn))
4918
5048
  return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
4919
5049
  if (isObj(fn))
@@ -4924,16 +5054,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4924
5054
  return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
4925
5055
  throw new NotAFunctionError(fn, sourceCodeInfo);
4926
5056
  }
4927
- function evaluateBuiltinNormalExpression(node, params, contextStack) {
4928
- var normalExpression = builtin.normalExpressions[node.name];
4929
- if (!normalExpression)
4930
- throw new UndefinedSymbolError(node.name, node.sourceCodeInfo);
4931
- return normalExpression.evaluate(params, node.sourceCodeInfo, contextStack, { executeFunction: executeFunction });
4932
- }
4933
5057
  function evaluateSpecialExpression(node, contextStack) {
4934
- var specialExpression = asNonUndefined(builtin.specialExpressions[node.name], node.sourceCodeInfo);
4935
- // eslint-disable-next-line ts/no-unsafe-argument
4936
- return specialExpression.evaluate(node, contextStack, { evaluateAstNode: evaluateAstNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
5058
+ var specialExpressionType = node[1][0];
5059
+ var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
5060
+ var castedEvaluate = specialExpression.evaluate;
5061
+ return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
4937
5062
  }
4938
5063
  function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
4939
5064
  if (params.length !== 1)
@@ -5075,13 +5200,13 @@ var ContextStackImpl = /** @class */ (function () {
5075
5200
  return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
5076
5201
  };
5077
5202
  ContextStackImpl.prototype.lookUp = function (node) {
5078
- var e_4, _a, _b;
5079
- var _c, _d, _e;
5080
- var value = node.value;
5081
- var sourceCodeInfo = node.sourceCodeInfo;
5203
+ var e_4, _a;
5204
+ var _b, _c, _d;
5205
+ var value = node[1];
5082
5206
  try {
5083
- for (var _f = __values(this.contexts), _g = _f.next(); !_g.done; _g = _f.next()) {
5084
- var context = _g.value;
5207
+ // const sourceCodeInfo = node[2]
5208
+ for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
5209
+ var context = _f.value;
5085
5210
  var contextEntry = context[value];
5086
5211
  if (contextEntry)
5087
5212
  return contextEntry;
@@ -5090,32 +5215,23 @@ var ContextStackImpl = /** @class */ (function () {
5090
5215
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
5091
5216
  finally {
5092
5217
  try {
5093
- if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
5218
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
5094
5219
  }
5095
5220
  finally { if (e_4) throw e_4.error; }
5096
5221
  }
5097
- var lazyHostValue = (_c = this.lazyValues) === null || _c === void 0 ? void 0 : _c[value];
5222
+ var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
5098
5223
  if (lazyHostValue !== undefined) {
5099
5224
  return {
5100
5225
  value: toAny(lazyHostValue.read()),
5101
5226
  };
5102
5227
  }
5103
- var hostValue = (_d = this.values) === null || _d === void 0 ? void 0 : _d[value];
5228
+ var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
5104
5229
  if (hostValue !== undefined) {
5105
5230
  return {
5106
5231
  value: toAny(hostValue),
5107
5232
  };
5108
5233
  }
5109
- if (builtin.normalExpressions[value]) {
5110
- var builtinFunction = (_b = {},
5111
- _b[FUNCTION_SYMBOL] = true,
5112
- _b.sourceCodeInfo = sourceCodeInfo,
5113
- _b.functionType = 'Builtin',
5114
- _b.n = value,
5115
- _b);
5116
- return builtinFunction;
5117
- }
5118
- var nativeJsFunction = (_e = this.nativeJsFunctions) === null || _e === void 0 ? void 0 : _e[value];
5234
+ var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
5119
5235
  if (nativeJsFunction) {
5120
5236
  return {
5121
5237
  value: nativeJsFunction,
@@ -5123,13 +5239,24 @@ var ContextStackImpl = /** @class */ (function () {
5123
5239
  }
5124
5240
  return null;
5125
5241
  };
5126
- ContextStackImpl.prototype.evaluateName = function (node) {
5242
+ ContextStackImpl.prototype.evaluateSymbol = function (node) {
5243
+ var _a;
5244
+ if (isSpecialBuiltinSymbolNode(node)) {
5245
+ throw new Error('Special builtin symbols should not be evaluated');
5246
+ }
5247
+ if (isNormalBuiltinSymbolNode(node)) {
5248
+ var type = node[1];
5249
+ return _a = {},
5250
+ _a[FUNCTION_SYMBOL] = true,
5251
+ _a.functionType = 'Builtin',
5252
+ _a.normalBuitinSymbolType = type,
5253
+ _a.sourceCodeInfo = node[2],
5254
+ _a;
5255
+ }
5127
5256
  var lookUpResult = this.lookUp(node);
5128
5257
  if (isContextEntry(lookUpResult))
5129
5258
  return lookUpResult.value;
5130
- else if (isBuiltinFunction(lookUpResult))
5131
- return lookUpResult;
5132
- throw new UndefinedSymbolError(node.value, node.sourceCodeInfo);
5259
+ throw new UndefinedSymbolError(node[1], node[2]);
5133
5260
  };
5134
5261
  return ContextStackImpl;
5135
5262
  }());
@@ -5212,10 +5339,10 @@ var nonFunctionOperators = [
5212
5339
  'cond',
5213
5340
  'def',
5214
5341
  'defined?',
5215
- 'defn',
5342
+ // 'defn',
5216
5343
  'do',
5217
5344
  'doseq',
5218
- 'fn',
5345
+ // 'fn',
5219
5346
  'if',
5220
5347
  'let',
5221
5348
  'loop',
@@ -5664,6 +5791,10 @@ function assertReservedSymbolToken(token, symbolName) {
5664
5791
  throwUnexpectedToken('ReservedSymbol', symbolName, token);
5665
5792
  }
5666
5793
  }
5794
+ function asReservedSymbolToken(token, symbolName) {
5795
+ assertReservedSymbolToken(token, symbolName);
5796
+ return token;
5797
+ }
5667
5798
  function isSingleLineCommentToken(token) {
5668
5799
  return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
5669
5800
  }
@@ -5746,6 +5877,9 @@ function assertRBraceToken(token) {
5746
5877
  throwUnexpectedToken('RBrace', undefined, token);
5747
5878
  }
5748
5879
  }
5880
+ function isStringToken(token) {
5881
+ return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
5882
+ }
5749
5883
  function isA_BinaryOperatorToken(token) {
5750
5884
  return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
5751
5885
  }
@@ -5783,6 +5917,12 @@ function untokenize(tokenStream) {
5783
5917
  var exponentiationPrecedence = 10;
5784
5918
  var binaryFunctionalOperatorPrecedence = 1;
5785
5919
  var placeholderRegexp = /^\$([1-9]\d?)?$/;
5920
+ function withSourceCodeInfo(node, sourceCodeInfo) {
5921
+ if (sourceCodeInfo) {
5922
+ node[2] = sourceCodeInfo;
5923
+ }
5924
+ return node;
5925
+ }
5786
5926
  function getPrecedence(operatorSign) {
5787
5927
  switch (operatorSign) {
5788
5928
  case '**': // exponentiation
@@ -5825,29 +5965,18 @@ function getPrecedence(operatorSign) {
5825
5965
  throw new Error("Unknown binary operator: ".concat(operatorSign));
5826
5966
  }
5827
5967
  }
5828
- function createNamedNormalExpressionNode(name, params, sourceCodeInfo) {
5829
- var node = {
5830
- type: 'NormalExpression',
5831
- name: name,
5832
- params: params,
5833
- sourceCodeInfo: sourceCodeInfo,
5834
- };
5835
- var builtinExpression = builtin.normalExpressions[node.name];
5836
- if (builtinExpression) {
5837
- assertNumberOfParams(builtinExpression.paramCount, node);
5968
+ function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
5969
+ var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
5970
+ if (isNormalBuiltinSymbolNode(symbolNode)) {
5971
+ assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
5838
5972
  }
5839
5973
  return node;
5840
5974
  }
5841
5975
  function createAccessorNode(left, right, sourceCodeInfo) {
5842
5976
  // Unnamed normal expression
5843
- return {
5844
- type: 'NormalExpression',
5845
- params: [left, right],
5846
- name: undefined,
5847
- sourceCodeInfo: sourceCodeInfo,
5848
- };
5977
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
5849
5978
  }
5850
- function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
5979
+ function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
5851
5980
  var operatorName = operator[1];
5852
5981
  switch (operatorName) {
5853
5982
  case '**': // exponentiation
@@ -5872,16 +6001,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
5872
6001
  case '&':
5873
6002
  case '^':
5874
6003
  case '|':
5875
- return createNamedNormalExpressionNode(operatorName, [left, right], sourceCodeInfo);
6004
+ return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
5876
6005
  case '&&':
5877
6006
  case '||':
5878
6007
  case '??':
5879
- return {
5880
- type: 'SpecialExpression',
5881
- name: operatorName,
5882
- params: [left, right],
5883
- sourceCodeInfo: sourceCodeInfo,
5884
- };
6008
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
5885
6009
  /* v8 ignore next 10 */
5886
6010
  case '.':
5887
6011
  case ';':
@@ -5977,9 +6101,12 @@ var Parser = /** @class */ (function () {
5977
6101
  && !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
5978
6102
  break;
5979
6103
  }
6104
+ var symbol = specialExpressionTypes[name_1]
6105
+ ? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
6106
+ : withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
5980
6107
  this.advance();
5981
6108
  var right = this.parseExpression(newPrecedece);
5982
- left = fromBinaryOperatorToAstNode(operator, left, right, operator[2]);
6109
+ left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
5983
6110
  }
5984
6111
  else if (isSymbolToken(operator)) {
5985
6112
  if (!isFunctionOperator(operator[1])) {
@@ -5989,9 +6116,12 @@ var Parser = /** @class */ (function () {
5989
6116
  if (newPrecedece <= precedence) {
5990
6117
  break;
5991
6118
  }
5992
- this.advance();
6119
+ var operatorSymbol = this.parseSymbol();
5993
6120
  var right = this.parseExpression(newPrecedece);
5994
- left = createNamedNormalExpressionNode(operator[1], [left, right], operator[2]);
6121
+ if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
6122
+ throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
6123
+ }
6124
+ left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
5995
6125
  }
5996
6126
  else {
5997
6127
  break;
@@ -6010,11 +6140,7 @@ var Parser = /** @class */ (function () {
6010
6140
  if (!isSymbolToken(symbolToken)) {
6011
6141
  throw new LitsError('Expected symbol', this.peek()[2]);
6012
6142
  }
6013
- var stringNode = {
6014
- type: 'String',
6015
- value: symbolToken[1],
6016
- sourceCodeInfo: symbolToken[2],
6017
- };
6143
+ var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
6018
6144
  operand = createAccessorNode(operand, stringNode, token[2]);
6019
6145
  this.advance();
6020
6146
  token = this.peek();
@@ -6054,16 +6180,14 @@ var Parser = /** @class */ (function () {
6054
6180
  this.advance();
6055
6181
  return expression;
6056
6182
  }
6057
- // Unary operators
6058
6183
  else if (isOperatorToken(token)) {
6059
6184
  var operatorName = token[1];
6060
6185
  if (isBinaryOperator(operatorName)) {
6061
6186
  this.advance();
6062
- return {
6063
- type: 'Symbol',
6064
- value: operatorName,
6065
- sourceCodeInfo: token[2],
6066
- };
6187
+ if (specialExpressionTypes[operatorName] !== undefined) {
6188
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
6189
+ }
6190
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
6067
6191
  }
6068
6192
  if (operatorName === '->') {
6069
6193
  return this.parseShorthandLamdaFunction();
@@ -6111,22 +6235,24 @@ var Parser = /** @class */ (function () {
6111
6235
  while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
6112
6236
  if (isOperatorToken(this.peek(), '...')) {
6113
6237
  this.advance();
6114
- params.push({
6115
- type: 'Spread',
6116
- value: this.parseExpression(),
6117
- sourceCodeInfo: this.peek()[2],
6118
- });
6238
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6119
6239
  }
6120
6240
  else {
6121
- var key = this.parseOperand();
6122
- if (key.type !== 'Symbol' && key.type !== 'String') {
6241
+ var token = this.peek();
6242
+ if (isStringToken(token)) {
6243
+ var stringNode = this.parseString();
6244
+ params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
6245
+ }
6246
+ else if (isSymbolToken(token)) {
6247
+ var value = token[1].startsWith('\'')
6248
+ ? this.stringFromQuotedSymbol(token[1])
6249
+ : token[1];
6250
+ params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
6251
+ this.advance();
6252
+ }
6253
+ else {
6123
6254
  throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
6124
6255
  }
6125
- params.push({
6126
- type: 'String',
6127
- value: key.value,
6128
- sourceCodeInfo: key.sourceCodeInfo,
6129
- });
6130
6256
  assertOperatorToken(this.peek(), ':=');
6131
6257
  this.advance();
6132
6258
  params.push(this.parseExpression());
@@ -6141,12 +6267,7 @@ var Parser = /** @class */ (function () {
6141
6267
  }
6142
6268
  assertRBraceToken(this.peek());
6143
6269
  this.advance();
6144
- return {
6145
- type: 'SpecialExpression',
6146
- name: 'object',
6147
- params: params,
6148
- sourceCodeInfo: firstToken[2],
6149
- };
6270
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
6150
6271
  };
6151
6272
  Parser.prototype.parseArray = function () {
6152
6273
  var firstToken = asLBracketToken(this.peek());
@@ -6155,11 +6276,7 @@ var Parser = /** @class */ (function () {
6155
6276
  while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
6156
6277
  if (isOperatorToken(this.peek(), '...')) {
6157
6278
  this.advance();
6158
- params.push({
6159
- type: 'Spread',
6160
- value: this.parseExpression(),
6161
- sourceCodeInfo: this.peek()[2],
6162
- });
6279
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6163
6280
  }
6164
6281
  else {
6165
6282
  params.push(this.parseExpression());
@@ -6174,15 +6291,9 @@ var Parser = /** @class */ (function () {
6174
6291
  }
6175
6292
  assertRBracketToken(this.peek());
6176
6293
  this.advance();
6177
- return {
6178
- type: 'SpecialExpression',
6179
- name: 'array',
6180
- params: params,
6181
- sourceCodeInfo: firstToken[2],
6182
- };
6294
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
6183
6295
  };
6184
6296
  Parser.prototype.parseFunctionCall = function (symbol) {
6185
- var isNamedFunction = symbol.type === 'Symbol';
6186
6297
  this.advance();
6187
6298
  var params = [];
6188
6299
  while (!this.isAtEnd() && !isRParenToken(this.peek())) {
@@ -6199,45 +6310,57 @@ var Parser = /** @class */ (function () {
6199
6310
  throw new LitsError('Expected closing parenthesis', this.peek()[2]);
6200
6311
  }
6201
6312
  this.advance();
6202
- if (isNamedFunction) {
6203
- if (specialExpressionKeys.includes(symbol.value)) {
6204
- var name_2 = symbol.value;
6205
- switch (name_2) {
6206
- case '??':
6207
- case '&&':
6208
- case 'defined?':
6209
- case '||':
6210
- case 'recur':
6211
- case 'array':
6212
- case 'object':
6213
- case 'throw': {
6214
- var node = {
6215
- type: 'SpecialExpression',
6216
- name: name_2,
6217
- params: params,
6218
- sourceCodeInfo: symbol.sourceCodeInfo,
6219
- };
6220
- assertNumberOfParams(builtin.specialExpressions[node.name].paramCount, node);
6221
- return node;
6313
+ if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
6314
+ var specialExpressionType = symbol[1];
6315
+ var type = specialExpressionType;
6316
+ switch (type) {
6317
+ case specialExpressionTypes['||']:
6318
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6319
+ case specialExpressionTypes['&&']:
6320
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6321
+ case specialExpressionTypes.recur:
6322
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6323
+ case specialExpressionTypes.array:
6324
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6325
+ case specialExpressionTypes.object:
6326
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6327
+ case specialExpressionTypes['??']: {
6328
+ if (params.length === 1) {
6329
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
6222
6330
  }
6223
- case 'fn':
6224
- case 'def':
6225
- case 'defn':
6226
- throw new Error("".concat(name_2, " is not allowed"));
6227
- /* v8 ignore next 2 */
6228
- default:
6229
- throw new Error("Unknown special expression: ".concat(name_2));
6331
+ if (params.length === 2) {
6332
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
6333
+ }
6334
+ throw new LitsError('Expected exactly two parameters', symbol[2]);
6230
6335
  }
6336
+ case specialExpressionTypes['defined?']: {
6337
+ if (params.length !== 1) {
6338
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6339
+ }
6340
+ var _a = __read(params, 1), param = _a[0];
6341
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6342
+ }
6343
+ case specialExpressionTypes.throw: {
6344
+ if (params.length !== 1) {
6345
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6346
+ }
6347
+ var _b = __read(params, 1), param = _b[0];
6348
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6349
+ }
6350
+ case specialExpressionTypes['0_fn']:
6351
+ case specialExpressionTypes['0_def']:
6352
+ case specialExpressionTypes['0_defn']:
6353
+ throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
6354
+ /* v8 ignore next 2 */
6355
+ default:
6356
+ throw new Error("Unknown special expression: ".concat(type));
6231
6357
  }
6232
- return createNamedNormalExpressionNode(symbol.value, params, symbol.sourceCodeInfo);
6358
+ }
6359
+ else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
6360
+ return createNamedNormalExpressionNode(symbol, params, symbol[2]);
6233
6361
  }
6234
6362
  else {
6235
- return {
6236
- type: 'NormalExpression',
6237
- name: undefined,
6238
- params: __spreadArray([symbol], __read(params), false),
6239
- sourceCodeInfo: symbol.sourceCodeInfo,
6240
- };
6363
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
6241
6364
  }
6242
6365
  };
6243
6366
  Parser.prototype.parseLambdaFunction = function () {
@@ -6254,16 +6377,10 @@ var Parser = /** @class */ (function () {
6254
6377
  }
6255
6378
  this.advance();
6256
6379
  var body = this.parseExpression();
6257
- return {
6258
- type: 'SpecialExpression',
6259
- name: 'fn',
6260
- params: [],
6261
- function: {
6262
- arguments: functionArguments,
6263
- body: [body],
6264
- },
6265
- sourceCodeInfo: firstToken[2],
6266
- };
6380
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
6381
+ functionArguments,
6382
+ [body],
6383
+ ]]], firstToken[2]);
6267
6384
  }
6268
6385
  catch (_a) {
6269
6386
  return null;
@@ -6272,11 +6389,7 @@ var Parser = /** @class */ (function () {
6272
6389
  Parser.prototype.parseFunctionArguments = function () {
6273
6390
  var firstToken = this.peek();
6274
6391
  if (isSymbolToken(firstToken)) {
6275
- return [{
6276
- type: 'symbol',
6277
- name: this.parseSymbol().value,
6278
- sourceCodeInfo: firstToken[2],
6279
- }];
6392
+ return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
6280
6393
  }
6281
6394
  assertLParenToken(firstToken);
6282
6395
  this.advance();
@@ -6288,13 +6401,13 @@ var Parser = /** @class */ (function () {
6288
6401
  throw new LitsError('Rest argument must be last', this.peek()[2]);
6289
6402
  }
6290
6403
  var bindingTarget = this.parseBindingTarget();
6291
- if (bindingTarget.default) {
6404
+ if (bindingTarget[1][1] !== undefined) {
6292
6405
  defaults = true;
6293
6406
  }
6294
- if (bindingTarget.type === 'rest') {
6407
+ if (bindingTarget[0] === bindingTargetTypes.rest) {
6295
6408
  rest = true;
6296
6409
  }
6297
- if (defaults && !bindingTarget.default) {
6410
+ if (defaults && !bindingTarget[1][1]) {
6298
6411
  throw new LitsError('Default arguments must be last', this.peek()[2]);
6299
6412
  }
6300
6413
  functionArguments.push(bindingTarget);
@@ -6341,22 +6454,16 @@ var Parser = /** @class */ (function () {
6341
6454
  var functionArguments = [];
6342
6455
  for (var i = 1; i <= arity; i += 1) {
6343
6456
  if (i === 1 && dollar1 === 'NAKED') {
6344
- functionArguments.push({ type: 'symbol', name: '$', sourceCodeInfo: firstToken[2] });
6457
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
6345
6458
  }
6346
6459
  else {
6347
- functionArguments.push({ type: 'symbol', name: "$".concat(i), sourceCodeInfo: firstToken[2] });
6348
- }
6349
- }
6350
- var node = {
6351
- type: 'SpecialExpression',
6352
- name: 'fn',
6353
- params: [],
6354
- function: {
6355
- arguments: functionArguments,
6356
- body: [exprNode],
6357
- },
6358
- sourceCodeInfo: firstToken[2],
6359
- };
6460
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
6461
+ }
6462
+ }
6463
+ var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
6464
+ functionArguments,
6465
+ [exprNode],
6466
+ ]]], firstToken[2]);
6360
6467
  return node;
6361
6468
  };
6362
6469
  Parser.prototype.parseOptionalDefaulValue = function () {
@@ -6372,16 +6479,14 @@ var Parser = /** @class */ (function () {
6372
6479
  // Symbol
6373
6480
  if (isSymbolToken(firstToken)) {
6374
6481
  var symbol = this.parseSymbol();
6482
+ if (!isUserDefinedSymbolNode(symbol)) {
6483
+ throw new LitsError('Expected user defined symbol', firstToken[2]);
6484
+ }
6375
6485
  var defaultValue = this.parseOptionalDefaulValue();
6376
6486
  if (requireDefaultValue && !defaultValue) {
6377
6487
  throw new LitsError('Expected assignment', this.peek()[2]);
6378
6488
  }
6379
- return {
6380
- type: 'symbol',
6381
- name: symbol.value,
6382
- default: defaultValue,
6383
- sourceCodeInfo: firstToken[2],
6384
- };
6489
+ return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
6385
6490
  }
6386
6491
  // Rest
6387
6492
  if (isOperatorToken(firstToken, '...')) {
@@ -6389,15 +6494,11 @@ var Parser = /** @class */ (function () {
6389
6494
  throw new LitsError('Rest element not allowed', firstToken[2]);
6390
6495
  }
6391
6496
  this.advance();
6392
- var symbol = this.parseSymbol();
6497
+ var symbol = asUserDefinedSymbolNode(this.parseSymbol());
6393
6498
  if (isOperatorToken(this.peek(), ':=')) {
6394
6499
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6395
6500
  }
6396
- return {
6397
- type: 'rest',
6398
- name: symbol.value,
6399
- sourceCodeInfo: firstToken[2],
6400
- };
6501
+ return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
6401
6502
  }
6402
6503
  // Array
6403
6504
  if (isLBracketToken(firstToken)) {
@@ -6416,7 +6517,7 @@ var Parser = /** @class */ (function () {
6416
6517
  continue;
6417
6518
  }
6418
6519
  var target = this.parseBindingTarget();
6419
- if (target.type === 'rest') {
6520
+ if (target[0] === bindingTargetTypes.rest) {
6420
6521
  rest = true;
6421
6522
  }
6422
6523
  elements.push(target);
@@ -6432,12 +6533,7 @@ var Parser = /** @class */ (function () {
6432
6533
  if (requireDefaultValue && !defaultValue) {
6433
6534
  throw new LitsError('Expected assignment', this.peek()[2]);
6434
6535
  }
6435
- return {
6436
- type: 'array',
6437
- elements: elements,
6438
- default: defaultValue,
6439
- sourceCodeInfo: firstToken[2],
6440
- };
6536
+ return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
6441
6537
  }
6442
6538
  // Object
6443
6539
  if (isLBraceToken(firstToken)) {
@@ -6453,40 +6549,32 @@ var Parser = /** @class */ (function () {
6453
6549
  rest = true;
6454
6550
  this.advance();
6455
6551
  }
6456
- var key = this.parseSymbol().value;
6552
+ var key = asUserDefinedSymbolNode(this.parseSymbol());
6457
6553
  token = this.peek();
6458
6554
  if (isReservedSymbolToken(token, 'as')) {
6459
6555
  if (rest) {
6460
6556
  throw new LitsError('Rest argument can not have alias', token[2]);
6461
6557
  }
6462
6558
  this.advance();
6463
- var name_3 = this.parseSymbol().value;
6464
- if (elements[name_3]) {
6465
- throw new LitsError("Duplicate binding name: ".concat(name_3), token[2]);
6559
+ var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
6560
+ if (elements[name_2[1]]) {
6561
+ throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
6466
6562
  }
6467
- elements[key] = {
6468
- type: 'symbol',
6469
- name: name_3,
6470
- default: this.parseOptionalDefaulValue(),
6471
- sourceCodeInfo: firstToken[2],
6472
- };
6563
+ elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
6473
6564
  }
6474
6565
  else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
6475
- if (elements[key]) {
6566
+ if (elements[key[1]]) {
6476
6567
  throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
6477
6568
  }
6478
6569
  if (rest && isOperatorToken(this.peek(), ':=')) {
6479
6570
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6480
6571
  }
6481
- elements[key] = {
6482
- type: rest ? 'rest' : 'symbol',
6483
- name: key,
6484
- default: this.parseOptionalDefaulValue(),
6485
- sourceCodeInfo: firstToken[2],
6486
- };
6572
+ elements[key[1]] = rest
6573
+ ? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
6574
+ : withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
6487
6575
  }
6488
6576
  else if (isLBraceToken(token) || isLBracketToken(token)) {
6489
- elements[key] = this.parseBindingTarget();
6577
+ elements[key[1]] = this.parseBindingTarget();
6490
6578
  }
6491
6579
  if (!isRBraceToken(this.peek())) {
6492
6580
  assertOperatorToken(this.peek(), ',');
@@ -6500,12 +6588,7 @@ var Parser = /** @class */ (function () {
6500
6588
  if (requireDefaultValue && !defaultValue) {
6501
6589
  throw new LitsError('Expected assignment', token[2]);
6502
6590
  }
6503
- return {
6504
- type: 'object',
6505
- elements: elements,
6506
- default: defaultValue,
6507
- sourceCodeInfo: firstToken[2],
6508
- };
6591
+ return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
6509
6592
  }
6510
6593
  throw new LitsError('Expected symbol', this.peek()[2]);
6511
6594
  };
@@ -6513,22 +6596,13 @@ var Parser = /** @class */ (function () {
6513
6596
  if (optionalSemicolon === void 0) { optionalSemicolon = false; }
6514
6597
  this.advance();
6515
6598
  var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
6516
- var value = target.default;
6517
- delete target.default;
6599
+ var value = target[1][1];
6600
+ target[1][1] = undefined;
6518
6601
  if (!optionalSemicolon) {
6519
6602
  assertOperatorToken(this.peek(), ';');
6520
6603
  }
6521
- return {
6522
- type: 'SpecialExpression',
6523
- name: 'let',
6524
- bindingNode: {
6525
- type: 'Binding',
6526
- target: target,
6527
- value: value,
6528
- sourceCodeInfo: token[2],
6529
- },
6530
- sourceCodeInfo: token[2],
6531
- };
6604
+ var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
6605
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
6532
6606
  };
6533
6607
  Parser.prototype.parseDo = function (token) {
6534
6608
  this.advance();
@@ -6544,12 +6618,7 @@ var Parser = /** @class */ (function () {
6544
6618
  }
6545
6619
  assertReservedSymbolToken(this.peek(), 'end');
6546
6620
  this.advance();
6547
- return {
6548
- type: 'SpecialExpression',
6549
- name: 'do',
6550
- params: expressions,
6551
- sourceCodeInfo: token[2],
6552
- };
6621
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6553
6622
  };
6554
6623
  Parser.prototype.parseLoop = function (firstToken) {
6555
6624
  this.advance();
@@ -6559,14 +6628,9 @@ var Parser = /** @class */ (function () {
6559
6628
  assertSymbolToken(token, 'let');
6560
6629
  this.advance();
6561
6630
  var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
6562
- var value = target.default;
6563
- delete target.default;
6564
- bindingNodes.push({
6565
- type: 'Binding',
6566
- target: target,
6567
- value: value,
6568
- sourceCodeInfo: token[2],
6569
- });
6631
+ var value = target[1][1];
6632
+ target[1][1] = undefined;
6633
+ bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
6570
6634
  if (isOperatorToken(this.peek(), ',')) {
6571
6635
  this.advance();
6572
6636
  }
@@ -6589,13 +6653,7 @@ var Parser = /** @class */ (function () {
6589
6653
  }
6590
6654
  assertReservedSymbolToken(this.peek(), 'end');
6591
6655
  this.advance();
6592
- return {
6593
- type: 'SpecialExpression',
6594
- name: 'loop',
6595
- params: params,
6596
- bindingNodes: bindingNodes,
6597
- sourceCodeInfo: firstToken[2],
6598
- };
6656
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
6599
6657
  };
6600
6658
  Parser.prototype.parseTry = function (token) {
6601
6659
  this.advance();
@@ -6611,12 +6669,7 @@ var Parser = /** @class */ (function () {
6611
6669
  }
6612
6670
  var tryExpression = tryExpressions.length === 1
6613
6671
  ? tryExpressions[0]
6614
- : {
6615
- type: 'SpecialExpression',
6616
- name: 'do',
6617
- params: tryExpressions,
6618
- sourceCodeInfo: token[2],
6619
- };
6672
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
6620
6673
  assertReservedSymbolToken(this.peek(), 'catch');
6621
6674
  this.advance();
6622
6675
  var errorSymbol;
@@ -6640,20 +6693,8 @@ var Parser = /** @class */ (function () {
6640
6693
  this.advance();
6641
6694
  var catchExpression = catchExpressions.length === 1
6642
6695
  ? catchExpressions[0]
6643
- : {
6644
- type: 'SpecialExpression',
6645
- name: 'do',
6646
- params: catchExpressions,
6647
- sourceCodeInfo: token[2],
6648
- };
6649
- return {
6650
- type: 'SpecialExpression',
6651
- name: 'try',
6652
- params: [tryExpression],
6653
- ce: catchExpression,
6654
- e: errorSymbol,
6655
- sourceCodeInfo: token[2],
6656
- };
6696
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
6697
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
6657
6698
  };
6658
6699
  Parser.prototype.parseForOrDoseq = function (firstToken) {
6659
6700
  var isDoseq = firstToken[1] === 'doseq';
@@ -6661,10 +6702,10 @@ var Parser = /** @class */ (function () {
6661
6702
  var forLoopBindings = [];
6662
6703
  var _loop_1 = function () {
6663
6704
  var loopBinding = this_1.parseForLoopBinding();
6664
- var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b.b.target)); });
6665
- var newBoundNames = getAllBindingTargetNames(loopBinding.b.target);
6705
+ var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
6706
+ var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
6666
6707
  if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
6667
- throw new LitsError('Duplicate binding', loopBinding.b.sourceCodeInfo);
6708
+ throw new LitsError('Duplicate binding', loopBinding[0][2]);
6668
6709
  }
6669
6710
  forLoopBindings.push(loopBinding);
6670
6711
  };
@@ -6686,13 +6727,9 @@ var Parser = /** @class */ (function () {
6686
6727
  }
6687
6728
  assertReservedSymbolToken(this.peek(), 'end');
6688
6729
  this.advance();
6689
- return {
6690
- type: 'SpecialExpression',
6691
- name: isDoseq ? 'doseq' : 'for',
6692
- params: expressions,
6693
- sourceCodeInfo: firstToken[2],
6694
- l: forLoopBindings,
6695
- };
6730
+ return isDoseq
6731
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
6732
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
6696
6733
  };
6697
6734
  Parser.prototype.parseForLoopBinding = function () {
6698
6735
  assertReservedSymbolToken(this.peek(), 'each');
@@ -6714,18 +6751,17 @@ var Parser = /** @class */ (function () {
6714
6751
  && !isReservedSymbolToken(token, 'each')) {
6715
6752
  throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
6716
6753
  }
6717
- var letBindings;
6754
+ var letBindings = [];
6718
6755
  if (token[1] === 'let') {
6719
6756
  modifiers.push('&let');
6720
- letBindings = [];
6721
6757
  var _loop_2 = function () {
6722
6758
  var letNode = this_2.parseLet(token, true);
6723
- var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b.target)); });
6724
- var newBoundNames = Object.keys(getAllBindingTargetNames(letNode.bindingNode.target));
6759
+ var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
6760
+ var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
6725
6761
  if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
6726
- throw new LitsError('Duplicate binding', letNode.bindingNode.sourceCodeInfo);
6762
+ throw new LitsError('Duplicate binding', letNode[1][1][2]);
6727
6763
  }
6728
- letBindings.push(letNode.bindingNode);
6764
+ letBindings.push(letNode[1][1]);
6729
6765
  token = this_2.peek();
6730
6766
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
6731
6767
  throw new LitsError('Expected do, each or comma', token[2]);
@@ -6771,31 +6807,21 @@ var Parser = /** @class */ (function () {
6771
6807
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
6772
6808
  throw new LitsError('Expected do or each', token[2]);
6773
6809
  }
6774
- return {
6775
- b: bindingNode,
6776
- m: modifiers,
6777
- l: letBindings,
6778
- wn: whenNode,
6779
- we: whileNode,
6780
- };
6810
+ return [bindingNode, letBindings, whenNode, whileNode];
6781
6811
  };
6782
6812
  Parser.prototype.parseBinding = function () {
6783
6813
  var firstToken = asSymbolToken(this.peek());
6784
- var name = firstToken[1];
6785
- this.advance();
6814
+ var name = asUserDefinedSymbolNode(this.parseSymbol());
6786
6815
  assertReservedSymbolToken(this.peek(), 'in');
6787
6816
  this.advance();
6788
6817
  var value = this.parseExpression();
6789
- var node = {
6790
- type: 'Binding',
6791
- target: {
6792
- type: 'symbol',
6793
- name: name,
6794
- sourceCodeInfo: firstToken[2],
6795
- },
6796
- value: value,
6797
- sourceCodeInfo: firstToken[2],
6798
- };
6818
+ var node = withSourceCodeInfo([
6819
+ NodeTypes.Binding,
6820
+ [
6821
+ withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
6822
+ value,
6823
+ ],
6824
+ ], firstToken[2]);
6799
6825
  return node;
6800
6826
  };
6801
6827
  Parser.prototype.parseIfOrUnless = function (token) {
@@ -6818,12 +6844,7 @@ var Parser = /** @class */ (function () {
6818
6844
  }
6819
6845
  var thenExpression = thenExpressions.length === 1
6820
6846
  ? thenExpressions[0]
6821
- : {
6822
- type: 'SpecialExpression',
6823
- name: 'do',
6824
- params: thenExpressions,
6825
- sourceCodeInfo: token[2],
6826
- };
6847
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
6827
6848
  var elseExpression;
6828
6849
  if (isReservedSymbolToken(this.peek(), 'else')) {
6829
6850
  this.advance();
@@ -6839,25 +6860,13 @@ var Parser = /** @class */ (function () {
6839
6860
  }
6840
6861
  elseExpression = elseExpressions.length === 1
6841
6862
  ? elseExpressions[0]
6842
- : {
6843
- type: 'SpecialExpression',
6844
- name: 'do',
6845
- params: elseExpressions,
6846
- sourceCodeInfo: token[2],
6847
- };
6863
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
6848
6864
  }
6849
6865
  assertReservedSymbolToken(this.peek(), 'end');
6850
6866
  this.advance();
6851
- var params = [condition, thenExpression];
6852
- if (elseExpression) {
6853
- params.push(elseExpression);
6854
- }
6855
- return {
6856
- type: 'SpecialExpression',
6857
- name: isUnless ? 'unless' : 'if',
6858
- params: params,
6859
- sourceCodeInfo: token[2],
6860
- };
6867
+ return isUnless
6868
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
6869
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
6861
6870
  };
6862
6871
  Parser.prototype.parseCond = function (token) {
6863
6872
  this.advance();
@@ -6865,7 +6874,7 @@ var Parser = /** @class */ (function () {
6865
6874
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6866
6875
  assertReservedSymbolToken(this.peek(), 'case');
6867
6876
  this.advance();
6868
- params.push(this.parseExpression());
6877
+ var caseExpression = this.parseExpression();
6869
6878
  assertReservedSymbolToken(this.peek(), 'then');
6870
6879
  this.advance();
6871
6880
  var expressions = [];
@@ -6880,14 +6889,10 @@ var Parser = /** @class */ (function () {
6880
6889
  throw new LitsError('Expected ;', this.peek()[2]);
6881
6890
  }
6882
6891
  }
6883
- params.push(expressions.length === 1
6892
+ var thenExpression = expressions.length === 1
6884
6893
  ? expressions[0]
6885
- : {
6886
- type: 'SpecialExpression',
6887
- name: 'do',
6888
- params: expressions,
6889
- sourceCodeInfo: token[2],
6890
- });
6894
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6895
+ params.push([caseExpression, thenExpression]);
6891
6896
  if (isReservedSymbolToken(this.peek(), 'end')) {
6892
6897
  break;
6893
6898
  }
@@ -6895,20 +6900,16 @@ var Parser = /** @class */ (function () {
6895
6900
  }
6896
6901
  assertReservedSymbolToken(this.peek(), 'end');
6897
6902
  this.advance();
6898
- return {
6899
- type: 'SpecialExpression',
6900
- name: 'cond',
6901
- params: params,
6902
- sourceCodeInfo: token[2],
6903
- };
6903
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
6904
6904
  };
6905
6905
  Parser.prototype.parseSwitch = function (token) {
6906
6906
  this.advance();
6907
- var params = [this.parseExpression()];
6907
+ var valueExpression = this.parseExpression();
6908
+ var params = [];
6908
6909
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6909
6910
  assertReservedSymbolToken(this.peek(), 'case');
6910
6911
  this.advance();
6911
- params.push(this.parseExpression());
6912
+ var caseExpression = this.parseExpression();
6912
6913
  assertReservedSymbolToken(this.peek(), 'then');
6913
6914
  this.advance();
6914
6915
  var expressions = [];
@@ -6923,14 +6924,10 @@ var Parser = /** @class */ (function () {
6923
6924
  throw new LitsError('Expected ;', this.peek()[2]);
6924
6925
  }
6925
6926
  }
6926
- params.push(expressions.length === 1
6927
+ var thenExpression = expressions.length === 1
6927
6928
  ? expressions[0]
6928
- : {
6929
- type: 'SpecialExpression',
6930
- name: 'do',
6931
- params: expressions,
6932
- sourceCodeInfo: token[2],
6933
- });
6929
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6930
+ params.push([caseExpression, thenExpression]);
6934
6931
  if (isReservedSymbolToken(this.peek(), 'end')) {
6935
6932
  break;
6936
6933
  }
@@ -6938,12 +6935,7 @@ var Parser = /** @class */ (function () {
6938
6935
  }
6939
6936
  assertReservedSymbolToken(this.peek(), 'end');
6940
6937
  this.advance();
6941
- return {
6942
- type: 'SpecialExpression',
6943
- name: 'switch',
6944
- params: params,
6945
- sourceCodeInfo: token[2],
6946
- };
6938
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
6947
6939
  };
6948
6940
  Parser.prototype.parseFunction = function (token) {
6949
6941
  this.advance();
@@ -6962,17 +6954,10 @@ var Parser = /** @class */ (function () {
6962
6954
  assertReservedSymbolToken(this.peek(), 'end');
6963
6955
  this.advance();
6964
6956
  assertOperatorToken(this.peek(), ';');
6965
- return {
6966
- type: 'SpecialExpression',
6967
- name: 'function',
6968
- functionName: symbol,
6969
- params: [],
6970
- function: {
6971
- arguments: functionArguments,
6972
- body: body,
6973
- },
6974
- sourceCodeInfo: token[2],
6975
- };
6957
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
6958
+ functionArguments,
6959
+ body,
6960
+ ]]], token[2]);
6976
6961
  };
6977
6962
  Parser.prototype.isAtEnd = function () {
6978
6963
  return this.parseState.position >= this.tokenStream.tokens.length;
@@ -6994,7 +6979,7 @@ var Parser = /** @class */ (function () {
6994
6979
  this.advance();
6995
6980
  if (isSymbolToken(this.peek(), 'let')) {
6996
6981
  var letNode = this.parseLet(asSymbolToken(this.peek()));
6997
- return __assign(__assign({}, letNode), { name: 'def' });
6982
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_def'], letNode[1][1]]], token[2]);
6998
6983
  }
6999
6984
  else if (isReservedSymbolToken(this.peek(), 'function')) {
7000
6985
  this.advance();
@@ -7012,71 +6997,57 @@ var Parser = /** @class */ (function () {
7012
6997
  }
7013
6998
  assertReservedSymbolToken(this.peek(), 'end');
7014
6999
  this.advance();
7015
- return {
7016
- type: 'SpecialExpression',
7017
- name: 'defn',
7018
- functionName: symbol,
7019
- params: [],
7020
- function: {
7021
- arguments: functionArguments,
7022
- body: body,
7023
- },
7024
- sourceCodeInfo: token[2],
7025
- };
7000
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_defn'], symbol, [
7001
+ functionArguments,
7002
+ body,
7003
+ ]]], token[2]);
7026
7004
  }
7027
7005
  else {
7028
7006
  throw new LitsError('Expected let or function', this.peek()[2]);
7029
7007
  }
7030
7008
  };
7009
+ Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
7010
+ if (specialExpressionTypes[value] !== undefined && value !== 'fn' && value !== 'def' && value !== 'defn') {
7011
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
7012
+ }
7013
+ if (normalExpressionTypes[value] !== undefined) {
7014
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
7015
+ }
7016
+ return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
7017
+ };
7018
+ Parser.prototype.stringFromQuotedSymbol = function (value) {
7019
+ return value.substring(1, value.length - 1)
7020
+ .replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
7021
+ if (backslash) {
7022
+ return '\\';
7023
+ }
7024
+ if (singleQuote) {
7025
+ return '\'';
7026
+ }
7027
+ return "\\".concat(normalChar);
7028
+ });
7029
+ };
7031
7030
  Parser.prototype.parseSymbol = function () {
7032
7031
  var token = this.peek();
7033
7032
  this.advance();
7034
7033
  if (!isSymbolToken(token)) {
7035
7034
  throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
7036
7035
  }
7037
- if (token[1][0] !== '\'') {
7038
- return {
7039
- type: 'Symbol',
7040
- value: token[1],
7041
- sourceCodeInfo: token[2],
7042
- };
7036
+ if (token[1][0] === '\'') {
7037
+ return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
7043
7038
  }
7044
7039
  else {
7045
- var value = token[1].substring(1, token[1].length - 1)
7046
- .replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
7047
- if (backslash) {
7048
- return '\\';
7049
- }
7050
- if (singleQuote) {
7051
- return '\'';
7052
- }
7053
- return "\\".concat(normalChar);
7054
- });
7055
- return {
7056
- type: 'Symbol',
7057
- value: value,
7058
- sourceCodeInfo: token[2],
7059
- };
7040
+ return this.stringToSymbolNode(token[1], token[2]);
7060
7041
  }
7061
7042
  };
7062
7043
  Parser.prototype.parseReservedSymbol = function () {
7063
- var token = this.peek();
7044
+ var token = asReservedSymbolToken(this.peek());
7064
7045
  this.advance();
7065
- if (isReservedSymbolToken(token)) {
7066
- var symbol = token[1];
7067
- if (isNumberReservedSymbol(symbol)) {
7068
- return {
7069
- type: 'Number',
7070
- value: numberReservedSymbolRecord[symbol],
7071
- sourceCodeInfo: token[2],
7072
- };
7073
- }
7046
+ var symbol = token[1];
7047
+ if (isNumberReservedSymbol(symbol)) {
7048
+ return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
7074
7049
  }
7075
- return {
7076
- type: 'ReservedSymbol',
7077
- value: token[1],
7078
- sourceCodeInfo: token[2],
7079
- };
7050
+ return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
7080
7051
  };
7081
7052
  Parser.prototype.parseNumber = function () {
7082
7053
  var token = this.peek();
@@ -7084,11 +7055,7 @@ var Parser = /** @class */ (function () {
7084
7055
  var value = token[1];
7085
7056
  var negative = value[0] === '-';
7086
7057
  var numberString = (negative ? value.substring(1) : value).replace(/_/g, '');
7087
- return {
7088
- type: 'Number',
7089
- value: negative ? -Number(numberString) : Number(numberString),
7090
- sourceCodeInfo: token[2],
7091
- };
7058
+ return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
7092
7059
  };
7093
7060
  Parser.prototype.parseString = function () {
7094
7061
  var token = this.peek();
@@ -7120,11 +7087,7 @@ var Parser = /** @class */ (function () {
7120
7087
  }
7121
7088
  return normalChar;
7122
7089
  });
7123
- return {
7124
- type: 'String',
7125
- value: value,
7126
- sourceCodeInfo: token[2],
7127
- };
7090
+ return withSourceCodeInfo([NodeTypes.String, value], token[2]);
7128
7091
  };
7129
7092
  Parser.prototype.parseRegexpShorthand = function () {
7130
7093
  var token = this.peek();
@@ -7132,22 +7095,15 @@ var Parser = /** @class */ (function () {
7132
7095
  var endStringPosition = token[1].lastIndexOf('"');
7133
7096
  var regexpString = token[1].substring(2, endStringPosition);
7134
7097
  var optionsString = token[1].substring(endStringPosition + 1);
7135
- var stringNode = {
7136
- type: 'String',
7137
- value: regexpString,
7138
- sourceCodeInfo: token[2],
7139
- };
7140
- var optionsNode = {
7141
- type: 'String',
7142
- value: optionsString,
7143
- sourceCodeInfo: token[2],
7144
- };
7145
- var node = {
7146
- type: 'NormalExpression',
7147
- name: 'regexp',
7148
- params: [stringNode, optionsNode],
7149
- sourceCodeInfo: token[2],
7150
- };
7098
+ var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
7099
+ var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
7100
+ var node = withSourceCodeInfo([
7101
+ NodeTypes.NormalExpression,
7102
+ [
7103
+ withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
7104
+ [stringNode, optionsNode],
7105
+ ],
7106
+ ], token[2]);
7151
7107
  return node;
7152
7108
  };
7153
7109
  return Parser;
@@ -7264,7 +7220,7 @@ var Lits = /** @class */ (function () {
7264
7220
  if (params === void 0) { params = {}; }
7265
7221
  var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
7266
7222
  var contextStack = createContextStack(params);
7267
- return getUndefinedSymbols(ast, contextStack, builtin, evaluateAstNode);
7223
+ return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
7268
7224
  };
7269
7225
  Lits.prototype.tokenize = function (program, tokenizeParams) {
7270
7226
  if (tokenizeParams === void 0) { tokenizeParams = {}; }