@mojir/lits 2.1.0 → 2.1.1

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 (91) hide show
  1. package/README.md +392 -109
  2. package/dist/cli/cli.js +863 -914
  3. package/dist/cli/reference/index.d.ts +208 -208
  4. package/dist/cli/src/builtin/bindingNode.d.ts +2 -2
  5. package/dist/cli/src/builtin/index.d.ts +10 -50
  6. package/dist/cli/src/builtin/interface.d.ts +10 -17
  7. package/dist/cli/src/builtin/normalExpressions/index.d.ts +4 -1
  8. package/dist/cli/src/builtin/specialExpressionTypes.d.ts +27 -0
  9. package/dist/cli/src/builtin/specialExpressions/and.d.ts +3 -3
  10. package/dist/cli/src/builtin/specialExpressions/array.d.ts +3 -3
  11. package/dist/cli/src/builtin/specialExpressions/cond.d.ts +3 -3
  12. package/dist/cli/src/builtin/specialExpressions/def.d.ts +3 -6
  13. package/dist/cli/src/builtin/specialExpressions/defined.d.ts +5 -0
  14. package/dist/cli/src/builtin/specialExpressions/do.d.ts +3 -3
  15. package/dist/cli/src/builtin/specialExpressions/functions.d.ts +5 -13
  16. package/dist/cli/src/builtin/specialExpressions/if.d.ts +3 -3
  17. package/dist/cli/src/builtin/specialExpressions/let.d.ts +3 -6
  18. package/dist/cli/src/builtin/specialExpressions/loop.d.ts +3 -4
  19. package/dist/cli/src/builtin/specialExpressions/loops.d.ts +5 -14
  20. package/dist/cli/src/builtin/specialExpressions/object.d.ts +3 -3
  21. package/dist/cli/src/builtin/specialExpressions/or.d.ts +3 -3
  22. package/dist/cli/src/builtin/specialExpressions/qq.d.ts +3 -3
  23. package/dist/cli/src/builtin/specialExpressions/recur.d.ts +3 -3
  24. package/dist/cli/src/builtin/specialExpressions/switch.d.ts +3 -3
  25. package/dist/cli/src/builtin/specialExpressions/throw.d.ts +3 -3
  26. package/dist/cli/src/builtin/specialExpressions/try.d.ts +3 -5
  27. package/dist/cli/src/builtin/specialExpressions/unless.d.ts +3 -3
  28. package/dist/cli/src/builtin/utils.d.ts +2 -5
  29. package/dist/cli/src/constants/constants.d.ts +15 -3
  30. package/dist/cli/src/evaluator/ContextStack.d.ts +3 -3
  31. package/dist/cli/src/evaluator/functionExecutors.d.ts +3 -3
  32. package/dist/cli/src/evaluator/index.d.ts +2 -2
  33. package/dist/cli/src/evaluator/interface.d.ts +3 -3
  34. package/dist/cli/src/getUndefinedSymbols/index.d.ts +3 -3
  35. package/dist/cli/src/parser/Parser.d.ts +7 -5
  36. package/dist/cli/src/parser/types.d.ts +33 -96
  37. package/dist/cli/src/typeGuards/astNode.d.ts +24 -16
  38. package/dist/cli/src/typeGuards/index.d.ts +2 -5
  39. package/dist/cli/src/typeGuards/litsFunction.d.ts +2 -2
  40. package/dist/cli/src/utils/index.d.ts +0 -1
  41. package/dist/index.esm.js +836 -887
  42. package/dist/index.esm.js.map +1 -1
  43. package/dist/index.js +836 -887
  44. package/dist/index.js.map +1 -1
  45. package/dist/lits.iife.js +836 -887
  46. package/dist/lits.iife.js.map +1 -1
  47. package/dist/reference/index.d.ts +208 -208
  48. package/dist/src/builtin/bindingNode.d.ts +2 -2
  49. package/dist/src/builtin/index.d.ts +10 -50
  50. package/dist/src/builtin/interface.d.ts +10 -17
  51. package/dist/src/builtin/normalExpressions/index.d.ts +4 -1
  52. package/dist/src/builtin/specialExpressionTypes.d.ts +27 -0
  53. package/dist/src/builtin/specialExpressions/and.d.ts +3 -3
  54. package/dist/src/builtin/specialExpressions/array.d.ts +3 -3
  55. package/dist/src/builtin/specialExpressions/cond.d.ts +3 -3
  56. package/dist/src/builtin/specialExpressions/def.d.ts +3 -6
  57. package/dist/src/builtin/specialExpressions/defined.d.ts +5 -0
  58. package/dist/src/builtin/specialExpressions/do.d.ts +3 -3
  59. package/dist/src/builtin/specialExpressions/functions.d.ts +5 -13
  60. package/dist/src/builtin/specialExpressions/if.d.ts +3 -3
  61. package/dist/src/builtin/specialExpressions/let.d.ts +3 -6
  62. package/dist/src/builtin/specialExpressions/loop.d.ts +3 -4
  63. package/dist/src/builtin/specialExpressions/loops.d.ts +5 -14
  64. package/dist/src/builtin/specialExpressions/object.d.ts +3 -3
  65. package/dist/src/builtin/specialExpressions/or.d.ts +3 -3
  66. package/dist/src/builtin/specialExpressions/qq.d.ts +3 -3
  67. package/dist/src/builtin/specialExpressions/recur.d.ts +3 -3
  68. package/dist/src/builtin/specialExpressions/switch.d.ts +3 -3
  69. package/dist/src/builtin/specialExpressions/throw.d.ts +3 -3
  70. package/dist/src/builtin/specialExpressions/try.d.ts +3 -5
  71. package/dist/src/builtin/specialExpressions/unless.d.ts +3 -3
  72. package/dist/src/builtin/utils.d.ts +2 -5
  73. package/dist/src/constants/constants.d.ts +15 -3
  74. package/dist/src/evaluator/ContextStack.d.ts +3 -3
  75. package/dist/src/evaluator/functionExecutors.d.ts +3 -3
  76. package/dist/src/evaluator/index.d.ts +2 -2
  77. package/dist/src/evaluator/interface.d.ts +3 -3
  78. package/dist/src/getUndefinedSymbols/index.d.ts +3 -3
  79. package/dist/src/parser/Parser.d.ts +7 -5
  80. package/dist/src/parser/types.d.ts +33 -96
  81. package/dist/src/typeGuards/astNode.d.ts +24 -16
  82. package/dist/src/typeGuards/index.d.ts +2 -5
  83. package/dist/src/typeGuards/litsFunction.d.ts +2 -2
  84. package/dist/src/utils/index.d.ts +0 -1
  85. package/dist/testFramework.esm.js +851 -901
  86. package/dist/testFramework.esm.js.map +1 -1
  87. package/dist/testFramework.js +851 -901
  88. package/dist/testFramework.js.map +1 -1
  89. package/package.json +1 -1
  90. package/dist/cli/src/builtin/specialExpressions/declared.d.ts +0 -5
  91. 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.1";
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
+ 'def': 5,
194
+ 'defined?': 6,
195
+ 'defn': 7,
196
+ 'do': 8,
197
+ 'doseq': 9,
198
+ '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,155 @@ 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) {
312
+ function isSpecialBuiltinSymbolNode(node, name) {
313
+ if (NodeTypes.SpecialBuiltinSymbol !== node[0]) {
316
314
  return false;
317
315
  }
318
- if (typeof count.max === 'number' && count.max < 2) {
319
- return false;
316
+ {
317
+ return true;
320
318
  }
321
- if (typeof count.min === 'number' && count.min > 2) {
319
+ }
320
+ // export function isNumberNode(node: Node): node is NumberNode {
321
+ // return node[0] === NodeTypes.Number
322
+ // }
323
+ // export function asNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): NumberNode {
324
+ // assertNumberNode(node, sourceCodeInfo)
325
+ // return node
326
+ // }
327
+ // export function assertNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): asserts node is NumberNode {
328
+ // if (!isNumberNode(node))
329
+ // throw getAssertionError('NumberNode', node, sourceCodeInfo)
330
+ // }
331
+ function isNormalExpressionNode(node) {
332
+ return node[0] === NodeTypes.NormalExpression;
333
+ }
334
+ function isNormalExpressionNodeWithName(node) {
335
+ if (!isNormalExpressionNode(node)) {
322
336
  return false;
323
337
  }
324
- return true;
338
+ return isSymbolNode(node[1][0]);
339
+ }
340
+ function isSpreadNode(node) {
341
+ return node[0] === NodeTypes.Spread;
325
342
  }
326
343
 
327
- var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateAstNode) {
344
+ var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
328
345
  var e_1, _a;
329
346
  var _b;
330
- var astNodes = Array.isArray(ast)
347
+ var nodes = Array.isArray(ast)
331
348
  ? ast
332
- : [{
333
- type: 'SpecialExpression',
334
- name: 'do',
335
- params: ast.body,
336
- sourceCodeInfo: undefined,
337
- }];
349
+ : [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
338
350
  var unresolvedSymbols = new Set();
339
351
  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); });
352
+ for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
353
+ var subNode = nodes_1_1.value;
354
+ (_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
343
355
  }
344
356
  }
345
357
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
346
358
  finally {
347
359
  try {
348
- if (astNodes_1_1 && !astNodes_1_1.done && (_a = astNodes_1.return)) _a.call(astNodes_1);
360
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
349
361
  }
350
362
  finally { if (e_1) throw e_1.error; }
351
363
  }
352
364
  return unresolvedSymbols;
353
365
  };
354
- function findUnresolvedSymbolsInAstNode(astNode, contextStack, builtin, evaluateAstNode) {
366
+ function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
355
367
  var e_2, _a;
356
- var _b;
357
- switch (astNode.type) {
358
- case 'Symbol': {
359
- var lookUpResult = contextStack.lookUp(astNode);
368
+ var _b, _c;
369
+ var nodeType = node[0];
370
+ switch (nodeType) {
371
+ case NodeTypes.UserDefinedSymbol: {
372
+ var symbolNode = node;
373
+ var lookUpResult = contextStack.lookUp(symbolNode);
360
374
  if (lookUpResult === null)
361
- return new Set([astNode.value]);
375
+ return new Set([symbolNode[1]]);
362
376
  return null;
363
377
  }
364
- case 'String':
365
- case 'Number':
366
- case 'Modifier':
367
- case 'ReservedSymbol':
368
- case 'Comment':
378
+ case NodeTypes.NormalBuiltinSymbol:
379
+ case NodeTypes.SpecialBuiltinSymbol:
380
+ case NodeTypes.String:
381
+ case NodeTypes.Number:
382
+ case NodeTypes.ReservedSymbol:
369
383
  return null;
370
- case 'NormalExpression': {
384
+ case NodeTypes.NormalExpression: {
385
+ var normalExpressionNode = node;
371
386
  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);
387
+ if (isNormalExpressionNodeWithName(normalExpressionNode)) {
388
+ var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
389
+ if (isUserDefinedSymbolNode(symbolNode)) {
390
+ var lookUpResult = contextStack.lookUp(symbolNode);
391
+ if (lookUpResult === null)
392
+ unresolvedSymbols_1.add(symbolNode[1]);
393
+ }
394
+ }
395
+ else {
396
+ var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
397
+ (_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
377
398
  }
378
399
  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); });
400
+ for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
401
+ var subNode = _j.value;
402
+ (_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
382
403
  }
383
404
  }
384
405
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
385
406
  finally {
386
407
  try {
387
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
408
+ if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
388
409
  }
389
410
  finally { if (e_2) throw e_2.error; }
390
411
  }
391
412
  return unresolvedSymbols_1;
392
413
  }
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, {
414
+ case NodeTypes.SpecialExpression: {
415
+ var specialExpressionNode = node;
416
+ var specialExpressionType = specialExpressionNode[1][0];
417
+ var specialExpression = builtin.specialExpressions[specialExpressionType];
418
+ var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
419
+ return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
397
420
  getUndefinedSymbols: getUndefinedSymbols,
398
421
  builtin: builtin,
399
- evaluateAstNode: evaluateAstNode,
422
+ evaluateNode: evaluateNode,
400
423
  });
401
424
  }
402
- case 'Spread':
403
- return findUnresolvedSymbolsInAstNode(astNode.value, contextStack, builtin, evaluateAstNode);
425
+ case NodeTypes.Spread:
426
+ return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
427
+ case NodeTypes.Binding: {
428
+ var bindingNode = node;
429
+ return findUnresolvedSymbolsInNode(bindingNode[1][1], contextStack, builtin, evaluateNode);
430
+ }
431
+ default:
432
+ throw new Error("Unhandled node type: ".concat(nodeType));
404
433
  }
405
434
  }
406
435
 
@@ -606,8 +635,71 @@ var bitwiseNormalExpression = {
606
635
  },
607
636
  };
608
637
 
