@mojir/lits 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +392 -109
  2. package/dist/cli/cli.js +879 -946
  3. package/dist/cli/reference/api.d.ts +0 -1
  4. package/dist/cli/reference/index.d.ts +208 -208
  5. package/dist/cli/src/builtin/bindingNode.d.ts +3 -2
  6. package/dist/cli/src/builtin/index.d.ts +10 -50
  7. package/dist/cli/src/builtin/interface.d.ts +10 -17
  8. package/dist/cli/src/builtin/normalExpressions/index.d.ts +4 -1
  9. package/dist/cli/src/builtin/specialExpressionTypes.d.ts +25 -0
  10. package/dist/cli/src/builtin/specialExpressions/and.d.ts +3 -3
  11. package/dist/cli/src/builtin/specialExpressions/array.d.ts +3 -3
  12. package/dist/cli/src/builtin/specialExpressions/cond.d.ts +3 -3
  13. package/dist/cli/src/builtin/specialExpressions/def.d.ts +3 -6
  14. package/dist/cli/src/builtin/specialExpressions/defined.d.ts +5 -0
  15. package/dist/cli/src/builtin/specialExpressions/do.d.ts +3 -3
  16. package/dist/cli/src/builtin/specialExpressions/functions.d.ts +5 -13
  17. package/dist/cli/src/builtin/specialExpressions/if.d.ts +3 -3
  18. package/dist/cli/src/builtin/specialExpressions/let.d.ts +3 -6
  19. package/dist/cli/src/builtin/specialExpressions/loop.d.ts +3 -4
  20. package/dist/cli/src/builtin/specialExpressions/loops.d.ts +5 -14
  21. package/dist/cli/src/builtin/specialExpressions/object.d.ts +3 -3
  22. package/dist/cli/src/builtin/specialExpressions/or.d.ts +3 -3
  23. package/dist/cli/src/builtin/specialExpressions/qq.d.ts +3 -3
  24. package/dist/cli/src/builtin/specialExpressions/recur.d.ts +3 -3
  25. package/dist/cli/src/builtin/specialExpressions/switch.d.ts +3 -3
  26. package/dist/cli/src/builtin/specialExpressions/throw.d.ts +3 -3
  27. package/dist/cli/src/builtin/specialExpressions/try.d.ts +3 -5
  28. package/dist/cli/src/builtin/specialExpressions/unless.d.ts +3 -3
  29. package/dist/cli/src/builtin/utils.d.ts +2 -5
  30. package/dist/cli/src/constants/constants.d.ts +15 -3
  31. package/dist/cli/src/evaluator/ContextStack.d.ts +3 -3
  32. package/dist/cli/src/evaluator/functionExecutors.d.ts +3 -3
  33. package/dist/cli/src/evaluator/index.d.ts +2 -2
  34. package/dist/cli/src/evaluator/interface.d.ts +3 -3
  35. package/dist/cli/src/getUndefinedSymbols/index.d.ts +3 -3
  36. package/dist/cli/src/parser/Parser.d.ts +7 -5
  37. package/dist/cli/src/parser/types.d.ts +33 -96
  38. package/dist/cli/src/typeGuards/astNode.d.ts +19 -16
  39. package/dist/cli/src/typeGuards/index.d.ts +2 -5
  40. package/dist/cli/src/typeGuards/litsFunction.d.ts +2 -2
  41. package/dist/cli/src/utils/index.d.ts +0 -1
  42. package/dist/index.esm.js +849 -913
  43. package/dist/index.esm.js.map +1 -1
  44. package/dist/index.js +849 -913
  45. package/dist/index.js.map +1 -1
  46. package/dist/lits.iife.js +849 -913
  47. package/dist/lits.iife.js.map +1 -1
  48. package/dist/reference/api.d.ts +0 -1
  49. package/dist/reference/index.d.ts +208 -208
  50. package/dist/src/builtin/bindingNode.d.ts +3 -2
  51. package/dist/src/builtin/index.d.ts +10 -50
  52. package/dist/src/builtin/interface.d.ts +10 -17
  53. package/dist/src/builtin/normalExpressions/index.d.ts +4 -1
  54. package/dist/src/builtin/specialExpressionTypes.d.ts +25 -0
  55. package/dist/src/builtin/specialExpressions/and.d.ts +3 -3
  56. package/dist/src/builtin/specialExpressions/array.d.ts +3 -3
  57. package/dist/src/builtin/specialExpressions/cond.d.ts +3 -3
  58. package/dist/src/builtin/specialExpressions/def.d.ts +3 -6
  59. package/dist/src/builtin/specialExpressions/defined.d.ts +5 -0
  60. package/dist/src/builtin/specialExpressions/do.d.ts +3 -3
  61. package/dist/src/builtin/specialExpressions/functions.d.ts +5 -13
  62. package/dist/src/builtin/specialExpressions/if.d.ts +3 -3
  63. package/dist/src/builtin/specialExpressions/let.d.ts +3 -6
  64. package/dist/src/builtin/specialExpressions/loop.d.ts +3 -4
  65. package/dist/src/builtin/specialExpressions/loops.d.ts +5 -14
  66. package/dist/src/builtin/specialExpressions/object.d.ts +3 -3
  67. package/dist/src/builtin/specialExpressions/or.d.ts +3 -3
  68. package/dist/src/builtin/specialExpressions/qq.d.ts +3 -3
  69. package/dist/src/builtin/specialExpressions/recur.d.ts +3 -3
  70. package/dist/src/builtin/specialExpressions/switch.d.ts +3 -3
  71. package/dist/src/builtin/specialExpressions/throw.d.ts +3 -3
  72. package/dist/src/builtin/specialExpressions/try.d.ts +3 -5
  73. package/dist/src/builtin/specialExpressions/unless.d.ts +3 -3
  74. package/dist/src/builtin/utils.d.ts +2 -5
  75. package/dist/src/constants/constants.d.ts +15 -3
  76. package/dist/src/evaluator/ContextStack.d.ts +3 -3
  77. package/dist/src/evaluator/functionExecutors.d.ts +3 -3
  78. package/dist/src/evaluator/index.d.ts +2 -2
  79. package/dist/src/evaluator/interface.d.ts +3 -3
  80. package/dist/src/getUndefinedSymbols/index.d.ts +3 -3
  81. package/dist/src/parser/Parser.d.ts +7 -5
  82. package/dist/src/parser/types.d.ts +33 -96
  83. package/dist/src/typeGuards/astNode.d.ts +19 -16
  84. package/dist/src/typeGuards/index.d.ts +2 -5
  85. package/dist/src/typeGuards/litsFunction.d.ts +2 -2
  86. package/dist/src/utils/index.d.ts +0 -1
  87. package/dist/testFramework.esm.js +865 -909
  88. package/dist/testFramework.esm.js.map +1 -1
  89. package/dist/testFramework.js +865 -909
  90. package/dist/testFramework.js.map +1 -1
  91. package/package.json +1 -1
  92. package/dist/cli/src/builtin/specialExpressions/declared.d.ts +0 -5
  93. package/dist/src/builtin/specialExpressions/declared.d.ts +0 -5
package/dist/cli/cli.js CHANGED
@@ -92,7 +92,7 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
92
92
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
93
93
  };
94
94
 
95
- var version = "2.1.0";
95
+ var version = "2.1.2";
96
96
 
