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