609
- function getAssertionError(typeName, value, sourceCodeInfo) {
610
- return new LitsError("Expected ".concat(typeName, ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
638
+ function assertNumberOfParams(count, node) {
639
+ var length = node[1][1].length;
640
+ if (typeof count === 'number') {
641
+ if (length !== count) {
642
+ var name_1 = getNodeTypeName(node[0]);
643
+ throw new LitsError("Wrong number of arguments to \"".concat(name_1, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), node[2]);
644
+ }
645
+ }
646
+ else {
647
+ var min = count.min, max = count.max, even = count.even, odd = count.odd;
648
+ if (even) {
649
+ var name_2 = getNodeTypeName(node[0]);
650
+ if (length % 2 !== 0) {
651
+ throw new LitsError("Wrong number of arguments to \"".concat(name_2, "\",, expected an even number, got ").concat(valueToString(length), "."), node[2]);
652
+ }
653
+ }
654
+ if (odd) {
655
+ if (length % 2 !== 1) {
656
+ var name_3 = getNodeTypeName(node[0]);
657
+ throw new LitsError("Wrong number of arguments to \"".concat(name_3, "\",, expected an odd number, got ").concat(valueToString(length), "."), node[2]);
658
+ }
659
+ }
660
+ if (typeof min === 'number' && length < min) {
661
+ var name_4 = getNodeTypeName(node[0]);
662
+ throw new LitsError("Wrong number of arguments to \"".concat(name_4, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), node[2]);
663
+ }
664
+ if (typeof max === 'number' && length > max) {
665
+ var name_5 = getNodeTypeName(node[0]);
666
+ throw new LitsError("Wrong number of arguments to \"".concat(name_5, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), node[2]);
667
+ }
668
+ }
669
+ }
670
+ function isNonUndefined(value) {
671
+ return value !== undefined;
672
+ }
673
+ function asNonUndefined(value, sourceCodeInfo) {
674
+ assertNonUndefined(value, sourceCodeInfo);
675
+ return value;
676
+ }
677
+ function assertNonUndefined(value, sourceCodeInfo) {
678
+ if (!isNonUndefined(value))
679
+ throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
680
+ }
681
+ function isUnknownRecord(value) {
682
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
683
+ }
684
+ function assertUnknownRecord(value, sourceCodeInfo) {
685
+ if (!isUnknownRecord(value)) {
686
+ throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
687
+ }
688
+ }
689
+ function canBeOperator(count) {
690
+ if (typeof count === 'number') {
691
+ return count === 2;
692
+ }
693
+ if (count.odd) {
694
+ return false;
695
+ }
696
+ if (typeof count.max === 'number' && count.max < 2) {
697
+ return false;
698
+ }
699
+ if (typeof count.min === 'number' && count.min > 2) {
700
+ return false;
701
+ }
702
+ return true;
611
703
  }
612
704
 
613
705
  function isLitsFunction(value) {
@@ -792,12 +884,6 @@ function clone(value) {
792
884
  function cloneColl(value) {
793
885
  return clone(value);
794
886
  }
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
887
  function joinSets() {
802
888
  var e_1, _a;
803
889
  var results = [];
@@ -3695,17 +3781,24 @@ Object.values(expressions$1).forEach(function (normalExpression) {
3695
3781
  });
3696
3782
  });
3697
3783
  var normalExpressions = __assign(__assign({}, expressions$1), aliases);
3784
+ var normalExpressionTypes = {};
3785
+ var allNormalExpressions = [];
3786
+ Object.entries(normalExpressions).forEach(function (_a, index) {
3787
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
3788
+ normalExpressionTypes[key] = index;
3789
+ allNormalExpressions.push(value);
3790
+ });
3698
3791
 
3699
3792
  var andSpecialExpression = {
3700
3793
  paramCount: {},
3701
3794
  evaluate: function (node, contextStack, _a) {
3702
3795
  var e_1, _b;
3703
- var evaluateAstNode = _a.evaluateAstNode;
3796
+ var evaluateNode = _a.evaluateNode;
3704
3797
  var value = true;
3705
3798
  try {
3706
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
3799
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3707
3800
  var param = _d.value;
3708
- value = evaluateAstNode(param, contextStack);
3801
+ value = evaluateNode(param, contextStack);
3709
3802
  if (!value)
3710
3803
  break;
3711
3804
  }
@@ -3720,8 +3813,8 @@ var andSpecialExpression = {
3720
3813
  return value;
3721
3814
  },
3722
3815
  getUndefinedSymbols: function (node, contextStack, _a) {
3723
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3724
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3816
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3817
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
3725
3818
  },
3726
3819
  };
3727
3820
 
@@ -3729,28 +3822,29 @@ var condSpecialExpression = {
3729
3822
  paramCount: { even: true },
3730
3823
  evaluate: function (node, contextStack, _a) {
3731
3824
  var e_1, _b;
3732
- var evaluateAstNode = _a.evaluateAstNode;
3825
+ var evaluateNode = _a.evaluateNode;
3826
+ var params = node[1][1];
3733
3827
  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);
3828
+ for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
3829
+ var _c = __read(params_1_1.value, 2), test = _c[0], form = _c[1];
3830
+ var value = evaluateNode(test, contextStack);
3737
3831
  if (!value)
3738
3832
  continue;
3739
- return evaluateAstNode(form, contextStack);
3833
+ return evaluateNode(form, contextStack);
3740
3834
  }
3741
3835
  }
3742
3836
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3743
3837
  finally {
3744
3838
  try {
3745
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3839
+ if (params_1_1 && !params_1_1.done && (_b = params_1.return)) _b.call(params_1);
3746
3840
  }
3747
3841
  finally { if (e_1) throw e_1.error; }
3748
3842
  }
3749
3843
  return null;
3750
3844
  },
3751
3845
  getUndefinedSymbols: function (node, contextStack, _a) {
3752
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3753
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3846
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3847
+ return getUndefinedSymbols(node[1][1].flat(), contextStack, builtin, evaluateNode);
3754
3848
  },
3755
3849
  };
3756
3850
 
@@ -3758,66 +3852,78 @@ var switchSpecialExpression = {
3758
3852
  paramCount: { odd: true },
3759
3853
  evaluate: function (node, contextStack, _a) {
3760
3854
  var e_1, _b;
3761
- var evaluateAstNode = _a.evaluateAstNode;
3762
- var switchValue = evaluateAstNode(node.params[0], contextStack);
3855
+ var evaluateNode = _a.evaluateNode;
3856
+ var _c = __read(node[1], 3), switchValueNode = _c[1], cases = _c[2];
3857
+ var switchValue = evaluateNode(switchValueNode, contextStack);
3763
3858
  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);
3859
+ for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
3860
+ var _d = __read(cases_1_1.value, 2), test = _d[0], form = _d[1];
3861
+ var value = evaluateNode(test, contextStack);
3767
3862
  if (value === switchValue) {
3768
- return evaluateAstNode(form, contextStack);
3863
+ return evaluateNode(form, contextStack);
3769
3864
  }
3770
3865
  }
3771
3866
  }
3772
3867
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
3773
3868
  finally {
3774
3869
  try {
3775
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
3870
+ if (cases_1_1 && !cases_1_1.done && (_b = cases_1.return)) _b.call(cases_1);
3776
3871
  }
3777
3872
  finally { if (e_1) throw e_1.error; }
3778
3873
  }
3779
3874
  return null;
3780
3875
  },
3781
3876
  getUndefinedSymbols: function (node, contextStack, _a) {
3782
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3783
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3877
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3878
+ return getUndefinedSymbols(__spreadArray([node[1][1]], __read(node[1][2].flat()), false), contextStack, builtin, evaluateNode);
3784
3879
  },
3785
3880
  };
3786
3881
 
3787
- var declaredSpecialExpression = {
3882
+ var definedSpecialExpression = {
3788
3883
  paramCount: 1,
3789
3884
  evaluate: function (node, contextStack) {
3790
- var lookUpResult = contextStack.lookUp(node.params[0]);
3885
+ var symbolNode = node[1][1];
3886
+ assertSymbolNode(symbolNode);
3887
+ if (!isUserDefinedSymbolNode(symbolNode)) {
3888
+ return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
3889
+ }
3890
+ var lookUpResult = contextStack.lookUp(symbolNode);
3791
3891
  return lookUpResult !== null;
3792
3892
  },
3793
3893
  getUndefinedSymbols: function (node, contextStack, _a) {
3794
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
3795
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
3894
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
3895
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
3796
3896
  },
3797
3897
  };
3798
3898
 
3799
- function evalueateBindingNodeValues(input, value, evaluate) {
3800
- var target = 'target' in input ? input.target : input;
3801
- var sourceCodeInfo = input.sourceCodeInfo;
3899
+ var bindingTargetTypes = {
3900
+ symbol: 11,
3901
+ rest: 12,
3902
+ object: 13,
3903
+ array: 14,
3904
+ };
3905
+
3906
+ function evalueateBindingNodeValues(target, value, evaluate) {
3907
+ var sourceCodeInfo = target[2];
3802
3908
  var record = {};
3803
3909
  createRecord(target, value, evaluate, sourceCodeInfo, record);
3804
3910
  return record;
3805
3911
  }
3806
3912
  function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3807
3913
  var _a, _b;
3808
- if (bindingTarget.type === 'object') {
3914
+ if (bindingTarget[0] === bindingTargetTypes.object) {
3809
3915
  assertUnknownRecord(value, sourceCodeInfo);
3810
3916
  var capturedKeys_1 = new Set();
3811
3917
  var restElement_1;
3812
- Object.entries(bindingTarget.elements).forEach(function (_a) {
3918
+ Object.entries(bindingTarget[1][0]).forEach(function (_a) {
3813
3919
  var _b;
3814
3920
  var _c = __read(_a, 2), key = _c[0], element = _c[1];
3815
- if (element.type === 'rest') {
3921
+ if (element[0] === bindingTargetTypes.rest) {
3816
3922
  restElement_1 = element;
3817
3923
  return;
3818
3924
  }
3819
3925
  capturedKeys_1.add(key);
3820
- var val = (_b = (value[key] !== undefined ? value[key] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3926
+ var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3821
3927
  assertAny(val, sourceCodeInfo);
3822
3928
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3823
3929
  });
@@ -3832,33 +3938,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
3832
3938
  acc[key] = asAny(val);
3833
3939
  return acc;
3834
3940
  }, {});
3835
- record[restElement_1.name] = restValues;
3941
+ record[restElement_1[1][0]] = restValues;
3836
3942
  }
3837
3943
  }
3838
- else if (bindingTarget.type === 'array') {
3944
+ else if (bindingTarget[0] === bindingTargetTypes.array) {
3839
3945
  var restIndex = null;
3840
3946
  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;
3947
+ for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
3948
+ var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
3843
3949
  if (element === null) {
3844
3950
  continue;
3845
3951
  }
3846
- if (element.type === 'rest') {
3952
+ if (element[0] === bindingTargetTypes.rest) {
3847
3953
  restIndex = index;
3848
3954
  break;
3849
3955
  }
3850
- var val = (_b = (value[index] !== undefined ? value[index] : element.default && evaluate(element.default))) !== null && _b !== void 0 ? _b : null;
3956
+ var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
3851
3957
  assertAny(val, sourceCodeInfo);
3852
3958
  createRecord(element, val, evaluate, sourceCodeInfo, record);
3853
3959
  }
3854
3960
  if (restIndex !== null) {
3855
3961
  var restValues = value.slice(restIndex);
3856
- var restElement = bindingTarget.elements[restIndex];
3857
- record[restElement.name] = restValues;
3962
+ var restElement = bindingTarget[1][0][restIndex];
3963
+ record[restElement[1][0]] = restValues;
3858
3964
  }
3859
3965
  }
3966
+ else if (bindingTarget[0] === bindingTargetTypes.rest) {
3967
+ record[bindingTarget[1][0]] = asAny(value);
3968
+ }
3860
3969
  else {
3861
- record[bindingTarget.name] = asAny(value);
3970
+ record[bindingTarget[1][0][1]] = asAny(value);
3862
3971
  }
3863
3972
  }
3864
3973
  function getAllBindingTargetNames(bindingTarget) {
@@ -3871,9 +3980,9 @@ function getNamesFromBindingTarget(target, names) {
3871
3980
  if (target === null) {
3872
3981
  return;
3873
3982
  }
3874
- if (target.type === 'array') {
3983
+ if (target[0] === bindingTargetTypes.array) {
3875
3984
  try {
3876
- for (var _c = __values(target.elements), _d = _c.next(); !_d.done; _d = _c.next()) {
3985
+ for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
3877
3986
  var element = _d.value;
3878
3987
  getNamesFromBindingTarget(element, names);
3879
3988
  }
@@ -3886,9 +3995,9 @@ function getNamesFromBindingTarget(target, names) {
3886
3995
  finally { if (e_1) throw e_1.error; }
3887
3996
  }
3888
3997
  }
3889
- else if (target.type === 'object') {
3998
+ else if (target[0] === bindingTargetTypes.object) {
3890
3999
  try {
3891
- for (var _e = __values(Object.values(target.elements)), _f = _e.next(); !_f.done; _f = _e.next()) {
4000
+ for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
3892
4001
  var element = _f.value;
3893
4002
  getNamesFromBindingTarget(element, names);
3894
4003
  }
@@ -3901,27 +4010,39 @@ function getNamesFromBindingTarget(target, names) {
3901
4010
  finally { if (e_2) throw e_2.error; }
3902
4011
  }
3903
4012
  }
4013
+ else if (target[0] === bindingTargetTypes.rest) {
4014
+ if (names[target[1][0]]) {
4015
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
4016
+ }
4017
+ names[target[1][0]] = true;
4018
+ }
3904
4019
  else {
3905
- if (names[target.name]) {
3906
- throw new LitsError("Duplicate binding name: ".concat(target.name), target.sourceCodeInfo);
4020
+ if (names[target[1][0][1]]) {
4021
+ throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
3907
4022
  }
3908
- names[target.name] = true;
4023
+ names[target[1][0][1]] = true;
3909
4024
  }
3910
4025
  }
3911
4026
 
3912
4027
  var defSpecialExpression = {
3913
4028
  paramCount: 2,
3914
4029
  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); });
4030
+ var evaluateNode = _a.evaluateNode;
4031
+ var bindingNode = node[1][1];
4032
+ var target = bindingNode[1][0];
4033
+ var value = bindingNode[1][1];
4034
+ var bindingValue = evaluateNode(value, contextStack);
4035
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
3918
4036
  contextStack.exportValues(values);
3919
4037
  return null;
3920
4038
  },
3921
4039
  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));
4040
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4041
+ var bindingNode = node[1][1];
4042
+ var target = bindingNode[1][0];
4043
+ var value = bindingNode[1][1];
4044
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
4045
+ contextStack.addValues(getAllBindingTargetNames(target));
3925
4046
  return bindingResult;
3926
4047
  },
3927
4048
  };
@@ -3930,14 +4051,14 @@ var doSpecialExpression = {
3930
4051
  paramCount: {},
3931
4052
  evaluate: function (node, contextStack, _a) {
3932
4053
  var e_1, _b;
3933
- var evaluateAstNode = _a.evaluateAstNode;
4054
+ var evaluateNode = _a.evaluateNode;
3934
4055
  var newContext = {};
3935
4056
  var newContextStack = contextStack.create(newContext);
3936
4057
  var result = null;
3937
4058
  try {
3938
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4059
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
3939
4060
  var form = _d.value;
3940
- result = evaluateAstNode(form, newContextStack);
4061
+ result = evaluateNode(form, newContextStack);
3941
4062
  }
3942
4063
  }
3943
4064
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -3950,8 +4071,8 @@ var doSpecialExpression = {
3950
4071
  return result;
3951
4072
  },
3952
4073
  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);
4074
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4075
+ return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
3955
4076
  },
3956
4077
  };
3957
4078
 
@@ -4012,7 +4133,8 @@ function isNumberReservedSymbol(symbol) {
4012
4133
  function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
4013
4134
  if (typeof name !== 'string')
4014
4135
  return;
4015
- if (builtin.specialExpressions[name])
4136
+ // TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
4137
+ if (specialExpressionTypes[name])
4016
4138
  throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
4017
4139
  if (builtin.normalExpressions[name])
4018
4140
  throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
@@ -4026,63 +4148,69 @@ var functionSpecialExpression = {
4026
4148
  paramCount: {},
4027
4149
  evaluate: function (node, contextStack, _a) {
4028
4150
  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);
4151
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4152
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4153
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4154
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4155
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4033
4156
  var litsFunction = (_b = {},
4034
4157
  _b[FUNCTION_SYMBOL] = true,
4035
- _b.sourceCodeInfo = node.sourceCodeInfo,
4158
+ _b.sourceCodeInfo = node[2],
4036
4159
  _b.functionType = 'UserDefined',
4037
- _b.name = name,
4160
+ _b.name = functionSymbol[1],
4038
4161
  _b.evaluatedfunction = evaluatedFunction,
4039
4162
  _b);
4040
- contextStack.addValues((_c = {}, _c[name] = litsFunction, _c));
4163
+ contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
4041
4164
  return null;
4042
4165
  },
4043
4166
  getUndefinedSymbols: function (node, contextStack, _a) {
4044
4167
  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);
4168
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4169
+ var functionName = node[1][1][1];
4170
+ contextStack.addValues((_b = {}, _b[functionName] = true, _b));
4171
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4172
+ return addFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
4049
4173
  },
4050
4174
  };
4051
4175
  var defnSpecialExpression = {
4052
4176
  paramCount: {},
4053
4177
  evaluate: function (node, contextStack, _a) {
4054
4178
  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);
4179
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4180
+ var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
4181
+ assertUserDefinedSymbolNode(functionSymbol, node[2]);
4182
+ assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
4183
+ var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4059
4184
  var litsFunction = (_b = {},
4060
4185
  _b[FUNCTION_SYMBOL] = true,
4061
- _b.sourceCodeInfo = node.sourceCodeInfo,
4186
+ _b.sourceCodeInfo = node[2],
4062
4187
  _b.functionType = 'UserDefined',
4063
- _b.name = name,
4188
+ _b.name = functionSymbol[1],
4064
4189
  _b.evaluatedfunction = evaluatedFunctionOverloades,
4065
4190
  _b);
4066
- contextStack.exportValues((_c = {}, _c[name] = litsFunction, _c));
4191
+ contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
4067
4192
  return null;
4068
4193
  },
4069
4194
  getUndefinedSymbols: function (node, contextStack, _a) {
4070
4195
  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);
4196
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4197
+ var functionName = node[1][1][1];
4198
+ var fn = node[1][2];
4199
+ contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
4200
+ var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
4201
+ return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
4075
4202
  },