97
97
  function getCodeMarker(sourceCodeInfo) {
98
98
  if (!sourceCodeInfo.position || !sourceCodeInfo.code)
@@ -184,23 +184,50 @@ var UndefinedSymbolError = /** @class */ (function (_super) {
184
184
  return UndefinedSymbolError;
185
185
  }(LitsError));
186
186
 
187
- var astNodeTypeNames = [
188
- 'Number',
189
- 'String',
190
- 'NormalExpression',
191
- 'SpecialExpression',
192
- 'Symbol',
193
- 'Modifier',
194
- 'ReservedSymbol',
195
- 'Binding',
196
- 'Argument',
197
- 'Partial',
198
- 'Comment',
199
- 'Spread',
200
- ];
201
- var astNodeTypeSet = new Set(astNodeTypeNames);
202
- function isAstNodeType(type) {
203
- return typeof type === 'string' && astNodeTypeSet.has(type);
187
+ var specialExpressionTypes = {
188
+ '??': 0,
189
+ '&&': 1,
190
+ '||': 2,
191
+ 'array': 3,
192
+ 'cond': 4,
193
+ '0_def': 5,
194
+ 'defined?': 6,
195
+ '0_defn': 7,
196
+ 'do': 8,
197
+ 'doseq': 9,
198
+ '0_fn': 10,
199
+ 'for': 11,
200
+ 'function': 12,
201
+ 'if': 13,
202
+ 'let': 14,
203
+ 'loop': 15,
204
+ 'object': 16,
205
+ 'recur': 17,
206
+ 'switch': 18,
207
+ 'throw': 19,
208
+ 'try': 20,
209
+ 'unless': 21,
210
+ };
211
+
212
+ var NodeTypes = {
213
+ Number: 1,
214
+ String: 2,
215
+ NormalExpression: 3,
216
+ SpecialExpression: 4,
217
+ UserDefinedSymbol: 5,
218
+ NormalBuiltinSymbol: 6,
219
+ SpecialBuiltinSymbol: 7,
220
+ ReservedSymbol: 8,
221
+ Binding: 9,
222
+ Spread: 10,
223
+ };
224
+ var NodeTypesSet = new Set(Object.values(NodeTypes));
225
+ function getNodeTypeName(type) {
226
+ return Object.keys(NodeTypes).find(function (key) { return NodeTypes[key] === type; });
227
+ }
228
+ // TODO, is this needed?
229
+ function isNodeType(type) {
230
+ return typeof type === 'number' && NodeTypesSet.has(type);
204
231
  }
205
232
  var functionTypes = [
206
233
  'UserDefined',
@@ -228,17 +255,17 @@ function isLitsFunction$1(func) {
228
255
  return false;
229
256
  return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType);
230
257
  }
231
- function isAstNode$1(value) {
232
- if (value === null || typeof value !== 'object')
258
+ function isNode(value) {
259
+ if (!Array.isArray(value) || value.length < 2)
233
260
  return false;
234
- return 'type' in value && isAstNodeType(value.type);
261
+ return isNodeType(value[0]);
235
262
  }
236
263
  function valueToString(value) {
237
264
  if (isLitsFunction$1(value))
238
265
  // eslint-disable-next-line ts/no-unsafe-member-access
239
266
  return "<function ".concat(value.name || '\u03BB', ">");
240
- if (isAstNode$1(value))
241
- return "".concat(value.type, "-node");
267
+ if (isNode(value))
268
+ return "".concat(getNodeTypeName(value[0]), "-node");
242
269
  if (value === null)
243
270
  return 'null';
244
271
  if (typeof value === 'object' && value instanceof RegExp)
@@ -254,153 +281,137 @@ function getSourceCodeInfo(anyValue, sourceCodeInfo) {
254
281
  return (_a = anyValue === null || anyValue === void 0 ? void 0 : anyValue.sourceCodeInfo) !== null && _a !== void 0 ? _a : sourceCodeInfo;
255
282
  }
256
283
 
257
- function assertNumberOfParams(count, node) {
258
- assertCount({
259
- count: count,
260
- length: node.params.length,
261
- name: node.name,
262
- sourceCodeInfo: node.sourceCodeInfo,
263
- });
284
+ function getAssertionError(typeName, value, sourceCodeInfo) {
285
+ return new LitsError("Expected ".concat(typeName, ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
264
286
  }
265
- function isNonUndefined(value) {
266
- return value !== undefined;
287
+
288
+ function isSymbolNode(node) {
289
+ var nodeType = node[0];
290
+ return NodeTypes.UserDefinedSymbol === nodeType
291
+ || NodeTypes.NormalBuiltinSymbol === nodeType
292
+ || NodeTypes.SpecialBuiltinSymbol === nodeType;
267
293
  }
268
- function asNonUndefined(value, sourceCodeInfo) {
269
- assertNonUndefined(value, sourceCodeInfo);
270
- return value;
294
+ function assertSymbolNode(node, sourceCodeInfo) {
295
+ if (!isSymbolNode(node))
296
+ throw getAssertionError('SymbolNode', node, sourceCodeInfo);
271
297
  }
272
- function assertNonUndefined(value, sourceCodeInfo) {
273
- if (!isNonUndefined(value))
274
- throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
298
+ function isUserDefinedSymbolNode(node) {
299
+ return NodeTypes.UserDefinedSymbol === node[0];
275
300
  }
276
- function isUnknownRecord(value) {
277
- return value !== null && typeof value === 'object' && !Array.isArray(value);
301
+ function asUserDefinedSymbolNode(node, sourceCodeInfo) {
302
+ assertUserDefinedSymbolNode(node, sourceCodeInfo);
303
+ return node;
278
304
  }
279
- function assertUnknownRecord(value, sourceCodeInfo) {
280
- if (!isUnknownRecord(value)) {
281
- throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
282
- }
305
+ function assertUserDefinedSymbolNode(node, sourceCodeInfo) {
306
+ if (!isUserDefinedSymbolNode(node))
307
+ throw getAssertionError('UserDefinedSymbolNode', node, sourceCodeInfo);
283
308
  }
284
- function assertCount(_a) {
285
- var count = _a.count, length = _a.length, name = _a.name, sourceCodeInfo = _a.sourceCodeInfo;
286
- if (typeof count === 'number') {
287
- if (length !== count) {
288
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
289
- }
290
- }
291
- else {
292
- var min = count.min, max = count.max, even = count.even, odd = count.odd;
293
- if (even) {
294
- if (length % 2 !== 0) {
295
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an even number, got ").concat(valueToString(length), "."), sourceCodeInfo);
296
- }
297
- }
298
- if (odd) {
299
- if (length % 2 !== 1) {
300
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an odd number, got ").concat(valueToString(length), "."), sourceCodeInfo);
301
- }
302
- }
303
- if (typeof min === 'number' && length < min) {
304
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
305
- }
306
- if (typeof max === 'number' && length > max) {
307
- throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
308
- }
309
- }
309
+ function isNormalBuiltinSymbolNode(node) {
310
+ return NodeTypes.NormalBuiltinSymbol === node[0];
310
311
  }
311
- function canBeOperator(count) {
312
- if (typeof count === 'number') {
313
- return count === 2;
314
- }
315
- if (count.odd) {
316
- return false;
317
- }
318
- if (typeof count.max === 'number' && count.max < 2) {
319
- return false;
320
- }
321
- if (typeof count.min === 'number' && count.min > 2) {
312
+ function isSpecialBuiltinSymbolNode(node) {
313
+ return NodeTypes.SpecialBuiltinSymbol === node[0];
314
+ }
315
+ function isNormalExpressionNode(node) {
316
+ return node[0] === NodeTypes.NormalExpression;
317
+ }
318
+ function isNormalExpressionNodeWithName(node) {
319
+ if (!isNormalExpressionNode(node)) {
322
320
  return false;
323
321
  }
324
- return true;
322
+ return isSymbolNode(node[1][0]);
323
+ }
324
+ function isSpreadNode(node) {
325
+ return node[0] === NodeTypes.Spread;
325
326
  }
326
327
 
327
- var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateAstNode) {
328
+ var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
328
329
  var e_1, _a;
329
330
  var _b;
330
- var astNodes = Array.isArray(ast)
331
+ var nodes = Array.isArray(ast)
331
332
  ? ast
332
- : [{
333
- type: 'SpecialExpression',
334
- name: 'do',
335
- params: ast.body,
336
- sourceCodeInfo: undefined,
337
- }];
333
+ : [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
338
334
  var unresolvedSymbols = new Set();
339
335
  try {
340
- for (var astNodes_1 = __values(astNodes), astNodes_1_1 = astNodes_1.next(); !astNodes_1_1.done; astNodes_1_1 = astNodes_1.next()) {
341
- var subNode = astNodes_1_1.value;
342
- (_b = findUnresolvedSymbolsInAstNode(subNode, contextStack, builtin, evaluateAstNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
336
+ for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
337
+ var subNode = nodes_1_1.value;
338
+ (_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
343
339
  }
344
340
  }
345
341
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
346
342
  finally {
347
343
  try {
348
- if (astNodes_1_1 && !astNodes_1_1.done && (_a = astNodes_1.return)) _a.call(astNodes_1);
344
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
349
345
  }
350
346
  finally { if (e_1) throw e_1.error; }
351
347
  }
352
348
  return unresolvedSymbols;
353
349
  };
354
- function findUnresolvedSymbolsInAstNode(astNode, contextStack, builtin, evaluateAstNode) {
350
+ function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
355
351
  var e_2, _a;
356
- var _b;
357
- switch (astNode.type) {
358
- case 'Symbol': {
359
- var lookUpResult = contextStack.lookUp(astNode);
352
+ var _b, _c;
353
+ var nodeType = node[0];
354
+ switch (nodeType) {
355
+ case NodeTypes.UserDefinedSymbol: {
356
+ var symbolNode = node;
357
+ var lookUpResult = contextStack.lookUp(symbolNode);
360
358
  if (lookUpResult === null)
361
- return new Set([astNode.value]);
359
+ return new Set([symbolNode[1]]);
362
360
  return null;
363
361
  }
364
- case 'String':
365
- case 'Number':
366
- case 'Modifier':
367
- case 'ReservedSymbol':
368
- case 'Comment':
362
+ case NodeTypes.NormalBuiltinSymbol:
363
+ case NodeTypes.SpecialBuiltinSymbol:
364
+ case NodeTypes.String:
365
+ case NodeTypes.Number:
366
+ case NodeTypes.ReservedSymbol:
367
+ case NodeTypes.Binding:
369
368
  return null;
370
- case 'NormalExpression': {
369
+ case NodeTypes.NormalExpression: {
370
+ var normalExpressionNode = node;
371
371
  var unresolvedSymbols_1 = new Set();
372
- var name_1 = astNode.name, sourceCodeInfo = astNode.sourceCodeInfo;
373
- if (typeof name_1 === 'string') {
374
- var lookUpResult = contextStack.lookUp({ type: 'Symbol', value: name_1, sourceCodeInfo: sourceCodeInfo });
375
- if (lookUpResult === null)
376
- unresolvedSymbols_1.add(name_1);
372
+ if (isNormalExpressionNodeWithName(normalExpressionNode)) {
373
+ var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
374
+ if (isUserDefinedSymbolNode(symbolNode)) {
375
+ var lookUpResult = contextStack.lookUp(symbolNode);
376
+ if (lookUpResult === null)
377
+ unresolvedSymbols_1.add(symbolNode[1]);
378
+ }
379
+ }
380
+ else {
381
+ var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
382
+ (_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
377
383
  }
378
384
  try {
379
- for (var _c = __values(astNode.params), _d = _c.next(); !_d.done; _d = _c.next()) {
380
- var subNode = _d.value;
381
- (_b = findUnresolvedSymbolsInAstNode(subNode, contextStack, builtin, evaluateAstNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
385
+ for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
386
+ var subNode = _j.value;
387
+ (_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
382
388
  }
383
389
  }
384
390
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
385
391
  finally {
386
392
  try {
387
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
393
+ if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
388
394
  }
389
395
  finally { if (e_2) throw e_2.error; }
390
396
  }
391
397
  return unresolvedSymbols_1;
392
398
  }
393
- case 'SpecialExpression': {
394
- var specialExpression = asNonUndefined(builtin.specialExpressions[astNode.name], astNode.sourceCodeInfo);
395
- // eslint-disable-next-line ts/no-unsafe-argument
396
- return specialExpression.getUndefinedSymbols(astNode, contextStack, {
399
+ case NodeTypes.SpecialExpression: {
400
+ var specialExpressionNode = node;
401
+ var specialExpressionType = specialExpressionNode[1][0];
402
+ var specialExpression = builtin.specialExpressions[specialExpressionType];
403
+ var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
404
+ return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
397
405
  getUndefinedSymbols: getUndefinedSymbols,
398
406
  builtin: builtin,
399
- evaluateAstNode: evaluateAstNode,
407
+ evaluateNode: evaluateNode,
400
408
  });
401
409
  }
402
- case 'Spread':
403
- return findUnresolvedSymbolsInAstNode(astNode.value, contextStack, builtin, evaluateAstNode);
410
+ case NodeTypes.Spread:
411
+ return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
412
+ /* v8 ignore next 2 */
413
+ default:
414
+ throw new Error("Unhandled node type: ".concat(nodeType));
404
415
  }
405
416
  }
406
417
 
@@ -606,8 +617,71 @@ var bitwiseNormalExpression = {
606
617
  },
607
618
  };
608
619
 
609
- function getAssertionError(typeName, value, sourceCodeInfo) {
610
- return new LitsError("Expected ".concat(typeName, ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
620
+ function assertNumberOfParams(count, node) {
621
+ var length = node[1][1].length;
622
+ if (typeof count === 'number') {
623
+ if (length !== count) {
624
+ var name_1 = getNodeTypeName(node[0]);
625
+ throw new LitsError("Wrong number of arguments to \"".concat(name_1, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), node[2]);
626
+ }
627
+ }
628
+ else {
629
+ var min = count.min, max = count.max, even = count.even, odd = count.odd;
630
+ if (even) {
631
+ var name_2 = getNodeTypeName(node[0]);
632
+ if (length % 2 !== 0) {
633
+ throw new LitsError("Wrong number of arguments to \"".concat(name_2, "\",, expected an even number, got ").concat(valueToString(length), "."), node[2]);
634
+ }
635
+ }
636
+ if (odd) {
637
+ if (length % 2 !== 1) {
638
+ var name_3 = getNodeTypeName(node[0]);
639
+ throw new LitsError("Wrong number of arguments to \"".concat(name_3, "\",, expected an odd number, got ").concat(valueToString(length), "."), node[2]);
640
+ }
641
+ }
642
+ if (typeof min === 'number' && length < min) {
643
+ var name_4 = getNodeTypeName(node[0]);
644
+ throw new LitsError("Wrong number of arguments to \"".concat(name_4, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), node[2]);
645
+ }
646
+ if (typeof max === 'number' && length > max) {
647
+ var name_5 = getNodeTypeName(node[0]);
648
+ throw new LitsError("Wrong number of arguments to \"".concat(name_5, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), node[2]);
649
+ }
650
+ }
651
+ }
652
+ function isNonUndefined(value) {
653
+ return value !== undefined;
654
+ }
655
+ function asNonUndefined(value, sourceCodeInfo) {
656
+ assertNonUndefined(value, sourceCodeInfo);
657
+ return value;
658
+ }
659
+ function assertNonUndefined(value, sourceCodeInfo) {
660
+ if (!isNonUndefined(value))
661
+ throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
662
+ }
663
+ function isUnknownRecord(value) {
664
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
665
+ }
666
+ function assertUnknownRecord(value, sourceCodeInfo) {
667
+ if (!isUnknownRecord(value)) {
668
+ throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
669
+ }
670
+ }
671
+ function canBeOperator(count) {
672
+ if (typeof count === 'number') {
673
+ return count === 2;
674
+ }
675
+ if (count.odd) {
676
+ return false;
677
+ }
678
+ if (typeof count.max === 'number' && count.max < 2) {
679
+ return false;
680
+ }
681
+ if (typeof count.min === 'number' && count.min > 2) {
682
+ return false;
683
+ }
684
+ return true;
611
685
  }
612
686
 
613
687
  function isLitsFunction(value) {
@@ -619,9 +693,6 @@ function assertLitsFunction(value, sourceCodeInfo) {
619
693
  if (!isLitsFunction(value))
620
694
  throw getAssertionError('LitsFunction', value, sourceCodeInfo);
621
695
  }
622
- function isBuiltinFunction(value) {
623
- return isUnknownRecord(value) && value.functionType === 'Builtin';
624
- }
625
696
 
626
697
  function isAny(value) {
627
698
  // TODO weak test
@@ -792,12 +863,6 @@ function clone(value) {
792
863
  function cloneColl(value) {
793
864
  return clone(value);
794
865
  }
795
- function arrayToPairs(arr) {
796
- var pairs = [];
797
- for (var i = 0; i < arr.length; i += 2)
798
- pairs.push([arr[i], arr[i + 1]]);
799
- return pairs;
800
- }
801
866
  function joinSets() {
802
867
  var e_1, _a;
803
868
  var results = [];
@@ -3695,17 +3760,24 @@ Object.values(expressions$1).forEach(function (normalExpression) {
3695
3760
  });
3696
3761
  });
3697
3762
  var normalExpressions = __assign(__assign({}, expressions$1), aliases);
3763
+ var normalExpressionTypes = {};
3764
+ var allNormalExpressions = [];
3765
+ Object.entries(normalExpressions).forEach(function (_a, index) {
3766
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
3767
+ normalExpressionTypes[key] = index;
3768
+ allNormalExpressions.push(value);
3769
+ });
3698
3770
 
3699
3771
  var andSpecialExpression = {
3700
3772
  paramCount: {},
3701
3773
  evaluate: function (node, contextStack, _a) {
3702
3774
  var e_1, _b;
3703
- var evaluateAstNode = _a.evaluateAstNode;
3775
+ var evaluateNode = _a.evaluateNode;
3704
3776
  var value = true;
3705
3777
  try {
3706
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
3778
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3707
3779
  var param = _d.value;
3708
- value = evaluateAstNode(param, contextStack);
3780
+ value = evaluateNode(param, contextStack);
3709
3781
  if (!value)
3710
3782
  break;
3711
3783
  }
@@ -3720,8 +3792,8 @@ var andSpecialExpression = {
3720
3792
  return value;
3721
3793
  },
3722
3794
  getUndefinedSymbols: function (node, contextStack, _a) {
3723
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3724
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3795
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3796
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
3725
3797
  },
3726
3798
  };
3727
3799
 
@@ -3729,28 +3801,29 @@ var condSpecialExpression = {
3729
3801
  paramCount: { even: true },
3730
3802
  evaluate: function (node, contextStack, _a) {
3731
3803
  var e_1, _b;
3732
- var evaluateAstNode = _a.evaluateAstNode;
3804
+ var evaluateNode = _a.evaluateNode;
3805
+ var params = node[1][1];
3733
3806
  try {
3734
- for (var _c = __values(arrayToPairs(node.params)), _d = _c.next(); !_d.done; _d = _c.next()) {
3735
- var _e = __read(_d.value, 2), test = _e[0], form = _e[1];
3736
- var value = evaluateAstNode(test, contextStack);
3807
+ for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
3808
+ var _c = __read(params_1_1.value, 2), test = _c[0], form = _c[1];
3809
+ var value = evaluateNode(test, contextStack);
3737
3810
  if (!value)
3738
3811
  continue;
3739
- return evaluateAstNode(form, contextStack);
3812
+ return evaluateNode(form, contextStack);
3740
3813
  }
3741
3814
  }
3742
3815
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3743
3816
  finally {
3744
3817
  try {
3745
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3818
+ if (params_1_1 && !params_1_1.done && (_b = params_1.return)) _b.call(params_1);
3746
3819
  }
3747
3820
  finally { if (e_1) throw e_1.error; }
3748
3821
  }
3749
3822
  return null;
3750
3823
  },
3751
3824
  getUndefinedSymbols: function (node, contextStack, _a) {
3752
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3753
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3825
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3826
+ return getUndefinedSymbols(node[1][1].flat(), contextStack, builtin, evaluateNode);
3754
3827
  },
3755
3828
  };
3756
3829
 
@@ -3758,66 +3831,101 @@ var switchSpecialExpression = {
3758
3831
  paramCount: { odd: true },
3759
3832
  evaluate: function (node, contextStack, _a) {
3760
3833
  var e_1, _b;
3761
- var evaluateAstNode = _a.evaluateAstNode;
3762
- var switchValue = evaluateAstNode(node.params[0], contextStack);
3834
+ var evaluateNode = _a.evaluateNode;
3835
+ var _c = __read(node[1], 3), switchValueNode = _c[1], cases = _c[2];
3836
+ var switchValue = evaluateNode(switchValueNode, contextStack);
3763
3837
  try {
3764
- for (var _c = __values(arrayToPairs(node.params.slice(1))), _d = _c.next(); !_d.done; _d = _c.next()) {
3765
- var _e = __read(_d.value, 2), test = _e[0], form = _e[1];
3766
- var value = evaluateAstNode(test, contextStack);
3838
+ for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
3839
+ var _d = __read(cases_1_1.value, 2), test = _d[0], form = _d[1];
3840
+ var value = evaluateNode(test, contextStack);
3767
3841
  if (value === switchValue) {
3768
- return evaluateAstNode(form, contextStack);
3842
+ return evaluateNode(form, contextStack);
3769
3843
  }
3770
3844
  }
3771
3845
  }
3772
3846
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3773
3847
  finally {
3774
3848
  try {
3775
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3849
+ if (cases_1_1 && !cases_1_1.done && (_b = cases_1.return)) _b.call(cases_1);
3776
3850
  }
3777
3851
  finally { if (e_1) throw e_1.error; }
3778
3852
  }
3779
3853
  return null;
3780
3854
  },
3781
3855
  getUndefinedSymbols: function (node, contextStack, _a) {
3782
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3783
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3856
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3857
+ return getUndefinedSymbols(__spreadArray([node[1][1]], __read(node[1][2].flat()), false), contextStack, builtin, evaluateNode);
3784
3858
  },
3785
3859
  };
3786
3860
 
3787
- var declaredSpecialExpression = {
3861
+ var definedSpecialExpression = {
3788
3862
  paramCount: 1,
3789
3863
  evaluate: function (node, contextStack) {
3790
- var lookUpResult = contextStack.lookUp(node.params[0]);
3864
+ var symbolNode = node[1][1];
3865
+ assertSymbolNode(symbolNode);
3866
+ if (!isUserDefinedSymbolNode(symbolNode)) {
3867
+ return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
3868
+ }
3869
+ var lookUpResult = contextStack.lookUp(symbolNode);
3791
3870
  return lookUpResult !== null;
3792
3871
  },
3793
3872
  getUndefinedSymbols: function (node, contextStack, _a) {
3794
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3795
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3873
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3874
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
3796
3875
  },
3797
3876
  };
3798
3877
 
3799
- function evalueateBindingNodeValues(input, value, evaluate) {
3800
- var target = 'target' in input ? input.target : input;
3801
- var sourceCodeInfo = input.sourceCodeInfo;
3878
+ var bindingTargetTypes = {
3879
+ symbol: 11,
3880
+ rest: 12,
3881
+ object: 13,
3882
+ array: 14,
3883
+ };
3884
+
3885
+ function walkDefaults(bindingTarget, onDefault) {
3886
+ var _a;
3887
+ if (bindingTarget[0] === bindingTargetTypes.object) {
3888
+ Object.values(bindingTarget[1][0]).forEach(function (element) {
3889
+ if (element[1][1]) {
3890
+ onDefault(element[1][1]);
3891
+ }
3892
+ walkDefaults(element, onDefault);
3893
+ });
3894
+ }
3895
+ else if (bindingTarget[0] === bindingTargetTypes.array) {
3896
+ for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
3897
+ var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
3898
+ if (element === null) {
3899
+ continue;
3900
+ }
3901
+ if (element[1][1]) {
3902
+ onDefault(element[1][1]);
3903
+ }
3904
+ walkDefaults(element, onDefault);
3905
+ }
3906
+ }
3907
+ }
3908
+ function evalueateBindingNodeValues(target, value, evaluate) {
3909
+ var sourceCodeInfo = target[2];
3802
3910
  var record = {};
3803
3911
  createRecord(target, value, evaluate, sourceCodeInfo, record);
3804
3912
  return record;
3805
3913
  }
3806
3914
  function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3807
3915
  var _a, _b;
3808
- if (bindingTarget.type === 'object') {
3916
+ if (bindingTarget[0] === bindingTargetTypes.object) {
3809
3917
  assertUnknownRecord(value, sourceCodeInfo);
3810
3918
  var capturedKeys_1 = new Set();
3811
3919
  var restElement_1;
3812
- Object.entries(bindingTarget.elements).forEach(function (_a) {
3920
+ Object.entries(bindingTarget[1][0]).forEach(function (_a) {
3813
3921
  var _b;
3814
3922
  var _c = __read(_a, 2), key = _c[0], element = _c[1];
3815
- if (element.type === 'rest') {
3923
+ if (element[0] === bindingTargetTypes.rest) {
3816
3924
  restElement_1 = element;
3817
3925
  return;
3818
3926
  }
3819
3927
  capturedKeys_1.add(key);
3820
- var val = (_b = (value[key] !== undefined ? value[key] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3928
+ var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3821
3929
  assertAny(val, sourceCodeInfo);
3822
3930
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3823
3931
  });
@@ -3832,33 +3940,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3832
3940
  acc[key] = asAny(val);
3833
3941
  return acc;
3834
3942
  }, {});
3835
- record[restElement_1.name] = restValues;
3943
+ record[restElement_1[1][0]] = restValues;
3836
3944
  }
3837
3945
  }
3838
- else if (bindingTarget.type === 'array') {
3946
+ else if (bindingTarget[0] === bindingTargetTypes.array) {
3839
3947
  var restIndex = null;
3840
3948
  assertArray(value, sourceCodeInfo);
3841
- for (var index = 0; index < bindingTarget.elements.length; index += 1) {
3842
- var element = (_a = bindingTarget.elements[index]) !== null && _a !== void 0 ? _a : null;
3949
+ for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
3950
+ var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
3843
3951
  if (element === null) {
3844
3952
  continue;
3845
3953
  }
3846
- if (element.type === 'rest') {
3954
+ if (element[0] === bindingTargetTypes.rest) {
3847
3955
  restIndex = index;
3848
3956
  break;
3849
3957
  }
3850
- var val = (_b = (value[index] !== undefined ? value[index] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3958
+ var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3851
3959
  assertAny(val, sourceCodeInfo);
3852
3960
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3853
3961
  }
3854
3962
  if (restIndex !== null) {
3855
3963
  var restValues = value.slice(restIndex);
3856
- var restElement = bindingTarget.elements[restIndex];
3857
- record[restElement.name] = restValues;
3964
+ var restElement = bindingTarget[1][0][restIndex];
3965
+ record[restElement[1][0]] = restValues;
3858
3966
  }
3859
3967
  }
3968
+ else if (bindingTarget[0] === bindingTargetTypes.rest) {
3969
+ record[bindingTarget[1][0]] = asAny(value);
3970
+ }
3860
3971
  else {
3861
- record[bindingTarget.name] = asAny(value);
3972
+ record[bindingTarget[1][0][1]] = asAny(value);
3862
3973
  }
3863
3974
  }
3864
3975
  function getAllBindingTargetNames(bindingTarget) {
@@ -3871,9 +3982,9 @@ function getNamesFromBindingTarget(target, names) {
3871
3982
  if (target === null) {
3872
3983
  return;
3873
3984
  }
3874
- if (target.type === 'array') {
3985
+ if (target[0] === bindingTargetTypes.array) {
3875
3986
  try {
3876
- for (var _c = __values(target.elements), _d = _c.next(); !_d.done; _d = _c.next()) {
3987
+ for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
3877
3988
  var element = _d.value;
3878
3989
  getNamesFromBindingTarget(element, names);
3879
3990
  }
@@ -3886,9 +3997,9 @@ function getNamesFromBindingTarget(target, names) {
3886
3997
  finally { if (e_1) throw e_1.error; }
3887
3998
  }
3888
3999
  }
3889
- else if (target.type === 'object') {
4000
+ else if (target[0] === bindingTargetTypes.object) {
3890
4001
  try {
3891
- for (var _e = __values(Object.values(target.elements)), _f = _e.next(); !_f.done; _f = _e.next()) {
4002
+ for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
3892
4003
  var element = _f.value;
3893
4004
  getNamesFromBindingTarget(element, names);
3894
4005
  }
@@ -3901,27 +4012,42 @@ function getNamesFromBindingTarget(target, names) {
3901
4012
  finally { if (e_2) throw e_2.error; }
3902
4013
  }
3903
4014
  }
4015
+ else if (target[0] === bindingTargetTypes.rest) {
4016
+ if (names[target[1][0]]) {
4017
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
4018
+ }
4019
+ names[target[1][0]] = true;
4020
+ }
3904
4021
  else {
3905
- if (names[target.name]) {
3906
- throw new LitsError("Duplicate binding name: ".concat(target.name), target.sourceCodeInfo);
4022
+ if (names[target[1][0][1]]) {
4023
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
3907
4024
  }
3908
- names[target.name] = true;
4025
+ names[target[1][0][1]] = true;
3909
4026
  }
3910
4027
  }
3911
4028
 
3912
4029
  var defSpecialExpression = {
3913
4030
  paramCount: 2,
3914
4031
  evaluate: function (node, contextStack, _a) {
3915
- var evaluateAstNode = _a.evaluateAstNode;
3916
- var bindingValue = evaluateAstNode(node.bindingNode.value, contextStack);
3917
- var values = evalueateBindingNodeValues(node.bindingNode, bindingValue, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4032
+ var evaluateNode = _a.evaluateNode;
4033
+ var bindingNode = node[1][1];
4034
+ var target = bindingNode[1][0];
4035
+ var value = bindingNode[1][1];
4036
+ var bindingValue = evaluateNode(value, contextStack);
4037
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
3918
4038
  contextStack.exportValues(values);
3919
4039
  return null;
3920
4040
  },
3921
4041
  getUndefinedSymbols: function (node, contextStack, _a) {
3922
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3923
- var bindingResult = getUndefinedSymbols([node.bindingNode.value], contextStack, builtin, evaluateAstNode);
3924
- contextStack.addValues(getAllBindingTargetNames(node.bindingNode.target));
4042
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4043
+ var bindingNode = node[1][1];
4044
+ var target = bindingNode[1][0];
4045
+ var value = bindingNode[1][1];
4046
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
4047
+ walkDefaults(target, function (defaultNode) {
4048
+ addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
4049
+ });
4050
+ contextStack.addValues(getAllBindingTargetNames(target));
3925
4051
  return bindingResult;
3926
4052
  },
3927
4053
  };
@@ -3930,14 +4056,14 @@ var doSpecialExpression = {
3930
4056
  paramCount: {},
3931
4057
  evaluate: function (node, contextStack, _a) {
3932
4058
  var e_1, _b;
3933
- var evaluateAstNode = _a.evaluateAstNode;
4059
+ var evaluateNode = _a.evaluateNode;
3934
4060
  var newContext = {};
3935
4061
  var newContextStack = contextStack.create(newContext);
3936
4062
  var result = null;
3937
4063
  try {
3938
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4064
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3939
4065
  var form = _d.value;
3940
- result = evaluateAstNode(form, newContextStack);
4066
+ result = evaluateNode(form, newContextStack);
3941
4067
  }
3942
4068
  }
3943
4069
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -3950,8 +4076,8 @@ var doSpecialExpression = {
3950
4076
  return result;
3951
4077
  },
3952
4078
  getUndefinedSymbols: function (node, contextStack, _a) {
3953
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3954
- return getUndefinedSymbols(node.params, contextStack.create({}), builtin, evaluateAstNode);
4079
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4080
+ return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
3955
4081
  },
3956
4082
  };
3957
4083
 
@@ -4012,7 +4138,8 @@ function isNumberReservedSymbol(symbol) {
4012
4138
  function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
4013
4139
  if (typeof name !== 'string')
4014
4140
  return;
4015
- if (builtin.specialExpressions[name])
4141
+ // TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
4142
+ if (specialExpressionTypes[name])
4016
4143
  throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
4017
4144
  if (builtin.normalExpressions[name])
4018
4145
  throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
@@ -4026,63 +4153,69 @@ var functionSpecialExpression = {
4026
4153
  paramCount: {},
4027
4154
  evaluate: function (node, contextStack, _a) {
4028
4155
  var _b, _c;
4029
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4030
- var name = node.functionName.value;
4031
- assertNameNotDefined(name, contextStack, builtin, node.sourceCodeInfo);
4032
- var evaluatedFunction = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4156
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4157
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4158
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4159
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4160
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4033
4161
  var litsFunction = (_b = {},
4034
4162
  _b[FUNCTION_SYMBOL] = true,
4035
- _b.sourceCodeInfo = node.sourceCodeInfo,
4163
+ _b.sourceCodeInfo = node[2],
4036
4164
  _b.functionType = 'UserDefined',
4037
- _b.name = name,
4165
+ _b.name = functionSymbol[1],
4038
4166
  _b.evaluatedfunction = evaluatedFunction,
4039
4167
  _b);
4040
- contextStack.addValues((_c = {}, _c[name] = litsFunction, _c));
4168
+ contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
4041
4169
  return null;
4042
4170
  },
4043
4171
  getUndefinedSymbols: function (node, contextStack, _a) {
4044
4172
  var _b, _c;
4045
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4046
- contextStack.addValues((_b = {}, _b[node.functionName.value] = true, _b));
4047
- var newContext = (_c = {}, _c[node.functionName.value] = { value: true }, _c);
4048
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, newContext);
4173
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4174
+ var functionName = node[1][1][1];
4175
+ contextStack.addValues((_b = {}, _b[functionName] = true, _b));
4176
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4177
+ return getFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
4049
4178
  },
4050
4179
  };
4051
4180
  var defnSpecialExpression = {
4052
4181
  paramCount: {},
4053
4182
  evaluate: function (node, contextStack, _a) {
4054
4183
  var _b, _c;
4055
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4056
- var name = node.functionName.value;
4057
- assertNameNotDefined(name, contextStack, builtin, node.sourceCodeInfo);
4058
- var evaluatedFunctionOverloades = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4184
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4185
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4186
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4187
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4188
+ var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4059
4189
  var litsFunction = (_b = {},
4060
4190
  _b[FUNCTION_SYMBOL] = true,
4061
- _b.sourceCodeInfo = node.sourceCodeInfo,
4191
+ _b.sourceCodeInfo = node[2],
4062
4192
  _b.functionType = 'UserDefined',
4063
- _b.name = name,
4193
+ _b.name = functionSymbol[1],
4064
4194
  _b.evaluatedfunction = evaluatedFunctionOverloades,
4065
4195
  _b);
4066
- contextStack.exportValues((_c = {}, _c[name] = litsFunction, _c));
4196
+ contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
4067
4197
  return null;
4068
4198
  },
4069
4199
  getUndefinedSymbols: function (node, contextStack, _a) {
4070
4200
  var _b, _c;
4071
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4072
- contextStack.exportValues((_b = {}, _b[node.functionName.value] = true, _b));
4073
- var newContext = (_c = {}, _c[node.functionName.value] = { value: true }, _c);
4074
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, newContext);
4201
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4202
+ var functionName = node[1][1][1];
4203
+ var fn = node[1][2];
4204
+ contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
4205
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4206
+ return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
4075
4207
  },
4076
4208
  };
4077
4209
  var fnSpecialExpression = {
4078
4210
  paramCount: {},
4079
4211
  evaluate: function (node, contextStack, _a) {
4080
4212
  var _b;
4081
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4082
- var evaluatedFunction = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4213
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4214
+ var fn = node[1][1];
4215
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4083
4216
  var litsFunction = (_b = {},
4084
4217
  _b[FUNCTION_SYMBOL] = true,
4085
- _b.sourceCodeInfo = node.sourceCodeInfo,
4218
+ _b.sourceCodeInfo = node[2],
4086
4219
  _b.functionType = 'UserDefined',
4087
4220
  _b.name = undefined,
4088
4221
  _b.evaluatedfunction = evaluatedFunction,
@@ -4090,129 +4223,109 @@ var fnSpecialExpression = {
4090
4223
  return litsFunction;
4091
4224
  },
4092
4225
  getUndefinedSymbols: function (node, contextStack, _a) {
4093
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4094
- return addFunctionUnresolvedSymbols(node.function, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4226
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4227
+ var fn = node[1][1];
4228
+ return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4095
4229
  },
4096
4230
  };
4097
- function evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode) {
4098
- var fn = node.function;
4231
+ function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
4099
4232
  var functionContext = {};
4100
- var context = fn.arguments.reduce(function (ctx, arg) {
4233
+ var context = fn[0].reduce(function (ctx, arg) {
4101
4234
  Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
4102
4235
  ctx[name] = { value: null };
4103
4236
  });
4104
4237
  return ctx;
4105
4238
  }, {});
4106
- var undefinedSymbols = getUndefinedSymbols(fn.body, contextStack.new(context), builtin, evaluateAstNode);
4239
+ var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
4107
4240
  undefinedSymbols.forEach(function (name) {
4108
4241
  var value = contextStack.getValue(name);
4109
4242
  if (isAny(value)) {
4110
4243
  functionContext[name] = { value: value };
4111
4244
  }
4112
4245
  });
4113
- var evaluatedFunction = {
4114
- arguments: fn.arguments,
4115
- body: fn.body,
4116
- context: functionContext,
4117
- };
4246
+ var evaluatedFunction = [
4247
+ fn[0],
4248
+ fn[1],
4249
+ functionContext,
4250
+ ];
4118
4251
  return evaluatedFunction;
4119
4252
  }
4120
- function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, functionNameContext) {
4253
+ function getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
4121
4254
  var result = new Set();
4122
4255
  var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
4123
4256
  var newContext = {};
4124
- fn.arguments.forEach(function (arg) {
4257
+ fn[0].forEach(function (arg) {
4125
4258
  Object.assign(newContext, getAllBindingTargetNames(arg));
4259
+ walkDefaults(arg, function (defaultNode) {
4260
+ addToSet(result, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
4261
+ });
4126
4262
  });
4127
4263
  var newContextStack = contextStackWithFunctionName.create(newContext);
4128
- var overloadResult = getUndefinedSymbols(fn.body, newContextStack, builtin, evaluateAstNode);
4264
+ var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
4129
4265
  addToSet(result, overloadResult);
4130
4266
  return result;
4131
4267
  }
4132
4268
 
4133
- function isAstNode(value) {
4134
- if (value === null || typeof value !== 'object')
4135
- return false;
4136
- if (!isAstNodeType(value.type))
4137
- return false;
4138
- return true;
4139
- }
4140
- function asAstNode(value, sourceCodeInfo) {
4141
- assertAstNode(value, sourceCodeInfo);
4142
- return value;
4143
- }
4144
- function assertAstNode(value, sourceCodeInfo) {
4145
- if (!isAstNode(value))
4146
- throw getAssertionError('AstNode', value, sourceCodeInfo);
4147
- }
4148
- function isSymbolNode(value) {
4149
- if (!isAstNode(value))
4150
- return false;
4151
- return value.type === 'Symbol';
4152
- }
4153
- function isNormalExpressionNodeWithName(value) {
4154
- if (!isAstNode(value))
4155
- return false;
4156
- return value.type === 'NormalExpression' && typeof value.name === 'string';
4157
- }
4158
-
4159
4269
  var ifSpecialExpression = {
4160
4270
  paramCount: { min: 2, max: 3 },
4161
4271
  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);
4272
+ var evaluateNode = _a.evaluateNode;
4273
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4274
+ if (evaluateNode(conditionNode, contextStack)) {
4275
+ return evaluateNode(trueNode, contextStack);
4167
4276
  }
4168
- else {
4169
- if (node.params.length === 3)
4170
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4171
- else
4172
- return null;
4277
+ else if (falseNode) {
4278
+ return evaluateNode(falseNode, contextStack);
4173
4279
  }
4280
+ return null;
4174
4281
  },
4175
4282
  getUndefinedSymbols: function (node, contextStack, _a) {
4176
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4177
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4283
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4284
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4178
4285
  },
4179
4286
  };
4180
4287
 
4181
4288
  var unlessSpecialExpression = {
4182
4289
  paramCount: { min: 2, max: 3 },
4183
4290
  evaluate: function (node, contextStack, _a) {
4184
- var evaluateAstNode = _a.evaluateAstNode;
4185
- var sourceCodeInfo = node.sourceCodeInfo;
4186
- var _b = __read(node.params, 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4187
- if (!evaluateAstNode(asAstNode(conditionNode, sourceCodeInfo), contextStack)) {
4188
- return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
4291
+ var evaluateNode = _a.evaluateNode;
4292
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4293
+ if (!evaluateNode(conditionNode, contextStack)) {
4294
+ return evaluateNode(trueNode, contextStack);
4189
4295
  }
4190
- else {
4191
- if (node.params.length === 3)
4192
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4193
- else
4194
- return null;
4296
+ else if (falseNode) {
4297
+ return evaluateNode(falseNode, contextStack);
4195
4298
  }
4299
+ return null;
4196
4300
  },
4197
4301
  getUndefinedSymbols: function (node, contextStack, _a) {
4198
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4199
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4302
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4303
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4200
4304
  },
4201
4305
  };
4202
4306
 
4203
4307
  var letSpecialExpression = {
4204
4308
  paramCount: 0,
4205
4309
  evaluate: function (node, contextStack, _a) {
4206
- var evaluateAstNode = _a.evaluateAstNode;
4207
- var bindingValue = evaluateAstNode(node.bindingNode.value, contextStack);
4208
- var values = evalueateBindingNodeValues(node.bindingNode, bindingValue, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4310
+ var evaluateNode = _a.evaluateNode;
4311
+ var bindingNode = node[1][1];
4312
+ var target = bindingNode[1][0];
4313
+ var value = bindingNode[1][1];
4314
+ var bindingValue = evaluateNode(value, contextStack);
4315
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
4209
4316
  contextStack.addValues(values);
4210
4317
  return null;
4211
4318
  },
4212
4319
  getUndefinedSymbols: function (node, contextStack, _a) {
4213
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4214
- var bindingResult = getUndefinedSymbols([node.bindingNode.value], contextStack, builtin, evaluateAstNode);
4215
- contextStack.addValues(getAllBindingTargetNames(node.bindingNode.target));
4320
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4321
+ var bindingNode = node[1][1];
4322
+ var target = bindingNode[1][0];
4323
+ var value = bindingNode[1][1];
4324
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
4325
+ walkDefaults(target, function (defaultNode) {
4326
+ addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
4327
+ });
4328
+ contextStack.addValues(getAllBindingTargetNames(target));
4216
4329
  return bindingResult;
4217
4330
  },
4218
4331
  };
@@ -4220,11 +4333,11 @@ var letSpecialExpression = {
4220
4333
  var loopSpecialExpression = {
4221
4334
  paramCount: {},
4222
4335
  evaluate: function (node, contextStack, _a) {
4223
- var evaluateAstNode = _a.evaluateAstNode;
4224
- var sourceCodeInfo = node.sourceCodeInfo;
4225
- var bindingContext = node.bindingNodes.reduce(function (result, binding) {
4226
- var val = evaluateAstNode(binding.value, contextStack.create(result));
4227
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4336
+ var evaluateNode = _a.evaluateNode;
4337
+ var bindingNodes = node[1][1];
4338
+ var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
4339
+ var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
4340
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
4228
4341
  Object.entries(valueRecord).forEach(function (_a) {
4229
4342
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4230
4343
  result[name] = { value: value };
@@ -4232,20 +4345,21 @@ var loopSpecialExpression = {
4232
4345
  return result;
4233
4346
  }, {});
4234
4347
  var newContextStack = contextStack.create(bindingContext);
4348
+ var body = node[1][2];
4235
4349
  var _loop_1 = function () {
4236
4350
  var e_1, _b;
4237
4351
  var result = null;
4238
4352
  try {
4239
4353
  try {
4240
- for (var _c = (e_1 = void 0, __values(node.params)), _d = _c.next(); !_d.done; _d = _c.next()) {
4241
- var form = _d.value;
4242
- result = evaluateAstNode(form, newContextStack);
4354
+ 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()) {
4355
+ var form = body_1_1.value;
4356
+ result = evaluateNode(form, newContextStack);
4243
4357
  }
4244
4358
  }
4245
4359
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
4246
4360
  finally {
4247
4361
  try {
4248
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
4362
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4249
4363
  }
4250
4364
  finally { if (e_1) throw e_1.error; }
4251
4365
  }
@@ -4253,16 +4367,16 @@ var loopSpecialExpression = {
4253
4367
  catch (error) {
4254
4368
  if (error instanceof RecurSignal) {
4255
4369
  var params_1 = error.params;
4256
- if (params_1.length !== node.bindingNodes.length) {
4257
- throw new LitsError("recur expected ".concat(node.bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), sourceCodeInfo);
4370
+ if (params_1.length !== bindingNodes.length) {
4371
+ throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
4258
4372
  }
4259
- node.bindingNodes.forEach(function (binding, index) {
4373
+ bindingNodes.forEach(function (bindingNode, index) {
4260
4374
  var e_2, _a;
4261
- var valueRecord = evalueateBindingNodeValues(binding, asAny(params_1[index], sourceCodeInfo), function (astNode) { return evaluateAstNode(astNode, contextStack); });
4375
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
4262
4376
  try {
4263
4377
  for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
4264
4378
  var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
4265
- asNonUndefined(bindingContext[name_1], sourceCodeInfo).value = value;
4379
+ bindingContext[name_1].value = value;
4266
4380
  }
4267
4381
  }
4268
4382
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
@@ -4286,29 +4400,31 @@ var loopSpecialExpression = {
4286
4400
  }
4287
4401
  },
4288
4402
  getUndefinedSymbols: function (node, contextStack, _a) {
4289
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4290
- var newContext = node.bindingNodes
4403
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4404
+ var bindingNodes = node[1][1];
4405
+ var newContext = bindingNodes
4291
4406
  .reduce(function (context, bindingNode) {
4292
- var names = getAllBindingTargetNames(bindingNode.target);
4407
+ var names = getAllBindingTargetNames(bindingNode[1][0]);
4293
4408
  Object.keys(names).forEach(function (name) {
4294
4409
  context[name] = { value: true };
4295
4410
  });
4296
4411
  return context;
4297
4412
  }, {});
4298
- var bindingValueNodes = node.bindingNodes.map(function (binding) { return binding.value; });
4299
- var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateAstNode);
4300
- var paramsResult = getUndefinedSymbols(node.params, contextStack.create(newContext), builtin, evaluateAstNode);
4413
+ var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
4414
+ var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
4415
+ var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
4301
4416
  return joinSets(bindingsResult, paramsResult);
4302
4417
  },
4303
4418
  };
4304
4419
 
4305
- function addToContext(bindings, context, contextStack, evaluateAstNode) {
4420
+ function addToContext(bindings, context, contextStack, evaluateNode) {
4306
4421
  var e_1, _a;
4307
4422
  try {
4308
4423
  for (var bindings_1 = __values(bindings), bindings_1_1 = bindings_1.next(); !bindings_1_1.done; bindings_1_1 = bindings_1.next()) {
4309
- var binding = bindings_1_1.value;
4310
- var val = evaluateAstNode(binding.value, contextStack);
4311
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, contextStack); });
4424
+ var bindingNode = bindings_1_1.value;
4425
+ var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
4426
+ var val = evaluateNode(bindingValue, contextStack);
4427
+ var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
4312
4428
  Object.entries(valueRecord).forEach(function (_a) {
4313
4429
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4314
4430
  context[name] = { value: value };
@@ -4323,9 +4439,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
4323
4439
  finally { if (e_1) throw e_1.error; }
4324
4440
  }
4325
4441
  }
4326
- function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4327
- var sourceCodeInfo = node.sourceCodeInfo;
4328
- var _a = node, loopBindings = _a.l, params = _a.params;
4442
+ function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
4443
+ var sourceCodeInfo = loopNode[2];
4444
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4329
4445
  var result = [];
4330
4446
  var bindingIndices = loopBindings.map(function () { return 0; });
4331
4447
  var abort = false;
@@ -4335,8 +4451,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4335
4451
  var newContextStack = contextStack.create(context);
4336
4452
  var skip = false;
4337
4453
  bindingsLoop: for (var bindingIndex = 0; bindingIndex < loopBindings.length; bindingIndex += 1) {
4338
- var _c = asNonUndefined(loopBindings[bindingIndex], sourceCodeInfo), binding = _c.b, letBindings = _c.l, whenNode = _c.wn, whileNode = _c.we, modifiers = _c.m;
4339
- var coll = asColl(evaluateAstNode(binding.value, newContextStack), sourceCodeInfo);
4454
+ var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
4455
+ var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
4456
+ var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
4340
4457
  var seq = isSeq(coll) ? coll : Object.entries(coll);
4341
4458
  if (seq.length === 0) {
4342
4459
  skip = true;
@@ -4355,45 +4472,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4355
4472
  break;
4356
4473
  }
4357
4474
  var val = asAny(seq[index], sourceCodeInfo);
4358
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, newContextStack); });
4475
+ var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
4359
4476
  Object.entries(valueRecord).forEach(function (_a) {
4360
4477
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4361
4478
  context[name] = { value: value };
4362
4479
  });
4480
+ if (letBindings) {
4481
+ addToContext(letBindings, context, newContextStack, evaluateNode);
4482
+ }
4483
+ if (whenNode && !evaluateNode(whenNode, newContextStack)) {
4484
+ bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
4485
+ skip = true;
4486
+ break bindingsLoop;
4487
+ }
4488
+ if (whileNode && !evaluateNode(whileNode, newContextStack)) {
4489
+ bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
4490
+ skip = true;
4491
+ break bindingsLoop;
4492
+ }
4493
+ }
4494
+ if (!skip) {
4495
+ var value = null;
4363
4496
  try {
4364
- 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()) {
4365
- var modifier = modifiers_1_1.value;
4366
- switch (modifier) {
4367
- case '&let':
4368
- addToContext(asNonUndefined(letBindings, sourceCodeInfo), context, newContextStack, evaluateAstNode);
4369
- break;
4370
- case '&when':
4371
- if (!evaluateAstNode(asAstNode(whenNode, sourceCodeInfo), newContextStack)) {
4372
- bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
4373
- skip = true;
4374
- break bindingsLoop;
4375
- }
4376
- break;
4377
- case '&while':
4378
- if (!evaluateAstNode(asAstNode(whileNode, sourceCodeInfo), newContextStack)) {
4379
- bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
4380
- skip = true;
4381
- break bindingsLoop;
4382
- }
4383
- break;
4384
- }
4497
+ 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()) {
4498
+ var form = body_1_1.value;
4499
+ value = evaluateNode(form, newContextStack);
4385
4500
  }
4386
4501
  }
4387
4502
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
4388
4503
  finally {
4389
4504
  try {
4390
- if (modifiers_1_1 && !modifiers_1_1.done && (_b = modifiers_1.return)) _b.call(modifiers_1);
4505
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4391
4506
  }
4392
4507
  finally { if (e_2) throw e_2.error; }
4393
4508
  }
4394
- }
4395
- if (!skip) {
4396
- var value = evaluateAstNode(params[0], newContextStack);
4397
4509
  if (returnResult)
4398
4510
  result.push(value);
4399
4511
  if (bindingIndices.length > 0)
@@ -4405,57 +4517,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4405
4517
  }
4406
4518
  return returnResult ? result : null;
4407
4519
  }
4408
- function analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode) {
4520
+ function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
4409
4521
  var result = new Set();
4410
4522
  var newContext = {};
4411
- var loopBindings = node.l;
4412
- loopBindings.forEach(function (loopBinding) {
4413
- var binding = loopBinding.b, letBindings = loopBinding.l, whenNode = loopBinding.wn, whileNode = loopBinding.we;
4414
- getUndefinedSymbols([binding.value], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4523
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4524
+ loopBindings.forEach(function (loopBindingNode) {
4525
+ var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
4526
+ var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
4527
+ getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4415
4528
  return result.add(symbol);
4416
4529
  });
4417
- Object.assign(newContext, getAllBindingTargetNames(binding.target));
4530
+ Object.assign(newContext, getAllBindingTargetNames(target));
4418
4531
  if (letBindings) {
4419
- letBindings.forEach(function (letBinding) {
4420
- getUndefinedSymbols([letBinding.value], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4532
+ letBindings.forEach(function (letBindingNode) {
4533
+ var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
4534
+ getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4421
4535
  return result.add(symbol);
4422
4536
  });
4423
- Object.assign(newContext, getAllBindingTargetNames(letBinding.target));
4537
+ Object.assign(newContext, getAllBindingTargetNames(letTarget));
4424
4538
  });
4425
4539
  }
4426
4540
  if (whenNode) {
4427
- getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4541
+ getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4428
4542
  return result.add(symbol);
4429
4543
  });
4430
4544
  }
4431
4545
  if (whileNode) {
4432
- getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4546
+ getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4433
4547
  return result.add(symbol);
4434
4548
  });
4435
4549
  }
4436
4550
  });
4437
- getUndefinedSymbols(node.params, contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4551
+ getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4438
4552
  return result.add(symbol);
4439
4553
  });
4440
4554
  return result;
4441
4555
  }
4442
4556
  var forSpecialExpression = {
4443
4557
  paramCount: 1,
4444
- evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateAstNode); },
4558
+ evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
4445
4559
  getUndefinedSymbols: function (node, contextStack, _a) {
4446
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4447
- return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4560
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4561
+ return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4448
4562
  },
4449
4563
  };
4450
4564
  var doseqSpecialExpression = {
4451
4565
  paramCount: 1,
4452
4566
  evaluate: function (node, contextStack, helpers) {
4453
- evaluateLoop(false, node, contextStack, helpers.evaluateAstNode);
4567
+ evaluateLoop(false, node, contextStack, helpers.evaluateNode);
4454
4568
  return null;
4455
4569
  },
4456
4570
  getUndefinedSymbols: function (node, contextStack, _a) {
4457
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4458
- return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4571
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4572
+ return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4459
4573
  },
4460
4574
  };
4461
4575
 
@@ -4463,12 +4577,12 @@ var orSpecialExpression = {
4463
4577
  paramCount: {},
4464
4578
  evaluate: function (node, contextStack, _a) {
4465
4579
  var e_1, _b;
4466
- var evaluateAstNode = _a.evaluateAstNode;
4580
+ var evaluateNode = _a.evaluateNode;
4467
4581
  var value = false;
4468
4582
  try {
4469
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4583
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4470
4584
  var param = _d.value;
4471
- value = evaluateAstNode(param, contextStack);
4585
+ value = evaluateNode(param, contextStack);
4472
4586
  if (value)
4473
4587
  break;
4474
4588
  }
@@ -4483,55 +4597,55 @@ var orSpecialExpression = {
4483
4597
  return value;
4484
4598
  },
4485
4599
  getUndefinedSymbols: function (node, contextStack, _a) {
4486
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4487
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4600
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4601
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4488
4602
  },
4489
4603
  };
4490
4604
 
4491
4605
  var qqSpecialExpression = {
4492
4606
  paramCount: { min: 1, max: 2 },
4493
4607
  evaluate: function (node, contextStack, _a) {
4494
- var evaluateAstNode = _a.evaluateAstNode;
4495
- var _b = __read(node.params, 2), firstNode = _b[0], secondNode = _b[1];
4496
- if (isSymbolNode(firstNode)) {
4497
- if (contextStack.lookUp(firstNode) === null)
4498
- return secondNode ? evaluateAstNode(secondNode, contextStack) : null;
4608
+ var evaluateNode = _a.evaluateNode;
4609
+ var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
4610
+ if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
4611
+ return secondNode ? evaluateNode(secondNode, contextStack) : null;
4499
4612
  }
4500
- assertAny(firstNode, node.sourceCodeInfo);
4501
- var firstResult = evaluateAstNode(firstNode, contextStack);
4502
- return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateAstNode(secondNode, contextStack) : null);
4613
+ assertAny(firstNode, node[2]);
4614
+ var firstResult = evaluateNode(firstNode, contextStack);
4615
+ return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
4503
4616
  },
4504
4617
  getUndefinedSymbols: function (node, contextStack, _a) {
4505
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4506
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4618
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4619
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4507
4620
  },
4508
4621
  };
4509
4622
 
4510
4623
  var recurSpecialExpression = {
4511
4624
  paramCount: {},
4512
4625
  evaluate: function (node, contextStack, _a) {
4513
- var evaluateAstNode = _a.evaluateAstNode;
4514
- var params = node.params.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
4515
- throw new RecurSignal(params);
4626
+ var evaluateNode = _a.evaluateNode;
4627
+ var params = node[1][1];
4628
+ var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4629
+ throw new RecurSignal(evaluatedParams);
4516
4630
  },
4517
4631
  getUndefinedSymbols: function (node, contextStack, _a) {
4518
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4519
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4632
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4633
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4520
4634
  },
4521
4635
  };
4522
4636
 
4523
4637
  var throwSpecialExpression = {
4524
4638
  paramCount: 1,
4525
4639
  evaluate: function (node, contextStack, _a) {
4526
- var evaluateAstNode = _a.evaluateAstNode;
4527
- var message = asString(evaluateAstNode(node.params[0], contextStack), node.sourceCodeInfo, {
4640
+ var evaluateNode = _a.evaluateNode;
4641
+ var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
4528
4642
  nonEmpty: true,
4529
4643
  });
4530
- throw new UserDefinedError(message, node.sourceCodeInfo);
4644
+ throw new UserDefinedError(message, node[2]);
4531
4645
  },
4532
4646
  getUndefinedSymbols: function (node, contextStack, _a) {
4533
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4534
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4647
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4648
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
4535
4649
  },
4536
4650
  };
4537
4651
 
@@ -4539,29 +4653,29 @@ var trySpecialExpression = {
4539
4653
  paramCount: 1,
4540
4654
  evaluate: function (node, contextStack, _a) {
4541
4655
  var _b;
4542
- var evaluateAstNode = _a.evaluateAstNode;
4543
- var tryExpressions = node.params, catchExpression = node.ce, errorNode = node.e;
4656
+ var evaluateNode = _a.evaluateNode;
4657
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4544
4658
  try {
4545
- return evaluateAstNode(tryExpressions[0], contextStack);
4659
+ return evaluateNode(tryExpression, contextStack);
4546
4660
  }
4547
4661
  catch (error) {
4548
- var newContext = errorNode
4662
+ var newContext = errorSymbol
4549
4663
  ? (_b = {},
4550
- _b[errorNode.value] = { value: asAny(error, node.sourceCodeInfo) },
4664
+ _b[errorSymbol[1]] = { value: error },
4551
4665
  _b) : {};
4552
- return evaluateAstNode(catchExpression, contextStack.create(newContext));
4666
+ return evaluateNode(catchExpression, contextStack.create(newContext));
4553
4667
  }
4554
4668
  },
4555
4669
  getUndefinedSymbols: function (node, contextStack, _a) {
4556
4670
  var _b;
4557
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4558
- var tryExpressions = node.params, catchExpression = node.ce, errorNode = node.e;
4559
- var tryResult = getUndefinedSymbols(tryExpressions, contextStack, builtin, evaluateAstNode);
4560
- var newContext = errorNode
4671
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4672
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4673
+ var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
4674
+ var newContext = errorSymbol
4561
4675
  ? (_b = {},
4562
- _b[errorNode.value] = { value: true },
4676
+ _b[errorSymbol[1]] = { value: true },
4563
4677
  _b) : {};
4564
- var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateAstNode);
4678
+ var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
4565
4679
  return joinSets(tryResult, catchResult);
4566
4680
  },
4567
4681
  };
@@ -4570,20 +4684,20 @@ var arraySpecialExpression = {
4570
4684
  paramCount: {},
4571
4685
  evaluate: function (node, contextStack, _a) {
4572
4686
  var e_1, _b;
4573
- var evaluateAstNode = _a.evaluateAstNode;
4687
+ var evaluateNode = _a.evaluateNode;
4574
4688
  var result = [];
4575
4689
  try {
4576
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4690
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4577
4691
  var param = _d.value;
4578
- if (param.type === 'Spread') {
4579
- var spreadValue = evaluateAstNode(param.value, contextStack);
4692
+ if (isSpreadNode(param)) {
4693
+ var spreadValue = evaluateNode(param[1], contextStack);
4580
4694
  if (!Array.isArray(spreadValue)) {
4581
- throw new LitsError('Spread value is not an array', param.sourceCodeInfo);
4695
+ throw new LitsError('Spread value is not an array', param[2]);
4582
4696
  }
4583
4697
  result.push.apply(result, __spreadArray([], __read(spreadValue), false));
4584
4698
  }
4585
4699
  else {
4586
- result.push(evaluateAstNode(param, contextStack));
4700
+ result.push(evaluateNode(param, contextStack));
4587
4701
  }
4588
4702
  }
4589
4703
  }
@@ -4597,76 +4711,79 @@ var arraySpecialExpression = {
4597
4711
  return result;
4598
4712
  },
4599
4713
  getUndefinedSymbols: function (node, contextStack, _a) {
4600
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4601
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4714
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4715
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4602
4716
  },
4603
4717
  };
4604
4718
 
4605
4719
  var objectSpecialExpression = {
4606
4720
  paramCount: {},
4607
4721
  evaluate: function (node, contextStack, _a) {
4608
- var evaluateAstNode = _a.evaluateAstNode;
4722
+ var evaluateNode = _a.evaluateNode;
4609
4723
  var result = {};
4610
- for (var i = 0; i < node.params.length; i += 2) {
4611
- var keyNode = asAstNode(node.params[i]);
4612
- if ((keyNode === null || keyNode === void 0 ? void 0 : keyNode.type) === 'Spread') {
4613
- var spreadObject = evaluateAstNode(keyNode.value, contextStack);
4724
+ var params = node[1][1];
4725
+ for (var i = 0; i < params.length; i += 2) {
4726
+ var keyNode = params[i];
4727
+ if (isSpreadNode(keyNode)) {
4728
+ var spreadObject = evaluateNode(keyNode[1], contextStack);
4614
4729
  if (!isUnknownRecord(spreadObject)) {
4615
- throw new LitsError('Spread value is not an object', keyNode.sourceCodeInfo);
4730
+ throw new LitsError('Spread value is not an object', keyNode[2]);
4616
4731
  }
4617
4732
  Object.assign(result, spreadObject);
4618
4733
  i -= 1;
4619
4734
  }
4620
4735
  else {
4621
- var key = evaluateAstNode(keyNode, contextStack);
4622
- var value = evaluateAstNode(node.params[i + 1], contextStack);
4623
- assertString(key, keyNode.sourceCodeInfo);
4736
+ var key = evaluateNode(keyNode, contextStack);
4737
+ var value = evaluateNode(params[i + 1], contextStack);
4738
+ assertString(key, keyNode[2]);
4624
4739
  result[key] = value;
4625
4740
  }
4626
4741
  }
4627
4742
  return result;
4628
4743
  },
4629
4744
  getUndefinedSymbols: function (node, contextStack, _a) {
4630
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4631
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4745
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4746
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4632
4747
  },
4633
4748
  };
4634
4749
 
4635
- var specialExpressions = {
4636
- '&&': andSpecialExpression,
4637
- 'cond': condSpecialExpression,
4638
- 'switch': switchSpecialExpression,
4639
- 'def': defSpecialExpression,
4640
- 'defn': defnSpecialExpression,
4641
- 'function': functionSpecialExpression,
4642
- 'do': doSpecialExpression,
4643
- 'doseq': doseqSpecialExpression,
4644
- 'for': forSpecialExpression,
4645
- 'fn': fnSpecialExpression,
4646
- 'if': ifSpecialExpression,
4647
- 'unless': unlessSpecialExpression,
4648
- 'let': letSpecialExpression,
4649
- 'loop': loopSpecialExpression,
4650
- '||': orSpecialExpression,
4651
- 'recur': recurSpecialExpression,
4652
- 'throw': throwSpecialExpression,
4653
- 'try': trySpecialExpression,
4654
- 'defined?': declaredSpecialExpression,
4655
- '??': qqSpecialExpression,
4656
- 'array': arraySpecialExpression,
4657
- 'object': objectSpecialExpression,
4658
- };
4750
+ var specialExpressions = [
4751
+ qqSpecialExpression,
4752
+ andSpecialExpression,
4753
+ orSpecialExpression,
4754
+ arraySpecialExpression,
4755
+ condSpecialExpression,
4756
+ defSpecialExpression,
4757
+ definedSpecialExpression,
4758
+ defnSpecialExpression,
4759
+ doSpecialExpression,
4760
+ doseqSpecialExpression,
4761
+ fnSpecialExpression,
4762
+ forSpecialExpression,
4763
+ functionSpecialExpression,
4764
+ ifSpecialExpression,
4765
+ letSpecialExpression,
4766
+ loopSpecialExpression,
4767
+ objectSpecialExpression,
4768
+ recurSpecialExpression,
4769
+ switchSpecialExpression,
4770
+ throwSpecialExpression,
4771
+ trySpecialExpression,
4772
+ unlessSpecialExpression,
4773
+ ];
4659
4774
  var builtin = {
4660
4775
  normalExpressions: normalExpressions,
4661
4776
  specialExpressions: specialExpressions,
4777
+ allNormalExpressions: allNormalExpressions,
4662
4778
  };
4663
4779
  var normalExpressionKeys = Object.keys(normalExpressions);
4664
- var specialExpressionKeys = Object.keys(specialExpressions);
4780
+ var specialExpressionKeys = Object.keys(specialExpressionTypes);
4781
+ new Set(specialExpressionKeys);
4665
4782
 
4666
4783
  function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
4667
- var hasRest = evaluatedFunction.arguments.some(function (arg) { return arg.type === 'rest'; });
4668
- var minArity = evaluatedFunction.arguments.filter(function (arg) { return arg.type !== 'rest' && !arg.default; }).length;
4669
- var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction.arguments.length;
4784
+ var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4785
+ var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
4786
+ var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
4670
4787
  if (nbrOfParams < minArity || nbrOfParams > maxArity) {
4671
4788
  throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
4672
4789
  }
@@ -4690,21 +4807,21 @@ var functionExecutors = {
4690
4807
  }
4691
4808
  },
4692
4809
  UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
4693
- var evaluateAstNode = _a.evaluateAstNode;
4810
+ var evaluateNode = _a.evaluateNode;
4694
4811
  var _loop_1 = function () {
4695
4812
  var e_1, _b;
4696
4813
  checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
4697
4814
  var evaluatedFunction = fn.evaluatedfunction;
4698
- var args = evaluatedFunction.arguments;
4699
- var nbrOfNonRestArgs = args.filter(function (arg) { return arg.type !== 'rest'; }).length;
4700
- var newContextStack = contextStack.create(fn.evaluatedfunction.context);
4815
+ var args = evaluatedFunction[0];
4816
+ var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
4817
+ var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
4701
4818
  var newContext = {};
4702
4819
  var rest = [];
4703
4820
  for (var i = 0; i < params.length; i += 1) {
4704
4821
  if (i < nbrOfNonRestArgs) {
4705
4822
  var param = toAny(params[i]);
4706
- var valueRecord = evalueateBindingNodeValues(args[i], param, function (astNode) {
4707
- return evaluateAstNode(astNode, newContextStack.create(newContext));
4823
+ var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
4824
+ return evaluateNode(Node, newContextStack.create(newContext));
4708
4825
  });
4709
4826
  Object.entries(valueRecord).forEach(function (_a) {
4710
4827
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
@@ -4717,18 +4834,18 @@ var functionExecutors = {
4717
4834
  }
4718
4835
  for (var i = params.length; i < nbrOfNonRestArgs; i++) {
4719
4836
  var arg = args[i];
4720
- var defaultValue = evaluateAstNode(arg.default, contextStack.create(newContext));
4721
- var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (astNode) {
4722
- return evaluateAstNode(astNode, contextStack.create(newContext));
4837
+ var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
4838
+ var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
4839
+ return evaluateNode(Node, contextStack.create(newContext));
4723
4840
  });
4724
4841
  Object.entries(valueRecord).forEach(function (_a) {
4725
4842
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4726
4843
  newContext[key] = { value: value };
4727
4844
  });
4728
4845
  }
4729
- var restArgument = args.find(function (arg) { return arg.type === 'rest'; });
4846
+ var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4730
4847
  if (restArgument !== undefined) {
4731
- var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (astNode) { return evaluateAstNode(astNode, contextStack.create(newContext)); });
4848
+ var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
4732
4849
  Object.entries(valueRecord).forEach(function (_a) {
4733
4850
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4734
4851
  newContext[key] = { value: value };
@@ -4738,9 +4855,9 @@ var functionExecutors = {
4738
4855
  var result = null;
4739
4856
  var newContextStack2 = newContextStack.create(newContext);
4740
4857
  try {
4741
- for (var _c = (e_1 = void 0, __values(evaluatedFunction.body)), _d = _c.next(); !_d.done; _d = _c.next()) {
4858
+ for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
4742
4859
  var node = _d.value;
4743
- result = evaluateAstNode(node, newContextStack2);
4860
+ result = evaluateNode(node, newContextStack2);
4744
4861
  }
4745
4862
  }
4746
4863
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4864,7 +4981,7 @@ var functionExecutors = {
4864
4981
  },
4865
4982
  Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
4866
4983
  var executeFunction = _a.executeFunction;
4867
- var normalExpression = asNonUndefined(normalExpressions[fn.n], sourceCodeInfo);
4984
+ var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
4868
4985
  return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
4869
4986
  },
4870
4987
  };
@@ -4875,7 +4992,7 @@ function evaluate(ast, contextStack) {
4875
4992
  try {
4876
4993
  for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
4877
4994
  var node = _c.value;
4878
- result = evaluateAstNode(node, contextStack);
4995
+ result = evaluateNode(node, contextStack);
4879
4996
  }
4880
4997
  }
4881
4998
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4887,53 +5004,66 @@ function evaluate(ast, contextStack) {
4887
5004
  }
4888
5005
  return result;
4889
5006
  }
4890
- function evaluateAstNode(node, contextStack) {
4891
- switch (node.type) {
4892
- case 'Number':
5007
+ function evaluateNode(node, contextStack) {
5008
+ switch (node[0]) {
5009
+ case NodeTypes.Number:
4893
5010
  return evaluateNumber(node);
4894
- case 'String':
5011
+ case NodeTypes.String:
4895
5012
  return evaluateString(node);
4896
- case 'Symbol':
4897
- return contextStack.evaluateName(node);
4898
- case 'ReservedSymbol':
4899
- return evaluateReservedName(node);
4900
- case 'NormalExpression':
5013
+ case NodeTypes.NormalBuiltinSymbol:
5014
+ case NodeTypes.SpecialBuiltinSymbol:
5015
+ case NodeTypes.UserDefinedSymbol:
5016
+ return contextStack.evaluateSymbol(node);
5017
+ case NodeTypes.ReservedSymbol:
5018
+ return evaluateReservedSymbol(node);
5019
+ case NodeTypes.NormalExpression:
4901
5020
  return evaluateNormalExpression(node, contextStack);
4902
- case 'SpecialExpression':
5021
+ case NodeTypes.SpecialExpression:
4903
5022
  return evaluateSpecialExpression(node, contextStack);
4904
5023
  /* v8 ignore next 2 */
4905
5024
  default:
4906
- throw new LitsError("".concat(node.type, "-node cannot be evaluated"), node.sourceCodeInfo);
5025
+ throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
4907
5026
  }
4908
5027
  }
4909
5028
  function evaluateNumber(node) {
4910
- return node.value;
5029
+ return node[1];
4911
5030
  }
4912
5031
  function evaluateString(node) {
4913
- return node.value;
5032
+ return node[1];
4914
5033
  }
4915
- function evaluateReservedName(node) {
4916
- var reservedName = node.value;
5034
+ function evaluateReservedSymbol(node) {
5035
+ var reservedName = node[1];
4917
5036
  var value = reservedSymbolRecord[reservedName];
4918
- return asNonUndefined(value, node.sourceCodeInfo);
5037
+ return asNonUndefined(value, node[2]);
4919
5038
  }
4920
5039
  function evaluateNormalExpression(node, contextStack) {
4921
- var params = node.params.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
4922
- var sourceCodeInfo = node.sourceCodeInfo;
5040
+ var sourceCodeInfo = node[2];
5041
+ var paramNodes = node[1][1];
5042
+ var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4923
5043
  if (isNormalExpressionNodeWithName(node)) {
4924
- var value = contextStack.getValue(node.name);
4925
- if (value !== undefined)
4926
- return executeFunction(asAny(value), params, contextStack, sourceCodeInfo);
4927
- return evaluateBuiltinNormalExpression(node, params, contextStack);
5044
+ var nameSymbol = node[1][0];
5045
+ if (isNormalBuiltinSymbolNode(nameSymbol)) {
5046
+ var type = nameSymbol[1];
5047
+ var normalExpression = builtin.allNormalExpressions[type];
5048
+ return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
5049
+ }
5050
+ else {
5051
+ var fn = contextStack.getValue(nameSymbol[1]);
5052
+ if (fn !== undefined) {
5053
+ return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
5054
+ }
5055
+ throw new UndefinedSymbolError(nameSymbol[1], node[2]);
5056
+ }
4928
5057
  }
4929
5058
  else {
4930
- var fn = params[0];
4931
- return executeFunction(fn, params.slice(1), contextStack, sourceCodeInfo);
5059
+ var fnNode = node[1][0];
5060
+ var fn = evaluateNode(fnNode, contextStack);
5061
+ return executeFunction(fn, params, contextStack, sourceCodeInfo);
4932
5062
  }
4933
5063
  }
4934
5064
  function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4935
5065
  if (isLitsFunction(fn))
4936
- return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateAstNode: evaluateAstNode, executeFunction: executeFunction });
5066
+ return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
4937
5067
  if (Array.isArray(fn))
4938
5068
  return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
4939
5069
  if (isObj(fn))
@@ -4944,16 +5074,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4944
5074
  return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
4945
5075
  throw new NotAFunctionError(fn, sourceCodeInfo);
4946
5076
  }
4947
- function evaluateBuiltinNormalExpression(node, params, contextStack) {
4948
- var normalExpression = builtin.normalExpressions[node.name];
4949
- if (!normalExpression)
4950
- throw new UndefinedSymbolError(node.name, node.sourceCodeInfo);
4951
- return normalExpression.evaluate(params, node.sourceCodeInfo, contextStack, { executeFunction: executeFunction });
4952
- }
4953
5077
  function evaluateSpecialExpression(node, contextStack) {
4954
- var specialExpression = asNonUndefined(builtin.specialExpressions[node.name], node.sourceCodeInfo);
4955
- // eslint-disable-next-line ts/no-unsafe-argument
4956
- return specialExpression.evaluate(node, contextStack, { evaluateAstNode: evaluateAstNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
5078
+ var specialExpressionType = node[1][0];
5079
+ var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
5080
+ var castedEvaluate = specialExpression.evaluate;
5081
+ return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
4957
5082
  }
4958
5083
  function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
4959
5084
  if (params.length !== 1)
@@ -5095,13 +5220,13 @@ var ContextStackImpl = /** @class */ (function () {
5095
5220
  return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
5096
5221
  };
5097
5222
  ContextStackImpl.prototype.lookUp = function (node) {
5098
- var e_4, _a, _b;
5099
- var _c, _d, _e;
5100
- var value = node.value;
5101
- var sourceCodeInfo = node.sourceCodeInfo;
5223
+ var e_4, _a;
5224
+ var _b, _c, _d;
5225
+ var value = node[1];
5102
5226
  try {
5103
- for (var _f = __values(this.contexts), _g = _f.next(); !_g.done; _g = _f.next()) {
5104
- var context = _g.value;
5227
+ // const sourceCodeInfo = node[2]
5228
+ for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
5229
+ var context = _f.value;
5105
5230
  var contextEntry = context[value];
5106
5231
  if (contextEntry)
5107
5232
  return contextEntry;
@@ -5110,32 +5235,23 @@ var ContextStackImpl = /** @class */ (function () {
5110
5235
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
5111
5236
  finally {
5112
5237
  try {
5113
- if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
5238
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
5114
5239
  }
5115
5240
  finally { if (e_4) throw e_4.error; }
5116
5241
  }
5117
- var lazyHostValue = (_c = this.lazyValues) === null || _c === void 0 ? void 0 : _c[value];
5242
+ var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
5118
5243
  if (lazyHostValue !== undefined) {
5119
5244
  return {
5120
5245
  value: toAny(lazyHostValue.read()),
5121
5246
  };
5122
5247
  }
5123
- var hostValue = (_d = this.values) === null || _d === void 0 ? void 0 : _d[value];
5248
+ var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
5124
5249
  if (hostValue !== undefined) {
5125
5250
  return {
5126
5251
  value: toAny(hostValue),
5127
5252
  };
5128
5253
  }
5129
- if (builtin.normalExpressions[value]) {
5130
- var builtinFunction = (_b = {},
5131
- _b[FUNCTION_SYMBOL] = true,
5132
- _b.sourceCodeInfo = sourceCodeInfo,
5133
- _b.functionType = 'Builtin',
5134
- _b.n = value,
5135
- _b);
5136
- return builtinFunction;
5137
- }
5138
- var nativeJsFunction = (_e = this.nativeJsFunctions) === null || _e === void 0 ? void 0 : _e[value];
5254
+ var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
5139
5255
  if (nativeJsFunction) {
5140
5256
  return {
5141
5257
  value: nativeJsFunction,
@@ -5143,13 +5259,24 @@ var ContextStackImpl = /** @class */ (function () {
5143
5259
  }
5144
5260
  return null;
5145
5261
  };
5146
- ContextStackImpl.prototype.evaluateName = function (node) {
5262
+ ContextStackImpl.prototype.evaluateSymbol = function (node) {
5263
+ var _a;
5264
+ if (isSpecialBuiltinSymbolNode(node)) {
5265
+ throw new Error('Special builtin symbols should not be evaluated');
5266
+ }
5267
+ if (isNormalBuiltinSymbolNode(node)) {
5268
+ var type = node[1];
5269
+ return _a = {},
5270
+ _a[FUNCTION_SYMBOL] = true,
5271
+ _a.functionType = 'Builtin',
5272
+ _a.normalBuitinSymbolType = type,
5273
+ _a.sourceCodeInfo = node[2],
5274
+ _a;
5275
+ }
5147
5276
  var lookUpResult = this.lookUp(node);
5148
5277
  if (isContextEntry(lookUpResult))
5149
5278
  return lookUpResult.value;
5150
- else if (isBuiltinFunction(lookUpResult))
5151
- return lookUpResult;
5152
- throw new UndefinedSymbolError(node.value, node.sourceCodeInfo);
5279
+ throw new UndefinedSymbolError(node[1], node[2]);
5153
5280
  };
5154
5281
  return ContextStackImpl;
5155
5282
  }());
@@ -5232,10 +5359,10 @@ var nonFunctionOperators = [
5232
5359
  'cond',
5233
5360
  'def',
5234
5361
  'defined?',
5235
- 'defn',
5362
+ // 'defn',
5236
5363
  'do',
5237
5364
  'doseq',
5238
- 'fn',
5365
+ // 'fn',
5239
5366
  'if',
5240
5367
  'let',
5241
5368
  'loop',
@@ -5684,6 +5811,10 @@ function assertReservedSymbolToken(token, symbolName) {
5684
5811
  throwUnexpectedToken('ReservedSymbol', symbolName, token);
5685
5812
  }
5686
5813
  }
5814
+ function asReservedSymbolToken(token, symbolName) {
5815
+ assertReservedSymbolToken(token, symbolName);
5816
+ return token;
5817
+ }
5687
5818
  function isSingleLineCommentToken(token) {
5688
5819
  return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
5689
5820
  }
@@ -5766,6 +5897,9 @@ function assertRBraceToken(token) {
5766
5897
  throwUnexpectedToken('RBrace', undefined, token);
5767
5898
  }
5768
5899
  }
5900
+ function isStringToken(token) {
5901
+ return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
5902
+ }
5769
5903
  function isA_BinaryOperatorToken(token) {
5770
5904
  return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
5771
5905
  }
@@ -5803,6 +5937,12 @@ function untokenize(tokenStream) {
5803
5937
  var exponentiationPrecedence = 10;
5804
5938
  var binaryFunctionalOperatorPrecedence = 1;
5805
5939
  var placeholderRegexp = /^\$([1-9]\d?)?$/;
5940
+ function withSourceCodeInfo(node, sourceCodeInfo) {
5941
+ if (sourceCodeInfo) {
5942
+ node[2] = sourceCodeInfo;
5943
+ }
5944
+ return node;
5945
+ }
5806
5946
  function getPrecedence(operatorSign) {
5807
5947
  switch (operatorSign) {
5808
5948
  case '**': // exponentiation
@@ -5845,29 +5985,18 @@ function getPrecedence(operatorSign) {
5845
5985
  throw new Error("Unknown binary operator: ".concat(operatorSign));
5846
5986
  }
5847
5987
  }
5848
- function createNamedNormalExpressionNode(name, params, sourceCodeInfo) {
5849
- var node = {
5850
- type: 'NormalExpression',
5851
- name: name,
5852
- params: params,
5853
- sourceCodeInfo: sourceCodeInfo,
5854
- };
5855
- var builtinExpression = builtin.normalExpressions[node.name];
5856
- if (builtinExpression) {
5857
- assertNumberOfParams(builtinExpression.paramCount, node);
5988
+ function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
5989
+ var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
5990
+ if (isNormalBuiltinSymbolNode(symbolNode)) {
5991
+ assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
5858
5992
  }
5859
5993
  return node;
5860
5994
  }
5861
5995
  function createAccessorNode(left, right, sourceCodeInfo) {
5862
5996
  // Unnamed normal expression
5863
- return {
5864
- type: 'NormalExpression',
5865
- params: [left, right],
5866
- name: undefined,
5867
- sourceCodeInfo: sourceCodeInfo,
5868
- };
5997
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
5869
5998
  }
5870
- function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
5999
+ function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
5871
6000
  var operatorName = operator[1];
5872
6001
  switch (operatorName) {
5873
6002
  case '**': // exponentiation
@@ -5892,16 +6021,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
5892
6021
  case '&':
5893
6022
  case '^':
5894
6023
  case '|':
5895
- return createNamedNormalExpressionNode(operatorName, [left, right], sourceCodeInfo);
6024
+ return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
5896
6025
  case '&&':
5897
6026
  case '||':
5898
6027
  case '??':
5899
- return {
5900
- type: 'SpecialExpression',
5901
- name: operatorName,
5902
- params: [left, right],
5903
- sourceCodeInfo: sourceCodeInfo,
5904
- };
6028
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
5905
6029
  /* v8 ignore next 10 */
5906
6030
  case '.':
5907
6031
  case ';':
@@ -5997,9 +6121,12 @@ var Parser = /** @class */ (function () {
5997
6121
  && !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
5998
6122
  break;
5999
6123
  }
6124
+ var symbol = specialExpressionTypes[name_1]
6125
+ ? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
6126
+ : withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
6000
6127
  this.advance();
6001
6128
  var right = this.parseExpression(newPrecedece);
6002
- left = fromBinaryOperatorToAstNode(operator, left, right, operator[2]);
6129
+ left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
6003
6130
  }
6004
6131
  else if (isSymbolToken(operator)) {
6005
6132
  if (!isFunctionOperator(operator[1])) {
@@ -6009,9 +6136,12 @@ var Parser = /** @class */ (function () {
6009
6136
  if (newPrecedece <= precedence) {
6010
6137
  break;
6011
6138
  }
6012
- this.advance();
6139
+ var operatorSymbol = this.parseSymbol();
6013
6140
  var right = this.parseExpression(newPrecedece);
6014
- left = createNamedNormalExpressionNode(operator[1], [left, right], operator[2]);
6141
+ if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
6142
+ throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
6143
+ }
6144
+ left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
6015
6145
  }
6016
6146
  else {
6017
6147
  break;
@@ -6030,11 +6160,7 @@ var Parser = /** @class */ (function () {
6030
6160
  if (!isSymbolToken(symbolToken)) {
6031
6161
  throw new LitsError('Expected symbol', this.peek()[2]);
6032
6162
  }
6033
- var stringNode = {
6034
- type: 'String',
6035
- value: symbolToken[1],
6036
- sourceCodeInfo: symbolToken[2],
6037
- };
6163
+ var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
6038
6164
  operand = createAccessorNode(operand, stringNode, token[2]);
6039
6165
  this.advance();
6040
6166
  token = this.peek();
@@ -6074,16 +6200,14 @@ var Parser = /** @class */ (function () {
6074
6200
  this.advance();
6075
6201
  return expression;
6076
6202
  }
6077
- // Unary operators
6078
6203
  else if (isOperatorToken(token)) {
6079
6204
  var operatorName = token[1];
6080
6205
  if (isBinaryOperator(operatorName)) {
6081
6206
  this.advance();
6082
- return {
6083
- type: 'Symbol',
6084
- value: operatorName,
6085
- sourceCodeInfo: token[2],
6086
- };
6207
+ if (specialExpressionTypes[operatorName] !== undefined) {
6208
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
6209
+ }
6210
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
6087
6211
  }
6088
6212
  if (operatorName === '->') {
6089
6213
  return this.parseShorthandLamdaFunction();
@@ -6131,22 +6255,24 @@ var Parser = /** @class */ (function () {
6131
6255
  while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
6132
6256
  if (isOperatorToken(this.peek(), '...')) {
6133
6257
  this.advance();
6134
- params.push({
6135
- type: 'Spread',
6136
- value: this.parseExpression(),
6137
- sourceCodeInfo: this.peek()[2],
6138
- });
6258
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6139
6259
  }
6140
6260
  else {
6141
- var key = this.parseOperand();
6142
- if (key.type !== 'Symbol' && key.type !== 'String') {
6261
+ var token = this.peek();
6262
+ if (isStringToken(token)) {
6263
+ var stringNode = this.parseString();
6264
+ params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
6265
+ }
6266
+ else if (isSymbolToken(token)) {
6267
+ var value = token[1].startsWith('\'')
6268
+ ? this.stringFromQuotedSymbol(token[1])
6269
+ : token[1];
6270
+ params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
6271
+ this.advance();
6272
+ }
6273
+ else {
6143
6274
  throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
6144
6275
  }
6145
- params.push({
6146
- type: 'String',
6147
- value: key.value,
6148
- sourceCodeInfo: key.sourceCodeInfo,
6149
- });
6150
6276
  assertOperatorToken(this.peek(), ':=');
6151
6277
  this.advance();
6152
6278
  params.push(this.parseExpression());
@@ -6161,12 +6287,7 @@ var Parser = /** @class */ (function () {
6161
6287
  }
6162
6288
  assertRBraceToken(this.peek());
6163
6289
  this.advance();
6164
- return {
6165
- type: 'SpecialExpression',
6166
- name: 'object',
6167
- params: params,
6168
- sourceCodeInfo: firstToken[2],
6169
- };
6290
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
6170
6291
  };
6171
6292
  Parser.prototype.parseArray = function () {
6172
6293
  var firstToken = asLBracketToken(this.peek());
@@ -6175,11 +6296,7 @@ var Parser = /** @class */ (function () {
6175
6296
  while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
6176
6297
  if (isOperatorToken(this.peek(), '...')) {
6177
6298
  this.advance();
6178
- params.push({
6179
- type: 'Spread',
6180
- value: this.parseExpression(),
6181
- sourceCodeInfo: this.peek()[2],
6182
- });
6299
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6183
6300
  }
6184
6301
  else {
6185
6302
  params.push(this.parseExpression());
@@ -6194,15 +6311,9 @@ var Parser = /** @class */ (function () {
6194
6311
  }
6195
6312
  assertRBracketToken(this.peek());
6196
6313
  this.advance();
6197
- return {
6198
- type: 'SpecialExpression',
6199
- name: 'array',
6200
- params: params,
6201
- sourceCodeInfo: firstToken[2],
6202
- };
6314
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
6203
6315
  };
6204
6316
  Parser.prototype.parseFunctionCall = function (symbol) {
6205
- var isNamedFunction = symbol.type === 'Symbol';
6206
6317
  this.advance();
6207
6318
  var params = [];
6208
6319
  while (!this.isAtEnd() && !isRParenToken(this.peek())) {
@@ -6219,45 +6330,57 @@ var Parser = /** @class */ (function () {
6219
6330
  throw new LitsError('Expected closing parenthesis', this.peek()[2]);
6220
6331
  }
6221
6332
  this.advance();
6222
- if (isNamedFunction) {
6223
- if (specialExpressionKeys.includes(symbol.value)) {
6224
- var name_2 = symbol.value;
6225
- switch (name_2) {
6226
- case '??':
6227
- case '&&':
6228
- case 'defined?':
6229
- case '||':
6230
- case 'recur':
6231
- case 'array':
6232
- case 'object':
6233
- case 'throw': {
6234
- var node = {
6235
- type: 'SpecialExpression',
6236
- name: name_2,
6237
- params: params,
6238
- sourceCodeInfo: symbol.sourceCodeInfo,
6239
- };
6240
- assertNumberOfParams(builtin.specialExpressions[node.name].paramCount, node);
6241
- return node;
6333
+ if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
6334
+ var specialExpressionType = symbol[1];
6335
+ var type = specialExpressionType;
6336
+ switch (type) {
6337
+ case specialExpressionTypes['||']:
6338
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6339
+ case specialExpressionTypes['&&']:
6340
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6341
+ case specialExpressionTypes.recur:
6342
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6343
+ case specialExpressionTypes.array:
6344
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6345
+ case specialExpressionTypes.object:
6346
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6347
+ case specialExpressionTypes['??']: {
6348
+ if (params.length === 1) {
6349
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
6242
6350
  }
6243
- case 'fn':
6244
- case 'def':
6245
- case 'defn':
6246
- throw new Error("".concat(name_2, " is not allowed"));
6247
- /* v8 ignore next 2 */
6248
- default:
6249
- throw new Error("Unknown special expression: ".concat(name_2));
6351
+ if (params.length === 2) {
6352
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
6353
+ }
6354
+ throw new LitsError('Expected exactly two parameters', symbol[2]);
6355
+ }
6356
+ case specialExpressionTypes['defined?']: {
6357
+ if (params.length !== 1) {
6358
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6359
+ }
6360
+ var _a = __read(params, 1), param = _a[0];
6361
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6362
+ }
6363
+ case specialExpressionTypes.throw: {
6364
+ if (params.length !== 1) {
6365
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6366
+ }
6367
+ var _b = __read(params, 1), param = _b[0];
6368
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6250
6369
  }
6370
+ case specialExpressionTypes['0_fn']:
6371
+ case specialExpressionTypes['0_def']:
6372
+ case specialExpressionTypes['0_defn']:
6373
+ throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
6374
+ /* v8 ignore next 2 */
6375
+ default:
6376
+ throw new Error("Unknown special expression: ".concat(type));
6251
6377
  }
6252
- return createNamedNormalExpressionNode(symbol.value, params, symbol.sourceCodeInfo);
6378
+ }
6379
+ else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
6380
+ return createNamedNormalExpressionNode(symbol, params, symbol[2]);
6253
6381
  }
6254
6382
  else {
6255
- return {
6256
- type: 'NormalExpression',
6257
- name: undefined,
6258
- params: __spreadArray([symbol], __read(params), false),
6259
- sourceCodeInfo: symbol.sourceCodeInfo,
6260
- };
6383
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
6261
6384
  }
6262
6385
  };
6263
6386
  Parser.prototype.parseLambdaFunction = function () {
@@ -6274,16 +6397,10 @@ var Parser = /** @class */ (function () {
6274
6397
  }
6275
6398
  this.advance();
6276
6399
  var body = this.parseExpression();
6277
- return {
6278
- type: 'SpecialExpression',
6279
- name: 'fn',
6280
- params: [],
6281
- function: {
6282
- arguments: functionArguments,
6283
- body: [body],
6284
- },
6285
- sourceCodeInfo: firstToken[2],
6286
- };
6400
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
6401
+ functionArguments,
6402
+ [body],
6403
+ ]]], firstToken[2]);
6287
6404
  }
6288
6405
  catch (_a) {
6289
6406
  return null;
@@ -6292,11 +6409,7 @@ var Parser = /** @class */ (function () {
6292
6409
  Parser.prototype.parseFunctionArguments = function () {
6293
6410
  var firstToken = this.peek();
6294
6411
  if (isSymbolToken(firstToken)) {
6295
- return [{
6296
- type: 'symbol',
6297
- name: this.parseSymbol().value,
6298
- sourceCodeInfo: firstToken[2],
6299
- }];
6412
+ return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
6300
6413
  }
6301
6414
  assertLParenToken(firstToken);
6302
6415
  this.advance();
@@ -6308,13 +6421,13 @@ var Parser = /** @class */ (function () {
6308
6421
  throw new LitsError('Rest argument must be last', this.peek()[2]);
6309
6422
  }
6310
6423
  var bindingTarget = this.parseBindingTarget();
6311
- if (bindingTarget.default) {
6424
+ if (bindingTarget[1][1] !== undefined) {
6312
6425
  defaults = true;
6313
6426
  }
6314
- if (bindingTarget.type === 'rest') {
6427
+ if (bindingTarget[0] === bindingTargetTypes.rest) {
6315
6428
  rest = true;
6316
6429
  }
6317
- if (defaults && !bindingTarget.default) {
6430
+ if (defaults && !bindingTarget[1][1]) {
6318
6431
  throw new LitsError('Default arguments must be last', this.peek()[2]);
6319
6432
  }
6320
6433
  functionArguments.push(bindingTarget);
@@ -6361,22 +6474,16 @@ var Parser = /** @class */ (function () {
6361
6474
  var functionArguments = [];
6362
6475
  for (var i = 1; i <= arity; i += 1) {
6363
6476
  if (i === 1 && dollar1 === 'NAKED') {
6364
- functionArguments.push({ type: 'symbol', name: '$', sourceCodeInfo: firstToken[2] });
6477
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
6365
6478
  }
6366
6479
  else {
6367
- functionArguments.push({ type: 'symbol', name: "$".concat(i), sourceCodeInfo: firstToken[2] });
6480
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
6368
6481
  }
6369
6482
  }
6370
- var node = {
6371
- type: 'SpecialExpression',
6372
- name: 'fn',
6373
- params: [],
6374
- function: {
6375
- arguments: functionArguments,
6376
- body: [exprNode],
6377
- },
6378
- sourceCodeInfo: firstToken[2],
6379
- };
6483
+ var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
6484
+ functionArguments,
6485
+ [exprNode],
6486
+ ]]], firstToken[2]);
6380
6487
  return node;
6381
6488
  };
6382
6489
  Parser.prototype.parseOptionalDefaulValue = function () {
@@ -6392,16 +6499,14 @@ var Parser = /** @class */ (function () {
6392
6499
  // Symbol
6393
6500
  if (isSymbolToken(firstToken)) {
6394
6501
  var symbol = this.parseSymbol();
6502
+ if (!isUserDefinedSymbolNode(symbol)) {
6503
+ throw new LitsError('Expected user defined symbol', firstToken[2]);
6504
+ }
6395
6505
  var defaultValue = this.parseOptionalDefaulValue();
6396
6506
  if (requireDefaultValue && !defaultValue) {
6397
6507
  throw new LitsError('Expected assignment', this.peek()[2]);
6398
6508
  }
6399
- return {
6400
- type: 'symbol',
6401
- name: symbol.value,
6402
- default: defaultValue,
6403
- sourceCodeInfo: firstToken[2],
6404
- };
6509
+ return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
6405
6510
  }
6406
6511
  // Rest
6407
6512
  if (isOperatorToken(firstToken, '...')) {
@@ -6409,15 +6514,11 @@ var Parser = /** @class */ (function () {
6409
6514
  throw new LitsError('Rest element not allowed', firstToken[2]);
6410
6515
  }
6411
6516
  this.advance();
6412
- var symbol = this.parseSymbol();
6517
+ var symbol = asUserDefinedSymbolNode(this.parseSymbol());
6413
6518
  if (isOperatorToken(this.peek(), ':=')) {
6414
6519
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6415
6520
  }
6416
- return {
6417
- type: 'rest',
6418
- name: symbol.value,
6419
- sourceCodeInfo: firstToken[2],
6420
- };
6521
+ return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
6421
6522
  }
6422
6523
  // Array
6423
6524
  if (isLBracketToken(firstToken)) {
@@ -6436,7 +6537,7 @@ var Parser = /** @class */ (function () {
6436
6537
  continue;
6437
6538
  }
6438
6539
  var target = this.parseBindingTarget();
6439
- if (target.type === 'rest') {
6540
+ if (target[0] === bindingTargetTypes.rest) {
6440
6541
  rest = true;
6441
6542
  }
6442
6543
  elements.push(target);
@@ -6452,12 +6553,7 @@ var Parser = /** @class */ (function () {
6452
6553
  if (requireDefaultValue && !defaultValue) {
6453
6554
  throw new LitsError('Expected assignment', this.peek()[2]);
6454
6555
  }
6455
- return {
6456
- type: 'array',
6457
- elements: elements,
6458
- default: defaultValue,
6459
- sourceCodeInfo: firstToken[2],
6460
- };
6556
+ return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
6461
6557
  }
6462
6558
  // Object
6463
6559
  if (isLBraceToken(firstToken)) {
@@ -6473,40 +6569,32 @@ var Parser = /** @class */ (function () {
6473
6569
  rest = true;
6474
6570
  this.advance();
6475
6571
  }
6476
- var key = this.parseSymbol().value;
6572
+ var key = asUserDefinedSymbolNode(this.parseSymbol());
6477
6573
  token = this.peek();
6478
6574
  if (isReservedSymbolToken(token, 'as')) {
6479
6575
  if (rest) {
6480
6576
  throw new LitsError('Rest argument can not have alias', token[2]);
6481
6577
  }
6482
6578
  this.advance();
6483
- var name_3 = this.parseSymbol().value;
6484
- if (elements[name_3]) {
6485
- throw new LitsError("Duplicate binding name: ".concat(name_3), token[2]);
6579
+ var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
6580
+ if (elements[name_2[1]]) {
6581
+ throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
6486
6582
  }
6487
- elements[key] = {
6488
- type: 'symbol',
6489
- name: name_3,
6490
- default: this.parseOptionalDefaulValue(),
6491
- sourceCodeInfo: firstToken[2],
6492
- };
6583
+ elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
6493
6584
  }
6494
6585
  else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
6495
- if (elements[key]) {
6586
+ if (elements[key[1]]) {
6496
6587
  throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
6497
6588
  }
6498
6589
  if (rest && isOperatorToken(this.peek(), ':=')) {
6499
6590
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6500
6591
  }
6501
- elements[key] = {
6502
- type: rest ? 'rest' : 'symbol',
6503
- name: key,
6504
- default: this.parseOptionalDefaulValue(),
6505
- sourceCodeInfo: firstToken[2],
6506
- };
6592
+ elements[key[1]] = rest
6593
+ ? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
6594
+ : withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
6507
6595
  }
6508
6596
  else if (isLBraceToken(token) || isLBracketToken(token)) {
6509
- elements[key] = this.parseBindingTarget();
6597
+ elements[key[1]] = this.parseBindingTarget();
6510
6598
  }
6511
6599
  if (!isRBraceToken(this.peek())) {
6512
6600
  assertOperatorToken(this.peek(), ',');
@@ -6520,12 +6608,7 @@ var Parser = /** @class */ (function () {
6520
6608
  if (requireDefaultValue && !defaultValue) {
6521
6609
  throw new LitsError('Expected assignment', token[2]);
6522
6610
  }
6523
- return {
6524
- type: 'object',
6525
- elements: elements,
6526
- default: defaultValue,
6527
- sourceCodeInfo: firstToken[2],
6528
- };
6611
+ return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
6529
6612
  }
6530
6613
  throw new LitsError('Expected symbol', this.peek()[2]);
6531
6614
  };
@@ -6533,22 +6616,13 @@ var Parser = /** @class */ (function () {
6533
6616
  if (optionalSemicolon === void 0) { optionalSemicolon = false; }
6534
6617
  this.advance();
6535
6618
  var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
6536
- var value = target.default;
6537
- delete target.default;
6619
+ var value = target[1][1];
6620
+ target[1][1] = undefined;
6538
6621
  if (!optionalSemicolon) {
6539
6622
  assertOperatorToken(this.peek(), ';');
6540
6623
  }
6541
- return {
6542
- type: 'SpecialExpression',
6543
- name: 'let',
6544
- bindingNode: {
6545
- type: 'Binding',
6546
- target: target,
6547
- value: value,
6548
- sourceCodeInfo: token[2],
6549
- },
6550
- sourceCodeInfo: token[2],
6551
- };
6624
+ var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
6625
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
6552
6626
  };
6553
6627
  Parser.prototype.parseDo = function (token) {
6554
6628
  this.advance();
@@ -6564,12 +6638,7 @@ var Parser = /** @class */ (function () {
6564
6638
  }
6565
6639
  assertReservedSymbolToken(this.peek(), 'end');
6566
6640
  this.advance();
6567
- return {
6568
- type: 'SpecialExpression',
6569
- name: 'do',
6570
- params: expressions,
6571
- sourceCodeInfo: token[2],
6572
- };
6641
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6573
6642
  };
6574
6643
  Parser.prototype.parseLoop = function (firstToken) {
6575
6644
  this.advance();
@@ -6579,14 +6648,9 @@ var Parser = /** @class */ (function () {
6579
6648
  assertSymbolToken(token, 'let');
6580
6649
  this.advance();
6581
6650
  var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
6582
- var value = target.default;
6583
- delete target.default;
6584
- bindingNodes.push({
6585
- type: 'Binding',
6586
- target: target,
6587
- value: value,
6588
- sourceCodeInfo: token[2],
6589
- });
6651
+ var value = target[1][1];
6652
+ target[1][1] = undefined;
6653
+ bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
6590
6654
  if (isOperatorToken(this.peek(), ',')) {
6591
6655
  this.advance();
6592
6656
  }
@@ -6609,13 +6673,7 @@ var Parser = /** @class */ (function () {
6609
6673
  }
6610
6674
  assertReservedSymbolToken(this.peek(), 'end');
6611
6675
  this.advance();
6612
- return {
6613
- type: 'SpecialExpression',
6614
- name: 'loop',
6615
- params: params,
6616
- bindingNodes: bindingNodes,
6617
- sourceCodeInfo: firstToken[2],
6618
- };
6676
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
6619
6677
  };
6620
6678
  Parser.prototype.parseTry = function (token) {
6621
6679
  this.advance();
@@ -6631,12 +6689,7 @@ var Parser = /** @class */ (function () {
6631
6689
  }
6632
6690
  var tryExpression = tryExpressions.length === 1
6633
6691
  ? tryExpressions[0]
6634
- : {
6635
- type: 'SpecialExpression',
6636
- name: 'do',
6637
- params: tryExpressions,
6638
- sourceCodeInfo: token[2],
6639
- };
6692
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
6640
6693
  assertReservedSymbolToken(this.peek(), 'catch');
6641
6694
  this.advance();
6642
6695
  var errorSymbol;
@@ -6660,20 +6713,8 @@ var Parser = /** @class */ (function () {
6660
6713
  this.advance();
6661
6714
  var catchExpression = catchExpressions.length === 1
6662
6715
  ? catchExpressions[0]
6663
- : {
6664
- type: 'SpecialExpression',
6665
- name: 'do',
6666
- params: catchExpressions,
6667
- sourceCodeInfo: token[2],
6668
- };
6669
- return {
6670
- type: 'SpecialExpression',
6671
- name: 'try',
6672
- params: [tryExpression],
6673
- ce: catchExpression,
6674
- e: errorSymbol,
6675
- sourceCodeInfo: token[2],
6676
- };
6716
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
6717
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
6677
6718
  };
6678
6719
  Parser.prototype.parseForOrDoseq = function (firstToken) {
6679
6720
  var isDoseq = firstToken[1] === 'doseq';
@@ -6681,10 +6722,10 @@ var Parser = /** @class */ (function () {
6681
6722
  var forLoopBindings = [];
6682
6723
  var _loop_1 = function () {
6683
6724
  var loopBinding = this_1.parseForLoopBinding();
6684
- var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b.b.target)); });
6685
- var newBoundNames = getAllBindingTargetNames(loopBinding.b.target);
6725
+ var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
6726
+ var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
6686
6727
  if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
6687
- throw new LitsError('Duplicate binding', loopBinding.b.sourceCodeInfo);
6728
+ throw new LitsError('Duplicate binding', loopBinding[0][2]);
6688
6729
  }
6689
6730
  forLoopBindings.push(loopBinding);
6690
6731
  };
@@ -6706,13 +6747,9 @@ var Parser = /** @class */ (function () {
6706
6747
  }
6707
6748
  assertReservedSymbolToken(this.peek(), 'end');
6708
6749
  this.advance();
6709
- return {
6710
- type: 'SpecialExpression',
6711
- name: isDoseq ? 'doseq' : 'for',
6712
- params: expressions,
6713
- sourceCodeInfo: firstToken[2],
6714
- l: forLoopBindings,
6715
- };
6750
+ return isDoseq
6751
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
6752
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
6716
6753
  };
6717
6754
  Parser.prototype.parseForLoopBinding = function () {
6718
6755
  assertReservedSymbolToken(this.peek(), 'each');
@@ -6734,18 +6771,17 @@ var Parser = /** @class */ (function () {
6734
6771
  && !isReservedSymbolToken(token, 'each')) {
6735
6772
  throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
6736
6773
  }
6737
- var letBindings;
6774
+ var letBindings = [];
6738
6775
  if (token[1] === 'let') {
6739
6776
  modifiers.push('&let');
6740
- letBindings = [];
6741
6777
  var _loop_2 = function () {
6742
6778
  var letNode = this_2.parseLet(token, true);
6743
- var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b.target)); });
6744
- var newBoundNames = Object.keys(getAllBindingTargetNames(letNode.bindingNode.target));
6779
+ var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
6780
+ var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
6745
6781
  if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
6746
- throw new LitsError('Duplicate binding', letNode.bindingNode.sourceCodeInfo);
6782
+ throw new LitsError('Duplicate binding', letNode[1][1][2]);
6747
6783
  }
6748
- letBindings.push(letNode.bindingNode);
6784
+ letBindings.push(letNode[1][1]);
6749
6785
  token = this_2.peek();
6750
6786
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
6751
6787
  throw new LitsError('Expected do, each or comma', token[2]);
@@ -6791,31 +6827,21 @@ var Parser = /** @class */ (function () {
6791
6827
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
6792
6828
  throw new LitsError('Expected do or each', token[2]);
6793
6829
  }
6794
- return {
6795
- b: bindingNode,
6796
- m: modifiers,
6797
- l: letBindings,
6798
- wn: whenNode,
6799
- we: whileNode,
6800
- };
6830
+ return [bindingNode, letBindings, whenNode, whileNode];
6801
6831
  };
6802
6832
  Parser.prototype.parseBinding = function () {
6803
6833
  var firstToken = asSymbolToken(this.peek());
6804
- var name = firstToken[1];
6805
- this.advance();
6834
+ var name = asUserDefinedSymbolNode(this.parseSymbol());
6806
6835
  assertReservedSymbolToken(this.peek(), 'in');
6807
6836
  this.advance();
6808
6837
  var value = this.parseExpression();
6809
- var node = {
6810
- type: 'Binding',
6811
- target: {
6812
- type: 'symbol',
6813
- name: name,
6814
- sourceCodeInfo: firstToken[2],
6815
- },
6816
- value: value,
6817
- sourceCodeInfo: firstToken[2],
6818
- };
6838
+ var node = withSourceCodeInfo([
6839
+ NodeTypes.Binding,
6840
+ [
6841
+ withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
6842
+ value,
6843
+ ],
6844
+ ], firstToken[2]);
6819
6845
  return node;
6820
6846
  };
6821
6847
  Parser.prototype.parseIfOrUnless = function (token) {
@@ -6838,12 +6864,7 @@ var Parser = /** @class */ (function () {
6838
6864
  }
6839
6865
  var thenExpression = thenExpressions.length === 1
6840
6866
  ? thenExpressions[0]
6841
- : {
6842
- type: 'SpecialExpression',
6843
- name: 'do',
6844
- params: thenExpressions,
6845
- sourceCodeInfo: token[2],
6846
- };
6867
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
6847
6868
  var elseExpression;
6848
6869
  if (isReservedSymbolToken(this.peek(), 'else')) {
6849
6870
  this.advance();
@@ -6859,25 +6880,13 @@ var Parser = /** @class */ (function () {
6859
6880
  }
6860
6881
  elseExpression = elseExpressions.length === 1
6861
6882
  ? elseExpressions[0]
6862
- : {
6863
- type: 'SpecialExpression',
6864
- name: 'do',
6865
- params: elseExpressions,
6866
- sourceCodeInfo: token[2],
6867
- };
6883
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
6868
6884
  }
6869
6885
  assertReservedSymbolToken(this.peek(), 'end');
6870
6886
  this.advance();
6871
- var params = [condition, thenExpression];
6872
- if (elseExpression) {
6873
- params.push(elseExpression);
6874
- }
6875
- return {
6876
- type: 'SpecialExpression',
6877
- name: isUnless ? 'unless' : 'if',
6878
- params: params,
6879
- sourceCodeInfo: token[2],
6880
- };
6887
+ return isUnless
6888
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
6889
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
6881
6890
  };
6882
6891
  Parser.prototype.parseCond = function (token) {
6883
6892
  this.advance();
@@ -6885,7 +6894,7 @@ var Parser = /** @class */ (function () {
6885
6894
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6886
6895
  assertReservedSymbolToken(this.peek(), 'case');
6887
6896
  this.advance();
6888
- params.push(this.parseExpression());
6897
+ var caseExpression = this.parseExpression();
6889
6898
  assertReservedSymbolToken(this.peek(), 'then');
6890
6899
  this.advance();
6891
6900
  var expressions = [];
@@ -6900,14 +6909,10 @@ var Parser = /** @class */ (function () {
6900
6909
  throw new LitsError('Expected ;', this.peek()[2]);
6901
6910
  }
6902
6911
  }
6903
- params.push(expressions.length === 1
6912
+ var thenExpression = expressions.length === 1
6904
6913
  ? expressions[0]
6905
- : {
6906
- type: 'SpecialExpression',
6907
- name: 'do',
6908
- params: expressions,
6909
- sourceCodeInfo: token[2],
6910
- });
6914
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6915
+ params.push([caseExpression, thenExpression]);
6911
6916
  if (isReservedSymbolToken(this.peek(), 'end')) {
6912
6917
  break;
6913
6918
  }
@@ -6915,20 +6920,16 @@ var Parser = /** @class */ (function () {
6915
6920
  }
6916
6921
  assertReservedSymbolToken(this.peek(), 'end');
6917
6922
  this.advance();
6918
- return {
6919
- type: 'SpecialExpression',
6920
- name: 'cond',
6921
- params: params,
6922
- sourceCodeInfo: token[2],
6923
- };
6923
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
6924
6924
  };
6925
6925
  Parser.prototype.parseSwitch = function (token) {
6926
6926
  this.advance();
6927
- var params = [this.parseExpression()];
6927
+ var valueExpression = this.parseExpression();
6928
+ var params = [];
6928
6929
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6929
6930
  assertReservedSymbolToken(this.peek(), 'case');
6930
6931
  this.advance();
6931
- params.push(this.parseExpression());
6932
+ var caseExpression = this.parseExpression();
6932
6933
  assertReservedSymbolToken(this.peek(), 'then');
6933
6934
  this.advance();
6934
6935
  var expressions = [];
@@ -6943,14 +6944,10 @@ var Parser = /** @class */ (function () {
6943
6944
  throw new LitsError('Expected ;', this.peek()[2]);
6944
6945
  }
6945
6946
  }
6946
- params.push(expressions.length === 1
6947
+ var thenExpression = expressions.length === 1
6947
6948
  ? expressions[0]
6948
- : {
6949
- type: 'SpecialExpression',
6950
- name: 'do',
6951
- params: expressions,
6952
- sourceCodeInfo: token[2],
6953
- });
6949
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6950
+ params.push([caseExpression, thenExpression]);
6954
6951
  if (isReservedSymbolToken(this.peek(), 'end')) {
6955
6952
  break;
6956
6953
  }
@@ -6958,12 +6955,7 @@ var Parser = /** @class */ (function () {
6958
6955
  }
6959
6956
  assertReservedSymbolToken(this.peek(), 'end');
6960
6957
  this.advance();
6961
- return {
6962
- type: 'SpecialExpression',
6963
- name: 'switch',
6964
- params: params,
6965
- sourceCodeInfo: token[2],
6966
- };
6958
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
6967
6959
  };
6968
6960
  Parser.prototype.parseFunction = function (token) {
6969
6961
  this.advance();
@@ -6982,17 +6974,10 @@ var Parser = /** @class */ (function () {
6982
6974
  assertReservedSymbolToken(this.peek(), 'end');
6983
6975
  this.advance();
6984
6976
  assertOperatorToken(this.peek(), ';');
6985
- return {
6986
- type: 'SpecialExpression',
6987
- name: 'function',
6988
- functionName: symbol,
6989
- params: [],
6990
- function: {
6991
- arguments: functionArguments,
6992
- body: body,
6993
- },
6994
- sourceCodeInfo: token[2],
6995
- };
6977
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
6978
+ functionArguments,
6979
+ body,
6980
+ ]]], token[2]);
6996
6981
  };
6997
6982
  Parser.prototype.isAtEnd = function () {
6998
6983
  return this.parseState.position >= this.tokenStream.tokens.length;
@@ -7014,7 +6999,7 @@ var Parser = /** @class */ (function () {
7014
6999
  this.advance();
7015
7000
  if (isSymbolToken(this.peek(), 'let')) {
7016
7001
  var letNode = this.parseLet(asSymbolToken(this.peek()));
7017
- return __assign(__assign({}, letNode), { name: 'def' });
7002
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_def'], letNode[1][1]]], token[2]);
7018
7003
  }
7019
7004
  else if (isReservedSymbolToken(this.peek(), 'function')) {
7020
7005
  this.advance();
@@ -7032,71 +7017,57 @@ var Parser = /** @class */ (function () {
7032
7017
  }
7033
7018
  assertReservedSymbolToken(this.peek(), 'end');
7034
7019
  this.advance();
7035
- return {
7036
- type: 'SpecialExpression',
7037
- name: 'defn',
7038
- functionName: symbol,
7039
- params: [],
7040
- function: {
7041
- arguments: functionArguments,
7042
- body: body,
7043
- },
7044
- sourceCodeInfo: token[2],
7045
- };
7020
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_defn'], symbol, [
7021
+ functionArguments,
7022
+ body,
7023
+ ]]], token[2]);
7046
7024
  }
7047
7025
  else {
7048
7026
  throw new LitsError('Expected let or function', this.peek()[2]);
7049
7027
  }
7050
7028
  };
7029
+ Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
7030
+ if (specialExpressionTypes[value] !== undefined && value !== 'fn' && value !== 'def' && value !== 'defn') {
7031
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
7032
+ }
7033
+ if (normalExpressionTypes[value] !== undefined) {
7034
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
7035
+ }
7036
+ return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
7037
+ };
7038
+ Parser.prototype.stringFromQuotedSymbol = function (value) {
7039
+ return value.substring(1, value.length - 1)
7040
+ .replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
7041
+ if (backslash) {
7042
+ return '\\';
7043
+ }
7044
+ if (singleQuote) {
7045
+ return '\'';
7046
+ }
7047
+ return "\\".concat(normalChar);
7048
+ });
7049
+ };
7051
7050
  Parser.prototype.parseSymbol = function () {
7052
7051
  var token = this.peek();
7053
7052
  this.advance();
7054
7053
  if (!isSymbolToken(token)) {
7055
7054
  throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
7056
7055
  }
7057
- if (token[1][0] !== '\'') {
7058
- return {
7059
- type: 'Symbol',
7060
- value: token[1],
7061
- sourceCodeInfo: token[2],
7062
- };
7056
+ if (token[1][0] === '\'') {
7057
+ return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
7063
7058
  }
7064
7059
  else {
7065
- var value = token[1].substring(1, token[1].length - 1)
7066
- .replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
7067
- if (backslash) {
7068
- return '\\';
7069
- }
7070
- if (singleQuote) {
7071
- return '\'';
7072
- }
7073
- return "\\".concat(normalChar);
7074
- });
7075
- return {
7076
- type: 'Symbol',
7077
- value: value,
7078
- sourceCodeInfo: token[2],
7079
- };
7060
+ return this.stringToSymbolNode(token[1], token[2]);
7080
7061
  }
7081
7062
  };
7082
7063
  Parser.prototype.parseReservedSymbol = function () {
7083
- var token = this.peek();
7064
+ var token = asReservedSymbolToken(this.peek());
7084
7065
  this.advance();
7085
- if (isReservedSymbolToken(token)) {
7086
- var symbol = token[1];
7087
- if (isNumberReservedSymbol(symbol)) {
7088
- return {
7089
- type: 'Number',
7090
- value: numberReservedSymbolRecord[symbol],
7091
- sourceCodeInfo: token[2],
7092
- };
7093
- }
7066
+ var symbol = token[1];
7067
+ if (isNumberReservedSymbol(symbol)) {
7068
+ return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
7094
7069
  }
7095
- return {
7096
- type: 'ReservedSymbol',
7097
- value: token[1],
7098
- sourceCodeInfo: token[2],
7099
- };
7070
+ return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
7100
7071
  };
7101
7072
  Parser.prototype.parseNumber = function () {
7102
7073
  var token = this.peek();
@@ -7104,11 +7075,7 @@ var Parser = /** @class */ (function () {
7104
7075
  var value = token[1];
7105
7076
  var negative = value[0] === '-';
7106
7077
  var numberString = (negative ? value.substring(1) : value).replace(/_/g, '');
7107
- return {
7108
- type: 'Number',
7109
- value: negative ? -Number(numberString) : Number(numberString),
7110
- sourceCodeInfo: token[2],
7111
- };
7078
+ return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
7112
7079
  };
7113
7080
  Parser.prototype.parseString = function () {
7114
7081
  var token = this.peek();
@@ -7140,11 +7107,7 @@ var Parser = /** @class */ (function () {
7140
7107
  }
7141
7108
  return normalChar;
7142
7109
  });
7143
- return {
7144
- type: 'String',
7145
- value: value,
7146
- sourceCodeInfo: token[2],
7147
- };
7110
+ return withSourceCodeInfo([NodeTypes.String, value], token[2]);
7148
7111
  };
7149
7112
  Parser.prototype.parseRegexpShorthand = function () {
7150
7113
  var token = this.peek();
@@ -7152,22 +7115,15 @@ var Parser = /** @class */ (function () {
7152
7115
  var endStringPosition = token[1].lastIndexOf('"');
7153
7116
  var regexpString = token[1].substring(2, endStringPosition);
7154
7117
  var optionsString = token[1].substring(endStringPosition + 1);
7155
- var stringNode = {
7156
- type: 'String',
7157
- value: regexpString,
7158
- sourceCodeInfo: token[2],
7159
- };
7160
- var optionsNode = {
7161
- type: 'String',
7162
- value: optionsString,
7163
- sourceCodeInfo: token[2],
7164
- };
7165
- var node = {
7166
- type: 'NormalExpression',
7167
- name: 'regexp',
7168
- params: [stringNode, optionsNode],
7169
- sourceCodeInfo: token[2],
7170
- };
7118
+ var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
7119
+ var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
7120
+ var node = withSourceCodeInfo([
7121
+ NodeTypes.NormalExpression,
7122
+ [
7123
+ withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
7124
+ [stringNode, optionsNode],
7125
+ ],
7126
+ ], token[2]);
7171
7127
  return node;
7172
7128
  };
7173
7129
  return Parser;
@@ -7284,7 +7240,7 @@ var Lits = /** @class */ (function () {
7284
7240
  if (params === void 0) { params = {}; }
7285
7241
  var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
7286
7242
  var contextStack = createContextStack(params);
7287
- return getUndefinedSymbols(ast, contextStack, builtin, evaluateAstNode);
7243
+ return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
7288
7244
  };
7289
7245
  Lits.prototype.tokenize = function (program, tokenizeParams) {
7290
7246
  if (tokenizeParams === void 0) { tokenizeParams = {}; }
@@ -7686,28 +7642,6 @@ var api = {
7686
7642
  'replace',
7687
7643
  'replace-all',
7688
7644
  ],
7689
- specialExpressions: [
7690
- '&&',
7691
- '||',
7692
- 'def',
7693
- 'let',
7694
- 'fn',
7695
- 'defn',
7696
- 'function',
7697
- 'try',
7698
- 'throw',
7699
- 'if',
7700
- 'unless',
7701
- 'cond',
7702
- 'switch',
7703
- 'do',
7704
- 'recur',
7705
- 'loop',
7706
- 'doseq',
7707
- 'for',
7708
- 'defined?',
7709
- '??',
7710
- ],
7711
7645
  string: [
7712
7646
  'string-repeat',
7713
7647
  'str',
@@ -13319,8 +13253,7 @@ Object.entries(specialExpressionsReference).forEach(function (_a) {
13319
13253
  var _b;
13320
13254
  var _c = __read(_a, 2), key = _c[0], obj = _c[1];
13321
13255
  if (isFunctionReference(obj)) {
13322
- var specialExpressions = builtin.specialExpressions;
13323
- var paramCount = (_b = specialExpressions[key]) === null || _b === void 0 ? void 0 : _b.paramCount;
13256
+ var paramCount = (_b = specialExpressions[specialExpressionTypes[key]]) === null || _b === void 0 ? void 0 : _b.paramCount;
13324
13257
  if (paramCount && canBeOperator(paramCount)) {
13325
13258
  obj._isOperator = true;
13326
13259
  }
@@ -13338,7 +13271,7 @@ function stringifyValue(value, html) {
13338
13271
  var lt = '<';
13339
13272
  if (isLitsFunction(value)) {
13340
13273
  if (value.functionType === 'Builtin')
13341
- return "".concat(lt, "builtin function ").concat(value.n).concat(gt);
13274
+ return "".concat(lt, "builtin function ").concat(value.normalBuitinSymbolType).concat(gt);
13342
13275
  else
13343
13276
  return "".concat(lt, "function ").concat((_a = value.n) !== null && _a !== void 0 ? _a : '\u03BB').concat(gt);
13344
13277
  }