4076
4203
  };
4077
4204
  var fnSpecialExpression = {
4078
4205
  paramCount: {},
4079
4206
  evaluate: function (node, contextStack, _a) {
4080
4207
  var _b;
4081
- var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateAstNode = _a.evaluateAstNode;
4082
- var evaluatedFunction = evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode);
4208
+ var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
4209
+ var fn = node[1][1];
4210
+ var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
4083
4211
  var litsFunction = (_b = {},
4084
4212
  _b[FUNCTION_SYMBOL] = true,
4085
- _b.sourceCodeInfo = node.sourceCodeInfo,
4213
+ _b.sourceCodeInfo = node[2],
4086
4214
  _b.functionType = 'UserDefined',
4087
4215
  _b.name = undefined,
4088
4216
  _b.evaluatedfunction = evaluatedFunction,
@@ -4090,129 +4218,103 @@ var fnSpecialExpression = {
4090
4218
  return litsFunction;
4091
4219
  },
4092
4220
  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);
4221
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4222
+ var fn = node[1][1];
4223
+ return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4095
4224
  },
4096
4225
  };
4097
- function evaluateFunction(node, contextStack, builtin, getUndefinedSymbols, evaluateAstNode) {
4098
- var fn = node.function;
4226
+ function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
4099
4227
  var functionContext = {};
4100
- var context = fn.arguments.reduce(function (ctx, arg) {
4228
+ var context = fn[0].reduce(function (ctx, arg) {
4101
4229
  Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
4102
4230
  ctx[name] = { value: null };
4103
4231
  });
4104
4232
  return ctx;
4105
4233
  }, {});
4106
- var undefinedSymbols = getUndefinedSymbols(fn.body, contextStack.new(context), builtin, evaluateAstNode);
4234
+ var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
4107
4235
  undefinedSymbols.forEach(function (name) {
4108
4236
  var value = contextStack.getValue(name);
4109
4237
  if (isAny(value)) {
4110
4238
  functionContext[name] = { value: value };
4111
4239
  }
4112
4240
  });
4113
- var evaluatedFunction = {
4114
- arguments: fn.arguments,
4115
- body: fn.body,
4116
- context: functionContext,
4117
- };
4241
+ var evaluatedFunction = [
4242
+ fn[0],
4243
+ fn[1],
4244
+ functionContext,
4245
+ ];
4118
4246
  return evaluatedFunction;
4119
4247
  }
4120
- function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateAstNode, functionNameContext) {
4248
+ function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
4121
4249
  var result = new Set();
4122
4250
  var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
4123
4251
  var newContext = {};
4124
- fn.arguments.forEach(function (arg) {
4252
+ fn[0].forEach(function (arg) {
4125
4253
  Object.assign(newContext, getAllBindingTargetNames(arg));
4126
4254
  });
4127
4255
  var newContextStack = contextStackWithFunctionName.create(newContext);
4128
- var overloadResult = getUndefinedSymbols(fn.body, newContextStack, builtin, evaluateAstNode);
4256
+ var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
4129
4257
  addToSet(result, overloadResult);
4130
4258
  return result;
4131
4259
  }
4132
4260
 
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
4261
  var ifSpecialExpression = {
4160
4262
  paramCount: { min: 2, max: 3 },
4161
4263
  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);
4264
+ var evaluateNode = _a.evaluateNode;
4265
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4266
+ if (evaluateNode(conditionNode, contextStack)) {
4267
+ return evaluateNode(trueNode, contextStack);
4167
4268
  }
4168
- else {
4169
- if (node.params.length === 3)
4170
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4171
- else
4172
- return null;
4269
+ else if (falseNode) {
4270
+ return evaluateNode(falseNode, contextStack);
4173
4271
  }
4272
+ return null;
4174
4273
  },
4175
4274
  getUndefinedSymbols: function (node, contextStack, _a) {
4176
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4177
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4275
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4276
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4178
4277
  },
4179
4278
  };
4180
4279
 
4181
4280
  var unlessSpecialExpression = {
4182
4281
  paramCount: { min: 2, max: 3 },
4183
4282
  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);
4283
+ var evaluateNode = _a.evaluateNode;
4284
+ var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
4285
+ if (!evaluateNode(conditionNode, contextStack)) {
4286
+ return evaluateNode(trueNode, contextStack);
4189
4287
  }
4190
- else {
4191
- if (node.params.length === 3)
4192
- return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
4193
- else
4194
- return null;
4288
+ else if (falseNode) {
4289
+ return evaluateNode(falseNode, contextStack);
4195
4290
  }
4291
+ return null;
4196
4292
  },
4197
4293
  getUndefinedSymbols: function (node, contextStack, _a) {
4198
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4199
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4294
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4295
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4200
4296
  },
4201
4297
  };
4202
4298
 
4203
4299
  var letSpecialExpression = {
4204
4300
  paramCount: 0,
4205
4301
  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); });
4302
+ var evaluateNode = _a.evaluateNode;
4303
+ var bindingNode = node[1][1];
4304
+ var target = bindingNode[1][0];
4305
+ var value = bindingNode[1][1];
4306
+ var bindingValue = evaluateNode(value, contextStack);
4307
+ var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
4209
4308
  contextStack.addValues(values);
4210
4309
  return null;
4211
4310
  },
4212
4311
  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));
4312
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4313
+ var bindingNode = node[1][1];
4314
+ var target = bindingNode[1][0];
4315
+ var value = bindingNode[1][1];
4316
+ var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
4317
+ contextStack.addValues(getAllBindingTargetNames(target));
4216
4318
  return bindingResult;
4217
4319
  },
4218
4320
  };
@@ -4220,11 +4322,11 @@ var letSpecialExpression = {
4220
4322
  var loopSpecialExpression = {
4221
4323
  paramCount: {},
4222
4324
  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); });
4325
+ var evaluateNode = _a.evaluateNode;
4326
+ var bindingNodes = node[1][1];
4327
+ var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
4328
+ var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
4329
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
4228
4330
  Object.entries(valueRecord).forEach(function (_a) {
4229
4331
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4230
4332
  result[name] = { value: value };
@@ -4232,20 +4334,21 @@ var loopSpecialExpression = {
4232
4334
  return result;
4233
4335
  }, {});
4234
4336
  var newContextStack = contextStack.create(bindingContext);
4337
+ var body = node[1][2];
4235
4338
  var _loop_1 = function () {
4236
4339
  var e_1, _b;
4237
4340
  var result = null;
4238
4341
  try {
4239
4342
  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);
4343
+ 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()) {
4344
+ var form = body_1_1.value;
4345
+ result = evaluateNode(form, newContextStack);
4243
4346
  }
4244
4347
  }
4245
4348
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
4246
4349
  finally {
4247
4350
  try {
4248
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
4351
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4249
4352
  }
4250
4353
  finally { if (e_1) throw e_1.error; }
4251
4354
  }
@@ -4253,16 +4356,16 @@ var loopSpecialExpression = {
4253
4356
  catch (error) {
4254
4357
  if (error instanceof RecurSignal) {
4255
4358
  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);
4359
+ if (params_1.length !== bindingNodes.length) {
4360
+ throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
4258
4361
  }
4259
- node.bindingNodes.forEach(function (binding, index) {
4362
+ bindingNodes.forEach(function (bindingNode, index) {
4260
4363
  var e_2, _a;
4261
- var valueRecord = evalueateBindingNodeValues(binding, asAny(params_1[index], sourceCodeInfo), function (astNode) { return evaluateAstNode(astNode, contextStack); });
4364
+ var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
4262
4365
  try {
4263
4366
  for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
4264
4367
  var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
4265
- asNonUndefined(bindingContext[name_1], sourceCodeInfo).value = value;
4368
+ bindingContext[name_1].value = value;
4266
4369
  }
4267
4370
  }
4268
4371
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
@@ -4286,29 +4389,31 @@ var loopSpecialExpression = {
4286
4389
  }
4287
4390
  },
4288
4391
  getUndefinedSymbols: function (node, contextStack, _a) {
4289
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4290
- var newContext = node.bindingNodes
4392
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4393
+ var bindingNodes = node[1][1];
4394
+ var newContext = bindingNodes
4291
4395
  .reduce(function (context, bindingNode) {
4292
- var names = getAllBindingTargetNames(bindingNode.target);
4396
+ var names = getAllBindingTargetNames(bindingNode[1][0]);
4293
4397
  Object.keys(names).forEach(function (name) {
4294
4398
  context[name] = { value: true };
4295
4399
  });
4296
4400
  return context;
4297
4401
  }, {});
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);
4402
+ var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
4403
+ var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
4404
+ var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
4301
4405
  return joinSets(bindingsResult, paramsResult);
4302
4406
  },
4303
4407
  };
4304
4408
 
4305
- function addToContext(bindings, context, contextStack, evaluateAstNode) {
4409
+ function addToContext(bindings, context, contextStack, evaluateNode) {
4306
4410
  var e_1, _a;
4307
4411
  try {
4308
4412
  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); });
4413
+ var bindingNode = bindings_1_1.value;
4414
+ var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
4415
+ var val = evaluateNode(bindingValue, contextStack);
4416
+ var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
4312
4417
  Object.entries(valueRecord).forEach(function (_a) {
4313
4418
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4314
4419
  context[name] = { value: value };
@@ -4323,9 +4428,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
4323
4428
  finally { if (e_1) throw e_1.error; }
4324
4429
  }
4325
4430
  }
4326
- function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4327
- var sourceCodeInfo = node.sourceCodeInfo;
4328
- var _a = node, loopBindings = _a.l, params = _a.params;
4431
+ function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
4432
+ var sourceCodeInfo = loopNode[2];
4433
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4329
4434
  var result = [];
4330
4435
  var bindingIndices = loopBindings.map(function () { return 0; });
4331
4436
  var abort = false;
@@ -4335,8 +4440,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4335
4440
  var newContextStack = contextStack.create(context);
4336
4441
  var skip = false;
4337
4442
  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);
4443
+ var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
4444
+ var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
4445
+ var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
4340
4446
  var seq = isSeq(coll) ? coll : Object.entries(coll);
4341
4447
  if (seq.length === 0) {
4342
4448
  skip = true;
@@ -4355,45 +4461,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4355
4461
  break;
4356
4462
  }
4357
4463
  var val = asAny(seq[index], sourceCodeInfo);
4358
- var valueRecord = evalueateBindingNodeValues(binding, val, function (astNode) { return evaluateAstNode(astNode, newContextStack); });
4464
+ var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
4359
4465
  Object.entries(valueRecord).forEach(function (_a) {
4360
4466
  var _b = __read(_a, 2), name = _b[0], value = _b[1];
4361
4467
  context[name] = { value: value };
4362
4468
  });
4469
+ if (letBindings) {
4470
+ addToContext(letBindings, context, newContextStack, evaluateNode);
4471
+ }
4472
+ if (whenNode && !evaluateNode(whenNode, newContextStack)) {
4473
+ bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
4474
+ skip = true;
4475
+ break bindingsLoop;
4476
+ }
4477
+ if (whileNode && !evaluateNode(whileNode, newContextStack)) {
4478
+ bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
4479
+ skip = true;
4480
+ break bindingsLoop;
4481
+ }
4482
+ }
4483
+ if (!skip) {
4484
+ var value = null;
4363
4485
  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
- }
4486
+ 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()) {
4487
+ var form = body_1_1.value;
4488
+ value = evaluateNode(form, newContextStack);
4385
4489
  }
4386
4490
  }
4387
4491
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
4388
4492
  finally {
4389
4493
  try {
4390
- if (modifiers_1_1 && !modifiers_1_1.done && (_b = modifiers_1.return)) _b.call(modifiers_1);
4494
+ if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
4391
4495
  }
4392
4496
  finally { if (e_2) throw e_2.error; }
4393
4497
  }
4394
- }
4395
- if (!skip) {
4396
- var value = evaluateAstNode(params[0], newContextStack);
4397
4498
  if (returnResult)
4398
4499
  result.push(value);
4399
4500
  if (bindingIndices.length > 0)
@@ -4405,57 +4506,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
4405
4506
  }
4406
4507
  return returnResult ? result : null;
4407
4508
  }
4408
- function analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode) {
4509
+ function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
4409
4510
  var result = new Set();
4410
4511
  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) {
4512
+ var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
4513
+ loopBindings.forEach(function (loopBindingNode) {
4514
+ var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
4515
+ var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
4516
+ getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4415
4517
  return result.add(symbol);
4416
4518
  });
4417
- Object.assign(newContext, getAllBindingTargetNames(binding.target));
4519
+ Object.assign(newContext, getAllBindingTargetNames(target));
4418
4520
  if (letBindings) {
4419
- letBindings.forEach(function (letBinding) {
4420
- getUndefinedSymbols([letBinding.value], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4521
+ letBindings.forEach(function (letBindingNode) {
4522
+ var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
4523
+ getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4421
4524
  return result.add(symbol);
4422
4525
  });
4423
- Object.assign(newContext, getAllBindingTargetNames(letBinding.target));
4526
+ Object.assign(newContext, getAllBindingTargetNames(letTarget));
4424
4527
  });
4425
4528
  }
4426
4529
  if (whenNode) {
4427
- getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4530
+ getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4428
4531
  return result.add(symbol);
4429
4532
  });
4430
4533
  }
4431
4534
  if (whileNode) {
4432
- getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4535
+ getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4433
4536
  return result.add(symbol);
4434
4537
  });
4435
4538
  }
4436
4539
  });
4437
- getUndefinedSymbols(node.params, contextStack.create(newContext), builtin, evaluateAstNode).forEach(function (symbol) {
4540
+ getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
4438
4541
  return result.add(symbol);
4439
4542
  });
4440
4543
  return result;
4441
4544
  }
4442
4545
  var forSpecialExpression = {
4443
4546
  paramCount: 1,
4444
- evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateAstNode); },
4547
+ evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
4445
4548
  getUndefinedSymbols: function (node, contextStack, _a) {
4446
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4447
- return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateAstNode);
4549
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4550
+ return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
4448
4551
  },
4449
4552
  };
4450
4553
  var doseqSpecialExpression = {
4451
4554
  paramCount: 1,
4452
4555
  evaluate: function (node, contextStack, helpers) {
4453
- evaluateLoop(false, node, contextStack, helpers.evaluateAstNode);
4556
+ evaluateLoop(false, node, contextStack, helpers.evaluateNode);
4454
4557
  return null;
4455
4558
  },
4456
4559
  getUndefinedSymbols: function (node, contextStack, _a) {
4457
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4458
- 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);
4459
4562
  },
4460
4563
  };
4461
4564
 
@@ -4463,12 +4566,12 @@ var orSpecialExpression = {
4463
4566
  paramCount: {},
4464
4567
  evaluate: function (node, contextStack, _a) {
4465
4568
  var e_1, _b;
4466
- var evaluateAstNode = _a.evaluateAstNode;
4569
+ var evaluateNode = _a.evaluateNode;
4467
4570
  var value = false;
4468
4571
  try {
4469
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4572
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4470
4573
  var param = _d.value;
4471
- value = evaluateAstNode(param, contextStack);
4574
+ value = evaluateNode(param, contextStack);
4472
4575
  if (value)
4473
4576
  break;
4474
4577
  }
@@ -4483,55 +4586,55 @@ var orSpecialExpression = {
4483
4586
  return value;
4484
4587
  },
4485
4588
  getUndefinedSymbols: function (node, contextStack, _a) {
4486
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4487
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4589
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4590
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4488
4591
  },
4489
4592
  };
4490
4593
 
4491
4594
  var qqSpecialExpression = {
4492
4595
  paramCount: { min: 1, max: 2 },
4493
4596
  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;
4597
+ var evaluateNode = _a.evaluateNode;
4598
+ var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
4599
+ if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
4600
+ return secondNode ? evaluateNode(secondNode, contextStack) : null;
4499
4601
  }
4500
- assertAny(firstNode, node.sourceCodeInfo);
4501
- var firstResult = evaluateAstNode(firstNode, contextStack);
4502
- return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateAstNode(secondNode, contextStack) : null);
4602
+ assertAny(firstNode, node[2]);
4603
+ var firstResult = evaluateNode(firstNode, contextStack);
4604
+ return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
4503
4605
  },
4504
4606
  getUndefinedSymbols: function (node, contextStack, _a) {
4505
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4506
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4607
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4608
+ return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
4507
4609
  },
4508
4610
  };
4509
4611
 
4510
4612
  var recurSpecialExpression = {
4511
4613
  paramCount: {},
4512
4614
  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);
4615
+ var evaluateNode = _a.evaluateNode;
4616
+ var params = node[1][1];
4617
+ var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4618
+ throw new RecurSignal(evaluatedParams);
4516
4619
  },
4517
4620
  getUndefinedSymbols: function (node, contextStack, _a) {
4518
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4519
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4621
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4622
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4520
4623
  },
4521
4624
  };
4522
4625
 
4523
4626
  var throwSpecialExpression = {
4524
4627
  paramCount: 1,
4525
4628
  evaluate: function (node, contextStack, _a) {
4526
- var evaluateAstNode = _a.evaluateAstNode;
4527
- var message = asString(evaluateAstNode(node.params[0], contextStack), node.sourceCodeInfo, {
4629
+ var evaluateNode = _a.evaluateNode;
4630
+ var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
4528
4631
  nonEmpty: true,
4529
4632
  });
4530
- throw new UserDefinedError(message, node.sourceCodeInfo);
4633
+ throw new UserDefinedError(message, node[2]);
4531
4634
  },
4532
4635
  getUndefinedSymbols: function (node, contextStack, _a) {
4533
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4534
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4636
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4637
+ return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
4535
4638
  },
4536
4639
  };
4537
4640
 
@@ -4539,29 +4642,29 @@ var trySpecialExpression = {
4539
4642
  paramCount: 1,
4540
4643
  evaluate: function (node, contextStack, _a) {
4541
4644
  var _b;
4542
- var evaluateAstNode = _a.evaluateAstNode;
4543
- var tryExpressions = node.params, catchExpression = node.ce, errorNode = node.e;
4645
+ var evaluateNode = _a.evaluateNode;
4646
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4544
4647
  try {
4545
- return evaluateAstNode(tryExpressions[0], contextStack);
4648
+ return evaluateNode(tryExpression, contextStack);
4546
4649
  }
4547
4650
  catch (error) {
4548
- var newContext = errorNode
4651
+ var newContext = errorSymbol
4549
4652
  ? (_b = {},
4550
- _b[errorNode.value] = { value: asAny(error, node.sourceCodeInfo) },
4653
+ _b[errorSymbol[1]] = { value: error },
4551
4654
  _b) : {};
4552
- return evaluateAstNode(catchExpression, contextStack.create(newContext));
4655
+ return evaluateNode(catchExpression, contextStack.create(newContext));
4553
4656
  }
4554
4657
  },
4555
4658
  getUndefinedSymbols: function (node, contextStack, _a) {
4556
4659
  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
4660
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4661
+ var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
4662
+ var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
4663
+ var newContext = errorSymbol
4561
4664
  ? (_b = {},
4562
- _b[errorNode.value] = { value: true },
4665
+ _b[errorSymbol[1]] = { value: true },
4563
4666
  _b) : {};
4564
- var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateAstNode);
4667
+ var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
4565
4668
  return joinSets(tryResult, catchResult);
4566
4669
  },
4567
4670
  };
@@ -4570,20 +4673,20 @@ var arraySpecialExpression = {
4570
4673
  paramCount: {},
4571
4674
  evaluate: function (node, contextStack, _a) {
4572
4675
  var e_1, _b;
4573
- var evaluateAstNode = _a.evaluateAstNode;
4676
+ var evaluateNode = _a.evaluateNode;
4574
4677
  var result = [];
4575
4678
  try {
4576
- for (var _c = __values(node.params), _d = _c.next(); !_d.done; _d = _c.next()) {
4679
+ for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
4577
4680
  var param = _d.value;
4578
- if (param.type === 'Spread') {
4579
- var spreadValue = evaluateAstNode(param.value, contextStack);
4681
+ if (isSpreadNode(param)) {
4682
+ var spreadValue = evaluateNode(param[1], contextStack);
4580
4683
  if (!Array.isArray(spreadValue)) {
4581
- throw new LitsError('Spread value is not an array', param.sourceCodeInfo);
4684
+ throw new LitsError('Spread value is not an array', param[2]);
4582
4685
  }
4583
4686
  result.push.apply(result, __spreadArray([], __read(spreadValue), false));
4584
4687
  }
4585
4688
  else {
4586
- result.push(evaluateAstNode(param, contextStack));
4689
+ result.push(evaluateNode(param, contextStack));
4587
4690
  }
4588
4691
  }
4589
4692
  }
@@ -4597,76 +4700,79 @@ var arraySpecialExpression = {
4597
4700
  return result;
4598
4701
  },
4599
4702
  getUndefinedSymbols: function (node, contextStack, _a) {
4600
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4601
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4703
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4704
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4602
4705
  },
4603
4706
  };
4604
4707
 
4605
4708
  var objectSpecialExpression = {
4606
4709
  paramCount: {},
4607
4710
  evaluate: function (node, contextStack, _a) {
4608
- var evaluateAstNode = _a.evaluateAstNode;
4711
+ var evaluateNode = _a.evaluateNode;
4609
4712
  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);
4713
+ var params = node[1][1];
4714
+ for (var i = 0; i < params.length; i += 2) {
4715
+ var keyNode = params[i];
4716
+ if (isSpreadNode(keyNode)) {
4717
+ var spreadObject = evaluateNode(keyNode[1], contextStack);
4614
4718
  if (!isUnknownRecord(spreadObject)) {
4615
- throw new LitsError('Spread value is not an object', keyNode.sourceCodeInfo);
4719
+ throw new LitsError('Spread value is not an object', keyNode[2]);
4616
4720
  }
4617
4721
  Object.assign(result, spreadObject);
4618
4722
  i -= 1;
4619
4723
  }
4620
4724
  else {
4621
- var key = evaluateAstNode(keyNode, contextStack);
4622
- var value = evaluateAstNode(node.params[i + 1], contextStack);
4623
- assertString(key, keyNode.sourceCodeInfo);
4725
+ var key = evaluateNode(keyNode, contextStack);
4726
+ var value = evaluateNode(params[i + 1], contextStack);
4727
+ assertString(key, keyNode[2]);
4624
4728
  result[key] = value;
4625
4729
  }
4626
4730
  }
4627
4731
  return result;
4628
4732
  },
4629
4733
  getUndefinedSymbols: function (node, contextStack, _a) {
4630
- var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateAstNode = _a.evaluateAstNode;
4631
- return getUndefinedSymbols(node.params, contextStack, builtin, evaluateAstNode);
4734
+ var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
4735
+ return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
4632
4736
  },
4633
4737
  };
4634
4738
 
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
- };
4739
+ var specialExpressions = [
4740
+ qqSpecialExpression,
4741
+ andSpecialExpression,
4742
+ orSpecialExpression,
4743
+ arraySpecialExpression,
4744
+ condSpecialExpression,
4745
+ defSpecialExpression,
4746
+ definedSpecialExpression,
4747
+ defnSpecialExpression,
4748
+ doSpecialExpression,
4749
+ doseqSpecialExpression,
4750
+ fnSpecialExpression,
4751
+ forSpecialExpression,
4752
+ functionSpecialExpression,
4753
+ ifSpecialExpression,
4754
+ letSpecialExpression,
4755
+ loopSpecialExpression,
4756
+ objectSpecialExpression,
4757
+ recurSpecialExpression,
4758
+ switchSpecialExpression,
4759
+ throwSpecialExpression,
4760
+ trySpecialExpression,
4761
+ unlessSpecialExpression,
4762
+ ];
4659
4763
  var builtin = {
4660
4764
  normalExpressions: normalExpressions,
4661
4765
  specialExpressions: specialExpressions,
4766
+ allNormalExpressions: allNormalExpressions,
4662
4767
  };
4663
4768
  var normalExpressionKeys = Object.keys(normalExpressions);
4664
- var specialExpressionKeys = Object.keys(specialExpressions);
4769
+ var specialExpressionKeys = Object.keys(specialExpressionTypes);
4770
+ new Set(specialExpressionKeys);
4665
4771
 
4666
4772
  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;
4773
+ var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4774
+ var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
4775
+ var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
4670
4776
  if (nbrOfParams < minArity || nbrOfParams > maxArity) {
4671
4777
  throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
4672
4778
  }
@@ -4690,21 +4796,21 @@ var functionExecutors = {
4690
4796
  }
4691
4797
  },
4692
4798
  UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
4693
- var evaluateAstNode = _a.evaluateAstNode;
4799
+ var evaluateNode = _a.evaluateNode;
4694
4800
  var _loop_1 = function () {
4695
4801
  var e_1, _b;
4696
4802
  checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
4697
4803
  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);
4804
+ var args = evaluatedFunction[0];
4805
+ var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
4806
+ var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
4701
4807
  var newContext = {};
4702
4808
  var rest = [];
4703
4809
  for (var i = 0; i < params.length; i += 1) {
4704
4810
  if (i < nbrOfNonRestArgs) {
4705
4811
  var param = toAny(params[i]);
4706
- var valueRecord = evalueateBindingNodeValues(args[i], param, function (astNode) {
4707
- return evaluateAstNode(astNode, newContextStack.create(newContext));
4812
+ var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
4813
+ return evaluateNode(Node, newContextStack.create(newContext));
4708
4814
  });
4709
4815
  Object.entries(valueRecord).forEach(function (_a) {
4710
4816
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
@@ -4717,18 +4823,18 @@ var functionExecutors = {
4717
4823
  }
4718
4824
  for (var i = params.length; i < nbrOfNonRestArgs; i++) {
4719
4825
  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));
4826
+ var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
4827
+ var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
4828
+ return evaluateNode(Node, contextStack.create(newContext));
4723
4829
  });
4724
4830
  Object.entries(valueRecord).forEach(function (_a) {
4725
4831
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4726
4832
  newContext[key] = { value: value };
4727
4833
  });
4728
4834
  }
4729
- var restArgument = args.find(function (arg) { return arg.type === 'rest'; });
4835
+ var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
4730
4836
  if (restArgument !== undefined) {
4731
- var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (astNode) { return evaluateAstNode(astNode, contextStack.create(newContext)); });
4837
+ var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
4732
4838
  Object.entries(valueRecord).forEach(function (_a) {
4733
4839
  var _b = __read(_a, 2), key = _b[0], value = _b[1];
4734
4840
  newContext[key] = { value: value };
@@ -4738,9 +4844,9 @@ var functionExecutors = {
4738
4844
  var result = null;
4739
4845
  var newContextStack2 = newContextStack.create(newContext);
4740
4846
  try {
4741
- for (var _c = (e_1 = void 0, __values(evaluatedFunction.body)), _d = _c.next(); !_d.done; _d = _c.next()) {
4847
+ for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
4742
4848
  var node = _d.value;
4743
- result = evaluateAstNode(node, newContextStack2);
4849
+ result = evaluateNode(node, newContextStack2);
4744
4850
  }
4745
4851
  }
4746
4852
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4864,7 +4970,7 @@ var functionExecutors = {
4864
4970
  },
4865
4971
  Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
4866
4972
  var executeFunction = _a.executeFunction;
4867
- var normalExpression = asNonUndefined(normalExpressions[fn.n], sourceCodeInfo);
4973
+ var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
4868
4974
  return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
4869
4975
  },
4870
4976
  };
@@ -4875,7 +4981,7 @@ function evaluate(ast, contextStack) {
4875
4981
  try {
4876
4982
  for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
4877
4983
  var node = _c.value;
4878
- result = evaluateAstNode(node, contextStack);
4984
+ result = evaluateNode(node, contextStack);
4879
4985
  }
4880
4986
  }
4881
4987
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -4887,53 +4993,66 @@ function evaluate(ast, contextStack) {
4887
4993
  }
4888
4994
  return result;
4889
4995
  }
4890
- function evaluateAstNode(node, contextStack) {
4891
- switch (node.type) {
4892
- case 'Number':
4996
+ function evaluateNode(node, contextStack) {
4997
+ switch (node[0]) {
4998
+ case NodeTypes.Number:
4893
4999
  return evaluateNumber(node);
4894
- case 'String':
5000
+ case NodeTypes.String:
4895
5001
  return evaluateString(node);
4896
- case 'Symbol':
4897
- return contextStack.evaluateName(node);
4898
- case 'ReservedSymbol':
4899
- return evaluateReservedName(node);
4900
- case 'NormalExpression':
5002
+ case NodeTypes.NormalBuiltinSymbol:
5003
+ case NodeTypes.SpecialBuiltinSymbol:
5004
+ case NodeTypes.UserDefinedSymbol:
5005
+ return contextStack.evaluateSymbol(node);
5006
+ case NodeTypes.ReservedSymbol:
5007
+ return evaluateReservedSymbol(node);
5008
+ case NodeTypes.NormalExpression:
4901
5009
  return evaluateNormalExpression(node, contextStack);
4902
- case 'SpecialExpression':
5010
+ case NodeTypes.SpecialExpression:
4903
5011
  return evaluateSpecialExpression(node, contextStack);
4904
5012
  /* v8 ignore next 2 */
4905
5013
  default:
4906
- throw new LitsError("".concat(node.type, "-node cannot be evaluated"), node.sourceCodeInfo);
5014
+ throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
4907
5015
  }
4908
5016
  }
4909
5017
  function evaluateNumber(node) {
4910
- return node.value;
5018
+ return node[1];
4911
5019
  }
4912
5020
  function evaluateString(node) {
4913
- return node.value;
5021
+ return node[1];
4914
5022
  }
4915
- function evaluateReservedName(node) {
4916
- var reservedName = node.value;
5023
+ function evaluateReservedSymbol(node) {
5024
+ var reservedName = node[1];
4917
5025
  var value = reservedSymbolRecord[reservedName];
4918
- return asNonUndefined(value, node.sourceCodeInfo);
5026
+ return asNonUndefined(value, node[2]);
4919
5027
  }
4920
5028
  function evaluateNormalExpression(node, contextStack) {
4921
- var params = node.params.map(function (paramNode) { return evaluateAstNode(paramNode, contextStack); });
4922
- var sourceCodeInfo = node.sourceCodeInfo;
5029
+ var sourceCodeInfo = node[2];
5030
+ var paramNodes = node[1][1];
5031
+ var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
4923
5032
  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);
5033
+ var nameSymbol = node[1][0];
5034
+ if (isNormalBuiltinSymbolNode(nameSymbol)) {
5035
+ var type = nameSymbol[1];
5036
+ var normalExpression = builtin.allNormalExpressions[type];
5037
+ return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
5038
+ }
5039
+ else {
5040
+ var fn = contextStack.getValue(nameSymbol[1]);
5041
+ if (fn !== undefined) {
5042
+ return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
5043
+ }
5044
+ throw new UndefinedSymbolError(nameSymbol[1], node[2]);
5045
+ }
4928
5046
  }
4929
5047
  else {
4930
- var fn = params[0];
4931
- return executeFunction(fn, params.slice(1), contextStack, sourceCodeInfo);
5048
+ var fnNode = node[1][0];
5049
+ var fn = evaluateNode(fnNode, contextStack);
5050
+ return executeFunction(fn, params, contextStack, sourceCodeInfo);
4932
5051
  }
4933
5052
  }
4934
5053
  function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4935
5054
  if (isLitsFunction(fn))
4936
- return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateAstNode: evaluateAstNode, executeFunction: executeFunction });
5055
+ return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
4937
5056
  if (Array.isArray(fn))
4938
5057
  return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
4939
5058
  if (isObj(fn))
@@ -4944,16 +5063,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
4944
5063
  return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
4945
5064
  throw new NotAFunctionError(fn, sourceCodeInfo);
4946
5065
  }
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
5066
  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 });
5067
+ var specialExpressionType = node[1][0];
5068
+ var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
5069
+ var castedEvaluate = specialExpression.evaluate;
5070
+ return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
4957
5071
  }
4958
5072
  function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
4959
5073
  if (params.length !== 1)
@@ -5095,13 +5209,13 @@ var ContextStackImpl = /** @class */ (function () {
5095
5209
  return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
5096
5210
  };
5097
5211
  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;
5212
+ var e_4, _a;
5213
+ var _b, _c, _d;
5214
+ var value = node[1];
5102
5215
  try {
5103
- for (var _f = __values(this.contexts), _g = _f.next(); !_g.done; _g = _f.next()) {
5104
- var context = _g.value;
5216
+ // const sourceCodeInfo = node[2]
5217
+ for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
5218
+ var context = _f.value;
5105
5219
  var contextEntry = context[value];
5106
5220
  if (contextEntry)
5107
5221
  return contextEntry;
@@ -5110,32 +5224,23 @@ var ContextStackImpl = /** @class */ (function () {
5110
5224
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
5111
5225
  finally {
5112
5226
  try {
5113
- if (_g && !_g.done && (_a = _f.return)) _a.call(_f);
5227
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
5114
5228
  }
5115
5229
  finally { if (e_4) throw e_4.error; }
5116
5230
  }
5117
- var lazyHostValue = (_c = this.lazyValues) === null || _c === void 0 ? void 0 : _c[value];
5231
+ var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
5118
5232
  if (lazyHostValue !== undefined) {
5119
5233
  return {
5120
5234
  value: toAny(lazyHostValue.read()),
5121
5235
  };
5122
5236
  }
5123
- var hostValue = (_d = this.values) === null || _d === void 0 ? void 0 : _d[value];
5237
+ var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
5124
5238
  if (hostValue !== undefined) {
5125
5239
  return {
5126
5240
  value: toAny(hostValue),
5127
5241
  };
5128
5242
  }
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];
5243
+ var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
5139
5244
  if (nativeJsFunction) {
5140
5245
  return {
5141
5246
  value: nativeJsFunction,
@@ -5143,13 +5248,26 @@ var ContextStackImpl = /** @class */ (function () {
5143
5248
  }
5144
5249
  return null;
5145
5250
  };
5146
- ContextStackImpl.prototype.evaluateName = function (node) {
5251
+ ContextStackImpl.prototype.evaluateSymbol = function (node) {
5252
+ var _a;
5253
+ if (isSpecialBuiltinSymbolNode(node)) {
5254
+ throw new Error('Special builtin symbols should not be evaluated');
5255
+ }
5256
+ if (isNormalBuiltinSymbolNode(node)) {
5257
+ var type = node[1];
5258
+ return _a = {},
5259
+ _a[FUNCTION_SYMBOL] = true,
5260
+ _a.functionType = 'Builtin',
5261
+ _a.normalBuitinSymbolType = type,
5262
+ _a.sourceCodeInfo = node[2],
5263
+ _a;
5264
+ }
5147
5265
  var lookUpResult = this.lookUp(node);
5148
5266
  if (isContextEntry(lookUpResult))
5149
5267
  return lookUpResult.value;
5150
5268
  else if (isBuiltinFunction(lookUpResult))
5151
5269
  return lookUpResult;
5152
- throw new UndefinedSymbolError(node.value, node.sourceCodeInfo);
5270
+ throw new UndefinedSymbolError(node[1], node[2]);
5153
5271
  };
5154
5272
  return ContextStackImpl;
5155
5273
  }());
@@ -5684,6 +5802,10 @@ function assertReservedSymbolToken(token, symbolName) {
5684
5802
  throwUnexpectedToken('ReservedSymbol', symbolName, token);
5685
5803
  }
5686
5804
  }
5805
+ function asReservedSymbolToken(token, symbolName) {
5806
+ assertReservedSymbolToken(token, symbolName);
5807
+ return token;
5808
+ }
5687
5809
  function isSingleLineCommentToken(token) {
5688
5810
  return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
5689
5811
  }
@@ -5766,6 +5888,9 @@ function assertRBraceToken(token) {
5766
5888
  throwUnexpectedToken('RBrace', undefined, token);
5767
5889
  }
5768
5890
  }
5891
+ function isStringToken(token) {
5892
+ return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
5893
+ }
5769
5894
  function isA_BinaryOperatorToken(token) {
5770
5895
  return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
5771
5896
  }
@@ -5803,6 +5928,12 @@ function untokenize(tokenStream) {
5803
5928
  var exponentiationPrecedence = 10;
5804
5929
  var binaryFunctionalOperatorPrecedence = 1;
5805
5930
  var placeholderRegexp = /^\$([1-9]\d?)?$/;
5931
+ function withSourceCodeInfo(node, sourceCodeInfo) {
5932
+ if (sourceCodeInfo) {
5933
+ node[2] = sourceCodeInfo;
5934
+ }
5935
+ return node;
5936
+ }
5806
5937
  function getPrecedence(operatorSign) {
5807
5938
  switch (operatorSign) {
5808
5939
  case '**': // exponentiation
@@ -5845,29 +5976,18 @@ function getPrecedence(operatorSign) {
5845
5976
  throw new Error("Unknown binary operator: ".concat(operatorSign));
5846
5977
  }
5847
5978
  }
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);
5979
+ function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
5980
+ var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
5981
+ if (isNormalBuiltinSymbolNode(symbolNode)) {
5982
+ assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
5858
5983
  }
5859
5984
  return node;
5860
5985
  }
5861
5986
  function createAccessorNode(left, right, sourceCodeInfo) {
5862
5987
  // Unnamed normal expression
5863
- return {
5864
- type: 'NormalExpression',
5865
- params: [left, right],
5866
- name: undefined,
5867
- sourceCodeInfo: sourceCodeInfo,
5868
- };
5988
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
5869
5989
  }
5870
- function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
5990
+ function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
5871
5991
  var operatorName = operator[1];
5872
5992
  switch (operatorName) {
5873
5993
  case '**': // exponentiation
@@ -5892,16 +6012,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
5892
6012
  case '&':
5893
6013
  case '^':
5894
6014
  case '|':
5895
- return createNamedNormalExpressionNode(operatorName, [left, right], sourceCodeInfo);
6015
+ return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
5896
6016
  case '&&':
5897
6017
  case '||':
5898
6018
  case '??':
5899
- return {
5900
- type: 'SpecialExpression',
5901
- name: operatorName,
5902
- params: [left, right],
5903
- sourceCodeInfo: sourceCodeInfo,
5904
- };
6019
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
5905
6020
  /* v8 ignore next 10 */
5906
6021
  case '.':
5907
6022
  case ';':
@@ -5997,9 +6112,12 @@ var Parser = /** @class */ (function () {
5997
6112
  && !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
5998
6113
  break;
5999
6114
  }
6115
+ var symbol = specialExpressionTypes[name_1]
6116
+ ? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
6117
+ : withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
6000
6118
  this.advance();
6001
6119
  var right = this.parseExpression(newPrecedece);
6002
- left = fromBinaryOperatorToAstNode(operator, left, right, operator[2]);
6120
+ left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
6003
6121
  }
6004
6122
  else if (isSymbolToken(operator)) {
6005
6123
  if (!isFunctionOperator(operator[1])) {
@@ -6009,9 +6127,12 @@ var Parser = /** @class */ (function () {
6009
6127
  if (newPrecedece <= precedence) {
6010
6128
  break;
6011
6129
  }
6012
- this.advance();
6130
+ var operatorSymbol = this.parseSymbol();
6013
6131
  var right = this.parseExpression(newPrecedece);
6014
- left = createNamedNormalExpressionNode(operator[1], [left, right], operator[2]);
6132
+ if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
6133
+ throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
6134
+ }
6135
+ left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
6015
6136
  }
6016
6137
  else {
6017
6138
  break;
@@ -6030,11 +6151,7 @@ var Parser = /** @class */ (function () {
6030
6151
  if (!isSymbolToken(symbolToken)) {
6031
6152
  throw new LitsError('Expected symbol', this.peek()[2]);
6032
6153
  }
6033
- var stringNode = {
6034
- type: 'String',
6035
- value: symbolToken[1],
6036
- sourceCodeInfo: symbolToken[2],
6037
- };
6154
+ var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
6038
6155
  operand = createAccessorNode(operand, stringNode, token[2]);
6039
6156
  this.advance();
6040
6157
  token = this.peek();
@@ -6074,16 +6191,17 @@ var Parser = /** @class */ (function () {
6074
6191
  this.advance();
6075
6192
  return expression;
6076
6193
  }
6077
- // Unary operators
6078
6194
  else if (isOperatorToken(token)) {
6079
6195
  var operatorName = token[1];
6080
6196
  if (isBinaryOperator(operatorName)) {
6081
6197
  this.advance();
6082
- return {
6083
- type: 'Symbol',
6084
- value: operatorName,
6085
- sourceCodeInfo: token[2],
6086
- };
6198
+ if (specialExpressionTypes[operatorName] !== undefined) {
6199
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
6200
+ }
6201
+ else if (normalExpressionTypes[operatorName] !== undefined) {
6202
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
6203
+ }
6204
+ return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, operatorName], token[2]);
6087
6205
  }
6088
6206
  if (operatorName === '->') {
6089
6207
  return this.parseShorthandLamdaFunction();
@@ -6131,22 +6249,24 @@ var Parser = /** @class */ (function () {
6131
6249
  while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
6132
6250
  if (isOperatorToken(this.peek(), '...')) {
6133
6251
  this.advance();
6134
- params.push({
6135
- type: 'Spread',
6136
- value: this.parseExpression(),
6137
- sourceCodeInfo: this.peek()[2],
6138
- });
6252
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6139
6253
  }
6140
6254
  else {
6141
- var key = this.parseOperand();
6142
- if (key.type !== 'Symbol' && key.type !== 'String') {
6255
+ var token = this.peek();
6256
+ if (isStringToken(token)) {
6257
+ var stringNode = this.parseString();
6258
+ params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
6259
+ }
6260
+ else if (isSymbolToken(token)) {
6261
+ var value = token[1].startsWith('\'')
6262
+ ? this.stringFromQuotedSymbol(token[1])
6263
+ : token[1];
6264
+ params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
6265
+ this.advance();
6266
+ }
6267
+ else {
6143
6268
  throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
6144
6269
  }
6145
- params.push({
6146
- type: 'String',
6147
- value: key.value,
6148
- sourceCodeInfo: key.sourceCodeInfo,
6149
- });
6150
6270
  assertOperatorToken(this.peek(), ':=');
6151
6271
  this.advance();
6152
6272
  params.push(this.parseExpression());
@@ -6161,12 +6281,7 @@ var Parser = /** @class */ (function () {
6161
6281
  }
6162
6282
  assertRBraceToken(this.peek());
6163
6283
  this.advance();
6164
- return {
6165
- type: 'SpecialExpression',
6166
- name: 'object',
6167
- params: params,
6168
- sourceCodeInfo: firstToken[2],
6169
- };
6284
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
6170
6285
  };
6171
6286
  Parser.prototype.parseArray = function () {
6172
6287
  var firstToken = asLBracketToken(this.peek());
@@ -6175,11 +6290,7 @@ var Parser = /** @class */ (function () {
6175
6290
  while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
6176
6291
  if (isOperatorToken(this.peek(), '...')) {
6177
6292
  this.advance();
6178
- params.push({
6179
- type: 'Spread',
6180
- value: this.parseExpression(),
6181
- sourceCodeInfo: this.peek()[2],
6182
- });
6293
+ params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
6183
6294
  }
6184
6295
  else {
6185
6296
  params.push(this.parseExpression());
@@ -6194,15 +6305,9 @@ var Parser = /** @class */ (function () {
6194
6305
  }
6195
6306
  assertRBracketToken(this.peek());
6196
6307
  this.advance();
6197
- return {
6198
- type: 'SpecialExpression',
6199
- name: 'array',
6200
- params: params,
6201
- sourceCodeInfo: firstToken[2],
6202
- };
6308
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
6203
6309
  };
6204
6310
  Parser.prototype.parseFunctionCall = function (symbol) {
6205
- var isNamedFunction = symbol.type === 'Symbol';
6206
6311
  this.advance();
6207
6312
  var params = [];
6208
6313
  while (!this.isAtEnd() && !isRParenToken(this.peek())) {
@@ -6219,45 +6324,57 @@ var Parser = /** @class */ (function () {
6219
6324
  throw new LitsError('Expected closing parenthesis', this.peek()[2]);
6220
6325
  }
6221
6326
  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;
6327
+ if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
6328
+ var specialExpressionType = symbol[1];
6329
+ var type = specialExpressionType;
6330
+ switch (type) {
6331
+ case specialExpressionTypes['||']:
6332
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6333
+ case specialExpressionTypes['&&']:
6334
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6335
+ case specialExpressionTypes.recur:
6336
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6337
+ case specialExpressionTypes.array:
6338
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6339
+ case specialExpressionTypes.object:
6340
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
6341
+ case specialExpressionTypes['??']: {
6342
+ if (params.length === 1) {
6343
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
6344
+ }
6345
+ if (params.length === 2) {
6346
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
6347
+ }
6348
+ throw new LitsError('Expected exactly two parameters', symbol[2]);
6349
+ }
6350
+ case specialExpressionTypes['defined?']: {
6351
+ if (params.length !== 1) {
6352
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6353
+ }
6354
+ var _a = __read(params, 1), param = _a[0];
6355
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6356
+ }
6357
+ case specialExpressionTypes.throw: {
6358
+ if (params.length !== 1) {
6359
+ throw new LitsError('Expected exactly one parameter', symbol[2]);
6242
6360
  }
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));
6361
+ var _b = __read(params, 1), param = _b[0];
6362
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
6250
6363
  }
6364
+ case specialExpressionTypes.fn:
6365
+ case specialExpressionTypes.def:
6366
+ case specialExpressionTypes.defn:
6367
+ throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
6368
+ /* v8 ignore next 2 */
6369
+ default:
6370
+ throw new Error("Unknown special expression: ".concat(type));
6251
6371
  }
6252
- return createNamedNormalExpressionNode(symbol.value, params, symbol.sourceCodeInfo);
6372
+ }
6373
+ else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
6374
+ return createNamedNormalExpressionNode(symbol, params, symbol[2]);
6253
6375
  }
6254
6376
  else {
6255
- return {
6256
- type: 'NormalExpression',
6257
- name: undefined,
6258
- params: __spreadArray([symbol], __read(params), false),
6259
- sourceCodeInfo: symbol.sourceCodeInfo,
6260
- };
6377
+ return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
6261
6378
  }
6262
6379
  };
6263
6380
  Parser.prototype.parseLambdaFunction = function () {
@@ -6274,16 +6391,10 @@ var Parser = /** @class */ (function () {
6274
6391
  }
6275
6392
  this.advance();
6276
6393
  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
- };
6394
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
6395
+ functionArguments,
6396
+ [body],
6397
+ ]]], firstToken[2]);
6287
6398
  }
6288
6399
  catch (_a) {
6289
6400
  return null;
@@ -6292,11 +6403,7 @@ var Parser = /** @class */ (function () {
6292
6403
  Parser.prototype.parseFunctionArguments = function () {
6293
6404
  var firstToken = this.peek();
6294
6405
  if (isSymbolToken(firstToken)) {
6295
- return [{
6296
- type: 'symbol',
6297
- name: this.parseSymbol().value,
6298
- sourceCodeInfo: firstToken[2],
6299
- }];
6406
+ return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
6300
6407
  }
6301
6408
  assertLParenToken(firstToken);
6302
6409
  this.advance();
@@ -6308,13 +6415,13 @@ var Parser = /** @class */ (function () {
6308
6415
  throw new LitsError('Rest argument must be last', this.peek()[2]);
6309
6416
  }
6310
6417
  var bindingTarget = this.parseBindingTarget();
6311
- if (bindingTarget.default) {
6418
+ if (bindingTarget[1][1] !== undefined) {
6312
6419
  defaults = true;
6313
6420
  }
6314
- if (bindingTarget.type === 'rest') {
6421
+ if (bindingTarget[0] === bindingTargetTypes.rest) {
6315
6422
  rest = true;
6316
6423
  }
6317
- if (defaults && !bindingTarget.default) {
6424
+ if (defaults && !bindingTarget[1][1]) {
6318
6425
  throw new LitsError('Default arguments must be last', this.peek()[2]);
6319
6426
  }
6320
6427
  functionArguments.push(bindingTarget);
@@ -6361,22 +6468,16 @@ var Parser = /** @class */ (function () {
6361
6468
  var functionArguments = [];
6362
6469
  for (var i = 1; i <= arity; i += 1) {
6363
6470
  if (i === 1 && dollar1 === 'NAKED') {
6364
- functionArguments.push({ type: 'symbol', name: '$', sourceCodeInfo: firstToken[2] });
6471
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
6365
6472
  }
6366
6473
  else {
6367
- functionArguments.push({ type: 'symbol', name: "$".concat(i), sourceCodeInfo: firstToken[2] });
6474
+ functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
6368
6475
  }
6369
6476
  }
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
- };
6477
+ var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
6478
+ functionArguments,
6479
+ [exprNode],
6480
+ ]]], firstToken[2]);
6380
6481
  return node;
6381
6482
  };
6382
6483
  Parser.prototype.parseOptionalDefaulValue = function () {
@@ -6392,16 +6493,14 @@ var Parser = /** @class */ (function () {
6392
6493
  // Symbol
6393
6494
  if (isSymbolToken(firstToken)) {
6394
6495
  var symbol = this.parseSymbol();
6496
+ if (!isUserDefinedSymbolNode(symbol)) {
6497
+ throw new LitsError('Expected user defined symbol', firstToken[2]);
6498
+ }
6395
6499
  var defaultValue = this.parseOptionalDefaulValue();
6396
6500
  if (requireDefaultValue && !defaultValue) {
6397
6501
  throw new LitsError('Expected assignment', this.peek()[2]);
6398
6502
  }
6399
- return {
6400
- type: 'symbol',
6401
- name: symbol.value,
6402
- default: defaultValue,
6403
- sourceCodeInfo: firstToken[2],
6404
- };
6503
+ return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
6405
6504
  }
6406
6505
  // Rest
6407
6506
  if (isOperatorToken(firstToken, '...')) {
@@ -6409,15 +6508,11 @@ var Parser = /** @class */ (function () {
6409
6508
  throw new LitsError('Rest element not allowed', firstToken[2]);
6410
6509
  }
6411
6510
  this.advance();
6412
- var symbol = this.parseSymbol();
6511
+ var symbol = asUserDefinedSymbolNode(this.parseSymbol());
6413
6512
  if (isOperatorToken(this.peek(), ':=')) {
6414
6513
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6415
6514
  }
6416
- return {
6417
- type: 'rest',
6418
- name: symbol.value,
6419
- sourceCodeInfo: firstToken[2],
6420
- };
6515
+ return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
6421
6516
  }
6422
6517
  // Array
6423
6518
  if (isLBracketToken(firstToken)) {
@@ -6436,7 +6531,7 @@ var Parser = /** @class */ (function () {
6436
6531
  continue;
6437
6532
  }
6438
6533
  var target = this.parseBindingTarget();
6439
- if (target.type === 'rest') {
6534
+ if (target[0] === bindingTargetTypes.rest) {
6440
6535
  rest = true;
6441
6536
  }
6442
6537
  elements.push(target);
@@ -6452,12 +6547,7 @@ var Parser = /** @class */ (function () {
6452
6547
  if (requireDefaultValue && !defaultValue) {
6453
6548
  throw new LitsError('Expected assignment', this.peek()[2]);
6454
6549
  }
6455
- return {
6456
- type: 'array',
6457
- elements: elements,
6458
- default: defaultValue,
6459
- sourceCodeInfo: firstToken[2],
6460
- };
6550
+ return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
6461
6551
  }
6462
6552
  // Object
6463
6553
  if (isLBraceToken(firstToken)) {
@@ -6473,40 +6563,32 @@ var Parser = /** @class */ (function () {
6473
6563
  rest = true;
6474
6564
  this.advance();
6475
6565
  }
6476
- var key = this.parseSymbol().value;
6566
+ var key = asUserDefinedSymbolNode(this.parseSymbol());
6477
6567
  token = this.peek();
6478
6568
  if (isReservedSymbolToken(token, 'as')) {
6479
6569
  if (rest) {
6480
6570
  throw new LitsError('Rest argument can not have alias', token[2]);
6481
6571
  }
6482
6572
  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]);
6573
+ var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
6574
+ if (elements[name_2[1]]) {
6575
+ throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
6486
6576
  }
6487
- elements[key] = {
6488
- type: 'symbol',
6489
- name: name_3,
6490
- default: this.parseOptionalDefaulValue(),
6491
- sourceCodeInfo: firstToken[2],
6492
- };
6577
+ elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
6493
6578
  }
6494
6579
  else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
6495
- if (elements[key]) {
6580
+ if (elements[key[1]]) {
6496
6581
  throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
6497
6582
  }
6498
6583
  if (rest && isOperatorToken(this.peek(), ':=')) {
6499
6584
  throw new LitsError('Rest argument can not have default value', this.peek()[2]);
6500
6585
  }
6501
- elements[key] = {
6502
- type: rest ? 'rest' : 'symbol',
6503
- name: key,
6504
- default: this.parseOptionalDefaulValue(),
6505
- sourceCodeInfo: firstToken[2],
6506
- };
6586
+ elements[key[1]] = rest
6587
+ ? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
6588
+ : withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
6507
6589
  }
6508
6590
  else if (isLBraceToken(token) || isLBracketToken(token)) {
6509
- elements[key] = this.parseBindingTarget();
6591
+ elements[key[1]] = this.parseBindingTarget();
6510
6592
  }
6511
6593
  if (!isRBraceToken(this.peek())) {
6512
6594
  assertOperatorToken(this.peek(), ',');
@@ -6520,12 +6602,7 @@ var Parser = /** @class */ (function () {
6520
6602
  if (requireDefaultValue && !defaultValue) {
6521
6603
  throw new LitsError('Expected assignment', token[2]);
6522
6604
  }
6523
- return {
6524
- type: 'object',
6525
- elements: elements,
6526
- default: defaultValue,
6527
- sourceCodeInfo: firstToken[2],
6528
- };
6605
+ return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
6529
6606
  }
6530
6607
  throw new LitsError('Expected symbol', this.peek()[2]);
6531
6608
  };
@@ -6533,22 +6610,13 @@ var Parser = /** @class */ (function () {
6533
6610
  if (optionalSemicolon === void 0) { optionalSemicolon = false; }
6534
6611
  this.advance();
6535
6612
  var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
6536
- var value = target.default;
6537
- delete target.default;
6613
+ var value = target[1][1];
6614
+ target[1][1] = undefined;
6538
6615
  if (!optionalSemicolon) {
6539
6616
  assertOperatorToken(this.peek(), ';');
6540
6617
  }
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
- };
6618
+ var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
6619
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
6552
6620
  };
6553
6621
  Parser.prototype.parseDo = function (token) {
6554
6622
  this.advance();
@@ -6564,12 +6632,7 @@ var Parser = /** @class */ (function () {
6564
6632
  }
6565
6633
  assertReservedSymbolToken(this.peek(), 'end');
6566
6634
  this.advance();
6567
- return {
6568
- type: 'SpecialExpression',
6569
- name: 'do',
6570
- params: expressions,
6571
- sourceCodeInfo: token[2],
6572
- };
6635
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6573
6636
  };
6574
6637
  Parser.prototype.parseLoop = function (firstToken) {
6575
6638
  this.advance();
@@ -6579,14 +6642,9 @@ var Parser = /** @class */ (function () {
6579
6642
  assertSymbolToken(token, 'let');
6580
6643
  this.advance();
6581
6644
  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
- });
6645
+ var value = target[1][1];
6646
+ target[1][1] = undefined;
6647
+ bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
6590
6648
  if (isOperatorToken(this.peek(), ',')) {
6591
6649
  this.advance();
6592
6650
  }
@@ -6609,13 +6667,7 @@ var Parser = /** @class */ (function () {
6609
6667
  }
6610
6668
  assertReservedSymbolToken(this.peek(), 'end');
6611
6669
  this.advance();
6612
- return {
6613
- type: 'SpecialExpression',
6614
- name: 'loop',
6615
- params: params,
6616
- bindingNodes: bindingNodes,
6617
- sourceCodeInfo: firstToken[2],
6618
- };
6670
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
6619
6671
  };
6620
6672
  Parser.prototype.parseTry = function (token) {
6621
6673
  this.advance();
@@ -6631,12 +6683,7 @@ var Parser = /** @class */ (function () {
6631
6683
  }
6632
6684
  var tryExpression = tryExpressions.length === 1
6633
6685
  ? tryExpressions[0]
6634
- : {
6635
- type: 'SpecialExpression',
6636
- name: 'do',
6637
- params: tryExpressions,
6638
- sourceCodeInfo: token[2],
6639
- };
6686
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
6640
6687
  assertReservedSymbolToken(this.peek(), 'catch');
6641
6688
  this.advance();
6642
6689
  var errorSymbol;
@@ -6660,20 +6707,8 @@ var Parser = /** @class */ (function () {
6660
6707
  this.advance();
6661
6708
  var catchExpression = catchExpressions.length === 1
6662
6709
  ? 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
- };
6710
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
6711
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
6677
6712
  };
6678
6713
  Parser.prototype.parseForOrDoseq = function (firstToken) {
6679
6714
  var isDoseq = firstToken[1] === 'doseq';
@@ -6681,10 +6716,10 @@ var Parser = /** @class */ (function () {
6681
6716
  var forLoopBindings = [];
6682
6717
  var _loop_1 = function () {
6683
6718
  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);
6719
+ var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
6720
+ var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
6686
6721
  if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
6687
- throw new LitsError('Duplicate binding', loopBinding.b.sourceCodeInfo);
6722
+ throw new LitsError('Duplicate binding', loopBinding[0][2]);
6688
6723
  }
6689
6724
  forLoopBindings.push(loopBinding);
6690
6725
  };
@@ -6706,13 +6741,9 @@ var Parser = /** @class */ (function () {
6706
6741
  }
6707
6742
  assertReservedSymbolToken(this.peek(), 'end');
6708
6743
  this.advance();
6709
- return {
6710
- type: 'SpecialExpression',
6711
- name: isDoseq ? 'doseq' : 'for',
6712
- params: expressions,
6713
- sourceCodeInfo: firstToken[2],
6714
- l: forLoopBindings,
6715
- };
6744
+ return isDoseq
6745
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
6746
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
6716
6747
  };
6717
6748
  Parser.prototype.parseForLoopBinding = function () {
6718
6749
  assertReservedSymbolToken(this.peek(), 'each');
@@ -6734,18 +6765,17 @@ var Parser = /** @class */ (function () {
6734
6765
  && !isReservedSymbolToken(token, 'each')) {
6735
6766
  throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
6736
6767
  }
6737
- var letBindings;
6768
+ var letBindings = [];
6738
6769
  if (token[1] === 'let') {
6739
6770
  modifiers.push('&let');
6740
- letBindings = [];
6741
6771
  var _loop_2 = function () {
6742
6772
  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));
6773
+ var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
6774
+ var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
6745
6775
  if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
6746
- throw new LitsError('Duplicate binding', letNode.bindingNode.sourceCodeInfo);
6776
+ throw new LitsError('Duplicate binding', letNode[1][1][2]);
6747
6777
  }
6748
- letBindings.push(letNode.bindingNode);
6778
+ letBindings.push(letNode[1][1]);
6749
6779
  token = this_2.peek();
6750
6780
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
6751
6781
  throw new LitsError('Expected do, each or comma', token[2]);
@@ -6791,31 +6821,21 @@ var Parser = /** @class */ (function () {
6791
6821
  if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
6792
6822
  throw new LitsError('Expected do or each', token[2]);
6793
6823
  }
6794
- return {
6795
- b: bindingNode,
6796
- m: modifiers,
6797
- l: letBindings,
6798
- wn: whenNode,
6799
- we: whileNode,
6800
- };
6824
+ return [bindingNode, letBindings, whenNode, whileNode];
6801
6825
  };
6802
6826
  Parser.prototype.parseBinding = function () {
6803
6827
  var firstToken = asSymbolToken(this.peek());
6804
- var name = firstToken[1];
6805
- this.advance();
6828
+ var name = asUserDefinedSymbolNode(this.parseSymbol());
6806
6829
  assertReservedSymbolToken(this.peek(), 'in');
6807
6830
  this.advance();
6808
6831
  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
- };
6832
+ var node = withSourceCodeInfo([
6833
+ NodeTypes.Binding,
6834
+ [
6835
+ withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
6836
+ value,
6837
+ ],
6838
+ ], firstToken[2]);
6819
6839
  return node;
6820
6840
  };
6821
6841
  Parser.prototype.parseIfOrUnless = function (token) {
@@ -6838,12 +6858,7 @@ var Parser = /** @class */ (function () {
6838
6858
  }
6839
6859
  var thenExpression = thenExpressions.length === 1
6840
6860
  ? thenExpressions[0]
6841
- : {
6842
- type: 'SpecialExpression',
6843
- name: 'do',
6844
- params: thenExpressions,
6845
- sourceCodeInfo: token[2],
6846
- };
6861
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
6847
6862
  var elseExpression;
6848
6863
  if (isReservedSymbolToken(this.peek(), 'else')) {
6849
6864
  this.advance();
@@ -6859,25 +6874,13 @@ var Parser = /** @class */ (function () {
6859
6874
  }
6860
6875
  elseExpression = elseExpressions.length === 1
6861
6876
  ? elseExpressions[0]
6862
- : {
6863
- type: 'SpecialExpression',
6864
- name: 'do',
6865
- params: elseExpressions,
6866
- sourceCodeInfo: token[2],
6867
- };
6877
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
6868
6878
  }
6869
6879
  assertReservedSymbolToken(this.peek(), 'end');
6870
6880
  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
- };
6881
+ return isUnless
6882
+ ? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
6883
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
6881
6884
  };
6882
6885
  Parser.prototype.parseCond = function (token) {
6883
6886
  this.advance();
@@ -6885,7 +6888,7 @@ var Parser = /** @class */ (function () {
6885
6888
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6886
6889
  assertReservedSymbolToken(this.peek(), 'case');
6887
6890
  this.advance();
6888
- params.push(this.parseExpression());
6891
+ var caseExpression = this.parseExpression();
6889
6892
  assertReservedSymbolToken(this.peek(), 'then');
6890
6893
  this.advance();
6891
6894
  var expressions = [];
@@ -6900,14 +6903,10 @@ var Parser = /** @class */ (function () {
6900
6903
  throw new LitsError('Expected ;', this.peek()[2]);
6901
6904
  }
6902
6905
  }
6903
- params.push(expressions.length === 1
6906
+ var thenExpression = expressions.length === 1
6904
6907
  ? expressions[0]
6905
- : {
6906
- type: 'SpecialExpression',
6907
- name: 'do',
6908
- params: expressions,
6909
- sourceCodeInfo: token[2],
6910
- });
6908
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6909
+ params.push([caseExpression, thenExpression]);
6911
6910
  if (isReservedSymbolToken(this.peek(), 'end')) {
6912
6911
  break;
6913
6912
  }
@@ -6915,20 +6914,16 @@ var Parser = /** @class */ (function () {
6915
6914
  }
6916
6915
  assertReservedSymbolToken(this.peek(), 'end');
6917
6916
  this.advance();
6918
- return {
6919
- type: 'SpecialExpression',
6920
- name: 'cond',
6921
- params: params,
6922
- sourceCodeInfo: token[2],
6923
- };
6917
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
6924
6918
  };
6925
6919
  Parser.prototype.parseSwitch = function (token) {
6926
6920
  this.advance();
6927
- var params = [this.parseExpression()];
6921
+ var valueExpression = this.parseExpression();
6922
+ var params = [];
6928
6923
  while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
6929
6924
  assertReservedSymbolToken(this.peek(), 'case');
6930
6925
  this.advance();
6931
- params.push(this.parseExpression());
6926
+ var caseExpression = this.parseExpression();
6932
6927
  assertReservedSymbolToken(this.peek(), 'then');
6933
6928
  this.advance();
6934
6929
  var expressions = [];
@@ -6943,14 +6938,10 @@ var Parser = /** @class */ (function () {
6943
6938
  throw new LitsError('Expected ;', this.peek()[2]);
6944
6939
  }
6945
6940
  }
6946
- params.push(expressions.length === 1
6941
+ var thenExpression = expressions.length === 1
6947
6942
  ? expressions[0]
6948
- : {
6949
- type: 'SpecialExpression',
6950
- name: 'do',
6951
- params: expressions,
6952
- sourceCodeInfo: token[2],
6953
- });
6943
+ : withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
6944
+ params.push([caseExpression, thenExpression]);
6954
6945
  if (isReservedSymbolToken(this.peek(), 'end')) {
6955
6946
  break;
6956
6947
  }
@@ -6958,12 +6949,7 @@ var Parser = /** @class */ (function () {
6958
6949
  }
6959
6950
  assertReservedSymbolToken(this.peek(), 'end');
6960
6951
  this.advance();
6961
- return {
6962
- type: 'SpecialExpression',
6963
- name: 'switch',
6964
- params: params,
6965
- sourceCodeInfo: token[2],
6966
- };
6952
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
6967
6953
  };
6968
6954
  Parser.prototype.parseFunction = function (token) {
6969
6955
  this.advance();
@@ -6982,17 +6968,10 @@ var Parser = /** @class */ (function () {
6982
6968
  assertReservedSymbolToken(this.peek(), 'end');
6983
6969
  this.advance();
6984
6970
  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
- };
6971
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
6972
+ functionArguments,
6973
+ body,
6974
+ ]]], token[2]);
6996
6975
  };
6997
6976
  Parser.prototype.isAtEnd = function () {
6998
6977
  return this.parseState.position >= this.tokenStream.tokens.length;
@@ -7014,7 +6993,7 @@ var Parser = /** @class */ (function () {
7014
6993
  this.advance();
7015
6994
  if (isSymbolToken(this.peek(), 'let')) {
7016
6995
  var letNode = this.parseLet(asSymbolToken(this.peek()));
7017
- return __assign(__assign({}, letNode), { name: 'def' });
6996
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.def, letNode[1][1]]], token[2]);
7018
6997
  }
7019
6998
  else if (isReservedSymbolToken(this.peek(), 'function')) {
7020
6999
  this.advance();
@@ -7032,71 +7011,57 @@ var Parser = /** @class */ (function () {
7032
7011
  }
7033
7012
  assertReservedSymbolToken(this.peek(), 'end');
7034
7013
  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
- };
7014
+ return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.defn, symbol, [
7015
+ functionArguments,
7016
+ body,
7017
+ ]]], token[2]);
7046
7018
  }
7047
7019
  else {
7048
7020
  throw new LitsError('Expected let or function', this.peek()[2]);
7049
7021
  }
7050
7022
  };
7023
+ Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
7024
+ if (specialExpressionTypes[value] !== undefined) {
7025
+ return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
7026
+ }
7027
+ if (normalExpressionTypes[value] !== undefined) {
7028
+ return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
7029
+ }
7030
+ return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
7031
+ };
7032
+ Parser.prototype.stringFromQuotedSymbol = function (value) {
7033
+ return value.substring(1, value.length - 1)
7034
+ .replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
7035
+ if (backslash) {
7036
+ return '\\';
7037
+ }
7038
+ if (singleQuote) {
7039
+ return '\'';
7040
+ }
7041
+ return "\\".concat(normalChar);
7042
+ });
7043
+ };
7051
7044
  Parser.prototype.parseSymbol = function () {
7052
7045
  var token = this.peek();
7053
7046
  this.advance();
7054
7047
  if (!isSymbolToken(token)) {
7055
7048
  throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
7056
7049
  }
7057
- if (token[1][0] !== '\'') {
7058
- return {
7059
- type: 'Symbol',
7060
- value: token[1],
7061
- sourceCodeInfo: token[2],
7062
- };
7050
+ if (token[1][0] === '\'') {
7051
+ return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
7063
7052
  }
7064
7053
  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
- };
7054
+ return this.stringToSymbolNode(token[1], token[2]);
7080
7055
  }
7081
7056
  };
7082
7057
  Parser.prototype.parseReservedSymbol = function () {
7083
- var token = this.peek();
7058
+ var token = asReservedSymbolToken(this.peek());
7084
7059
  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
- }
7060
+ var symbol = token[1];
7061
+ if (isNumberReservedSymbol(symbol)) {
7062
+ return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
7094
7063
  }
7095
- return {
7096
- type: 'ReservedSymbol',
7097
- value: token[1],
7098
- sourceCodeInfo: token[2],
7099
- };
7064
+ return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
7100
7065
  };
7101
7066
  Parser.prototype.parseNumber = function () {
7102
7067
  var token = this.peek();
@@ -7104,11 +7069,7 @@ var Parser = /** @class */ (function () {
7104
7069
  var value = token[1];
7105
7070
  var negative = value[0] === '-';
7106
7071
  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
- };
7072
+ return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
7112
7073
  };
7113
7074
  Parser.prototype.parseString = function () {
7114
7075
  var token = this.peek();
@@ -7140,11 +7101,7 @@ var Parser = /** @class */ (function () {
7140
7101
  }
7141
7102
  return normalChar;
7142
7103
  });
7143
- return {
7144
- type: 'String',
7145
- value: value,
7146
- sourceCodeInfo: token[2],
7147
- };
7104
+ return withSourceCodeInfo([NodeTypes.String, value], token[2]);
7148
7105
  };
7149
7106
  Parser.prototype.parseRegexpShorthand = function () {
7150
7107
  var token = this.peek();
@@ -7152,22 +7109,15 @@ var Parser = /** @class */ (function () {
7152
7109
  var endStringPosition = token[1].lastIndexOf('"');
7153
7110
  var regexpString = token[1].substring(2, endStringPosition);
7154
7111
  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
- };
7112
+ var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
7113
+ var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
7114
+ var node = withSourceCodeInfo([
7115
+ NodeTypes.NormalExpression,
7116
+ [
7117
+ withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
7118
+ [stringNode, optionsNode],
7119
+ ],
7120
+ ], token[2]);
7171
7121
  return node;
7172
7122
  };
7173
7123
  return Parser;
@@ -7284,7 +7234,7 @@ var Lits = /** @class */ (function () {
7284
7234
  if (params === void 0) { params = {}; }
7285
7235
  var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
7286
7236
  var contextStack = createContextStack(params);
7287
- return getUndefinedSymbols(ast, contextStack, builtin, evaluateAstNode);
7237
+ return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
7288
7238
  };
7289
7239
  Lits.prototype.tokenize = function (program, tokenizeParams) {
7290
7240
  if (tokenizeParams === void 0) { tokenizeParams = {}; }
@@ -13319,8 +13269,7 @@ Object.entries(specialExpressionsReference).forEach(function (_a) {
13319
13269
  var _b;
13320
13270
  var _c = __read(_a, 2), key = _c[0], obj = _c[1];
13321
13271
  if (isFunctionReference(obj)) {
13322
- var specialExpressions = builtin.specialExpressions;
13323
- var paramCount = (_b = specialExpressions[key]) === null || _b === void 0 ? void 0 : _b.paramCount;
13272
+ var paramCount = (_b = specialExpressions[specialExpressionTypes[key]]) === null || _b === void 0 ? void 0 : _b.paramCount;
13324
13273
  if (paramCount && canBeOperator(paramCount)) {
13325
13274
  obj._isOperator = true;
13326
13275
  }
@@ -13338,7 +13287,7 @@ function stringifyValue(value, html) {
13338
13287
  var lt = '<';
13339
13288
  if (isLitsFunction(value)) {
13340
13289
  if (value.functionType === 'Builtin')
13341
- return "".concat(lt, "builtin function ").concat(value.n).concat(gt);
13290
+ return "".concat(lt, "builtin function ").concat(value.normalBuitinSymbolType).concat(gt);
13342
13291
  else
13343
13292
  return "".concat(lt, "function ").concat((_a = value.n) !== null && _a !== void 0 ? _a : '\u03BB').concat(gt);
13344
13293
  }