@mojir/lits 2.0.13 → 2.0.14

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.
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.0.13";
95
+ var version = "2.0.14";
96
96
 
97
97
  var AstNodeType;
98
98
  (function (AstNodeType) {
@@ -415,6 +415,7 @@ var otherSymbolicOperators = [
415
415
  '.', // property accessor
416
416
  ',', // item separator
417
417
  '=', // property assignment
418
+ ';', // statement terminator
418
419
  ];
419
420
  var symbolicOperators = __spreadArray(__spreadArray(__spreadArray([], __read(symbolicUnaryOperators), false), __read(symbolicBinaryOperators), false), __read(otherSymbolicOperators), false);
420
421
  var nonFunctionOperators = [
@@ -7116,6 +7117,7 @@ function fromBinaryOperatorToAstNode(operator, left, right, token) {
7116
7117
  token: getTokenDebugData(token) && token,
7117
7118
  };
7118
7119
  /* v8 ignore next 8 */
7120
+ case ';':
7119
7121
  case '!':
7120
7122
  case '~':
7121
7123
  case '=':
@@ -7136,14 +7138,33 @@ var AlgebraicParser = /** @class */ (function () {
7136
7138
  this.parseState.position += 1;
7137
7139
  };
7138
7140
  AlgebraicParser.prototype.parse = function () {
7139
- return this.parseExpression();
7141
+ var nodes = [];
7142
+ while (!this.isAtEnd()) {
7143
+ nodes.push(this.parseExpression());
7144
+ if (!isA_OperatorToken(this.peek(), ';')) {
7145
+ break;
7146
+ }
7147
+ this.advance();
7148
+ }
7149
+ return nodes;
7140
7150
  };
7141
7151
  AlgebraicParser.prototype.parseExpression = function (precedence) {
7142
7152
  var _a;
7143
7153
  if (precedence === void 0) { precedence = 0; }
7154
+ var firstToken = this.peek();
7155
+ if (isA_SymbolToken(firstToken) && firstToken[1] === 'def') {
7156
+ return this.parseDef(firstToken);
7157
+ }
7158
+ if (isA_SymbolToken(firstToken) && firstToken[1] === 'defn') {
7159
+ return this.parseDefn(firstToken);
7160
+ }
7144
7161
  var left = this.parseOperand();
7145
- while (!this.isAtEnd() && !isA_OperatorToken(this.peek(), ',') && !isRBracketToken(this.peek()) && !isRParenToken(this.peek())) {
7146
- var operator = this.peek();
7162
+ var operator = this.peek();
7163
+ while (!this.isAtEnd()
7164
+ && !isA_OperatorToken(operator, ',')
7165
+ && !isA_OperatorToken(operator, ';')
7166
+ && !isRBracketToken(operator)
7167
+ && !isRParenToken(operator)) {
7147
7168
  if (isA_BinaryOperatorToken(operator)) {
7148
7169
  var name_1 = operator[1];
7149
7170
  var newPrecedece = getPrecedence(name_1);
@@ -7173,6 +7194,7 @@ var AlgebraicParser = /** @class */ (function () {
7173
7194
  else {
7174
7195
  break;
7175
7196
  }
7197
+ operator = this.peek();
7176
7198
  }
7177
7199
  if (!left) {
7178
7200
  throw new LitsError('Expected operand', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
@@ -7419,13 +7441,11 @@ var AlgebraicParser = /** @class */ (function () {
7419
7441
  }
7420
7442
  case 'let':
7421
7443
  return this.parseLet(symbol, params);
7422
- case 'def':
7423
7444
  case 'defs':
7424
7445
  case 'if-let':
7425
7446
  case 'when-let':
7426
7447
  case 'when-first':
7427
7448
  case 'fn':
7428
- case 'defn':
7429
7449
  case 'defns':
7430
7450
  case 'try':
7431
7451
  case 'recur':
@@ -7448,8 +7468,32 @@ var AlgebraicParser = /** @class */ (function () {
7448
7468
  }
7449
7469
  };
7450
7470
  AlgebraicParser.prototype.parseLambdaFunction = function () {
7451
- var _a, _b;
7452
7471
  var firstToken = this.peek();
7472
+ try {
7473
+ var _a = this.parseFunctionArguments(), functionArguments = _a.functionArguments, arity = _a.arity;
7474
+ if (!isA_OperatorToken(this.peek(), '=>')) {
7475
+ return null;
7476
+ }
7477
+ this.advance();
7478
+ var body = this.parseExpression();
7479
+ return {
7480
+ t: AstNodeType.SpecialExpression,
7481
+ n: 'fn',
7482
+ p: [],
7483
+ o: [{
7484
+ as: functionArguments,
7485
+ b: [body],
7486
+ a: arity,
7487
+ }],
7488
+ token: getTokenDebugData(firstToken) && firstToken,
7489
+ };
7490
+ }
7491
+ catch (_b) {
7492
+ return null;
7493
+ }
7494
+ };
7495
+ AlgebraicParser.prototype.parseFunctionArguments = function () {
7496
+ var _a, _b, _c, _d, _e;
7453
7497
  this.advance();
7454
7498
  var rest = false;
7455
7499
  var letBindingObject;
@@ -7472,7 +7516,7 @@ var AlgebraicParser = /** @class */ (function () {
7472
7516
  }
7473
7517
  var symbolToken = this.peek();
7474
7518
  if (!isA_SymbolToken(symbolToken)) {
7475
- return null;
7519
+ throw new LitsError('Expected symbol', (_c = getTokenDebugData(this.peek())) === null || _c === void 0 ? void 0 : _c.sourceCodeInfo);
7476
7520
  }
7477
7521
  if (rest) {
7478
7522
  restArg = symbolToken[1];
@@ -7483,47 +7527,36 @@ var AlgebraicParser = /** @class */ (function () {
7483
7527
  this.advance();
7484
7528
  }
7485
7529
  if (!isA_OperatorToken(this.peek(), ',') && !isRParenToken(this.peek())) {
7486
- return null;
7530
+ throw new LitsError('Expected comma or closing parenthesis', (_d = getTokenDebugData(this.peek())) === null || _d === void 0 ? void 0 : _d.sourceCodeInfo);
7487
7531
  }
7488
7532
  if (isA_OperatorToken(this.peek(), ',')) {
7489
7533
  this.advance();
7490
7534
  }
7491
7535
  }
7536
+ var arity = restArg !== undefined ? { min: args.length } : args.length;
7492
7537
  if (!isRParenToken(this.peek())) {
7493
- return null;
7494
- }
7495
- this.advance();
7496
- if (!isA_OperatorToken(this.peek(), '=>')) {
7497
- return null;
7538
+ throw new LitsError('Expected closing parenthesis', (_e = getTokenDebugData(this.peek())) === null || _e === void 0 ? void 0 : _e.sourceCodeInfo);
7498
7539
  }
7499
- this.advance();
7500
7540
  var letBindings = letBindingObject ? arrayToPairs(letBindingObject.p) : [];
7501
- var body = this.parseExpression();
7502
- var arity = restArg !== undefined ? { min: args.length } : args.length;
7541
+ var functionArguments = {
7542
+ m: args,
7543
+ r: restArg,
7544
+ b: letBindings.map(function (pair) {
7545
+ var key = pair[0];
7546
+ var value = pair[1];
7547
+ return {
7548
+ t: AstNodeType.Binding,
7549
+ n: key.v,
7550
+ v: value,
7551
+ p: [],
7552
+ token: getTokenDebugData(key.token) && key.token,
7553
+ };
7554
+ }),
7555
+ };
7556
+ this.advance();
7503
7557
  return {
7504
- t: AstNodeType.SpecialExpression,
7505
- n: 'fn',
7506
- p: [],
7507
- o: [{
7508
- as: {
7509
- m: args,
7510
- r: restArg,
7511
- b: letBindings.map(function (pair) {
7512
- var key = pair[0];
7513
- var value = pair[1];
7514
- return {
7515
- t: AstNodeType.Binding,
7516
- n: key.v,
7517
- v: value,
7518
- p: [],
7519
- token: getTokenDebugData(key.token) && key.token,
7520
- };
7521
- }),
7522
- },
7523
- b: [body],
7524
- a: arity,
7525
- }],
7526
- token: getTokenDebugData(firstToken) && firstToken,
7558
+ functionArguments: functionArguments,
7559
+ arity: arity,
7527
7560
  };
7528
7561
  };
7529
7562
  AlgebraicParser.prototype.parseShorthandLamdaFunction = function () {
@@ -7715,6 +7748,50 @@ var AlgebraicParser = /** @class */ (function () {
7715
7748
  };
7716
7749
  return node;
7717
7750
  };
7751
+ AlgebraicParser.prototype.parseDef = function (token) {
7752
+ this.advance();
7753
+ var symbol = parseSymbol(this.tokenStream, this.parseState);
7754
+ assertA_OperatorToken(this.peek(), '=');
7755
+ this.advance();
7756
+ var value = this.parseExpression();
7757
+ return {
7758
+ t: AstNodeType.SpecialExpression,
7759
+ n: 'def',
7760
+ p: [symbol, value],
7761
+ token: getTokenDebugData(token) && token,
7762
+ };
7763
+ };
7764
+ AlgebraicParser.prototype.parseDefn = function (token) {
7765
+ var _a;
7766
+ this.advance();
7767
+ var symbol = parseSymbol(this.tokenStream, this.parseState);
7768
+ var _b = this.parseFunctionArguments(), functionArguments = _b.functionArguments, arity = _b.arity;
7769
+ assertLBraceToken(this.peek());
7770
+ this.advance();
7771
+ var body = [];
7772
+ while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
7773
+ body.push(this.parseExpression());
7774
+ if (isA_OperatorToken(this.peek(), ';')) {
7775
+ this.advance();
7776
+ }
7777
+ }
7778
+ if (!isRBraceToken(this.peek())) {
7779
+ throw new LitsError('Expected closing brace', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
7780
+ }
7781
+ this.advance();
7782
+ return {
7783
+ t: AstNodeType.SpecialExpression,
7784
+ n: 'defn',
7785
+ f: symbol,
7786
+ p: [],
7787
+ o: [{
7788
+ as: functionArguments,
7789
+ b: body,
7790
+ a: arity,
7791
+ }],
7792
+ token: getTokenDebugData(token) && token,
7793
+ };
7794
+ };
7718
7795
  AlgebraicParser.prototype.isAtEnd = function () {
7719
7796
  return this.parseState.position >= this.tokenStream.tokens.length;
7720
7797
  };
@@ -8004,10 +8081,18 @@ function parsePolishToken(tokenStream, parseState) {
8004
8081
  parseState.position += 1;
8005
8082
  parseState.algebraic = true;
8006
8083
  var algebraicParser = new AlgebraicParser(tokenStream, parseState);
8007
- var node = algebraicParser.parse();
8084
+ var nodes = algebraicParser.parse();
8008
8085
  assertEndNotationToken(tokenStream.tokens[parseState.position++]);
8009
8086
  parseState.algebraic = false;
8010
- return node;
8087
+ if (nodes.length === 1) {
8088
+ return nodes[0];
8089
+ }
8090
+ return {
8091
+ t: AstNodeType.SpecialExpression,
8092
+ n: 'do',
8093
+ p: nodes,
8094
+ token: nodes[0].token,
8095
+ };
8011
8096
  }
8012
8097
  case 'PolNotation': {
8013
8098
  var astNodes = [];
@@ -8074,7 +8159,16 @@ function removeUnnecessaryTokens(tokenStream) {
8074
8159
  function parseToken(tokenStream, parseState) {
8075
8160
  if (parseState.algebraic) {
8076
8161
  var algebraicParser = new AlgebraicParser(tokenStream, parseState);
8077
- return algebraicParser.parse();
8162
+ var nodes = algebraicParser.parse();
8163
+ if (nodes.length === 1) {
8164
+ return nodes[0];
8165
+ }
8166
+ return {
8167
+ t: AstNodeType.SpecialExpression,
8168
+ n: 'do',
8169
+ p: nodes,
8170
+ token: nodes[0].token,
8171
+ };
8078
8172
  }
8079
8173
  return parsePolishToken(tokenStream, parseState);
8080
8174
  }
@@ -8165,13 +8259,10 @@ var algebraicReservedNamesRecord = {
8165
8259
  'false': { value: false },
8166
8260
  'nil': { value: null },
8167
8261
  'null': { value: null },
8168
- 'def': { value: null, forbidden: true },
8169
- 'defs': { value: null, forbidden: true },
8170
8262
  'if-let': { value: null, forbidden: true },
8171
8263
  'when-let': { value: null, forbidden: true },
8172
8264
  'when-first': { value: null, forbidden: true },
8173
8265
  'fn': { value: null, forbidden: true },
8174
- 'defn': { value: null, forbidden: true },
8175
8266
  'defns': { value: null, forbidden: true },
8176
8267
  'try': { value: null, forbidden: true },
8177
8268
  'recur': { value: null, forbidden: true },
@@ -1,3 +1,7 @@
1
+ import type { DefNode } from '../builtin/specialExpressions/def';
2
+ import type { DefnNode } from '../builtin/specialExpressions/functions';
3
+ import type { Arity, FunctionArguments } from '../builtin/utils';
4
+ import type { A_SymbolToken } from '../tokenizer/algebraic/algebraicTokens';
1
5
  import type { TokenStream } from '../tokenizer/interface';
2
6
  import type { AstNode, ParseState } from './interface';
3
7
  export declare class AlgebraicParser {
@@ -5,7 +9,7 @@ export declare class AlgebraicParser {
5
9
  private parseState;
6
10
  constructor(tokenStream: TokenStream, parseState: ParseState);
7
11
  private advance;
8
- parse(): AstNode;
12
+ parse(): AstNode[];
9
13
  private parseExpression;
10
14
  private parseOperand;
11
15
  private parseOperandPart;
@@ -13,11 +17,17 @@ export declare class AlgebraicParser {
13
17
  private parseArray;
14
18
  private parseFunctionCall;
15
19
  parseLambdaFunction(): AstNode | null;
20
+ parseFunctionArguments(): {
21
+ functionArguments: FunctionArguments;
22
+ arity: Arity;
23
+ };
16
24
  private parseShorthandLamdaFunction;
17
25
  private parseLet;
18
26
  private parseFor;
19
27
  private parseForLoopBinding;
20
28
  private parseBinding;
29
+ parseDef(token: A_SymbolToken): DefNode;
30
+ parseDefn(token: A_SymbolToken): DefnNode;
21
31
  private isAtEnd;
22
32
  private peek;
23
33
  private peekAhead;
@@ -7,7 +7,7 @@ export declare const algebraicValueTokenTypes: readonly ["String", "A_Whitespace
7
7
  export declare const algebraicTokenTypes: readonly ["LBrace", "LBracket", "LParen", "RBrace", "RBracket", "RParen", "AlgNotation", "PolNotation", "EndNotation", "String", "A_Whitespace", "A_Operator", "A_Symbol", "A_ReservedSymbol", "A_SingleLineComment", "A_MultiLineComment", "A_Number", "A_BasePrefixedNumber"];
8
8
  declare const symbolicUnaryOperators: readonly ["!", "~", "+", "-"];
9
9
  declare const symbolicBinaryOperators: readonly ["**", "*", "/", "%", "+", "-", "<<", ">>", ">>>", "++", "<", "<=", ">", ">=", "==", "!=", "&", "^", "|", "&&", "||", "??"];
10
- declare const symbolicOperators: readonly ["!", "~", "+", "-", "**", "*", "/", "%", "+", "-", "<<", ">>", ">>>", "++", "<", "<=", ">", ">=", "==", "!=", "&", "^", "|", "&&", "||", "??", "=>", "...", ".", ",", "="];
10
+ declare const symbolicOperators: readonly ["!", "~", "+", "-", "**", "*", "/", "%", "+", "-", "<<", ">>", ">>>", "++", "<", "<=", ">", ">=", "==", "!=", "&", "^", "|", "&&", "||", "??", "=>", "...", ".", ",", "=", ";"];
11
11
  export declare function isFunctionOperator(operator: string): boolean;
12
12
  export type SymbolicUnaryOperator = typeof symbolicUnaryOperators[number];
13
13
  export type SymbolicBinaryOperator = typeof symbolicBinaryOperators[number];
package/dist/index.esm.js CHANGED
@@ -408,6 +408,7 @@ var otherSymbolicOperators = [
408
408
  '.', // property accessor
409
409
  ',', // item separator
410
410
  '=', // property assignment
411
+ ';', // statement terminator
411
412
  ];
412
413
  var symbolicOperators = __spreadArray(__spreadArray(__spreadArray([], __read(symbolicUnaryOperators), false), __read(symbolicBinaryOperators), false), __read(otherSymbolicOperators), false);
413
414
  var nonFunctionOperators = [
@@ -3117,7 +3118,7 @@ var mathNormalExpression = {
3117
3118
  },
3118
3119
  };
3119
3120
 
3120
- var version = "2.0.13";
3121
+ var version = "2.0.14";
3121
3122
 
3122
3123
  var uuidTemplate = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
3123
3124
  var xyRegexp = /[xy]/g;
@@ -7148,6 +7149,7 @@ function fromBinaryOperatorToAstNode(operator, left, right, token) {
7148
7149
  token: getTokenDebugData(token) && token,
7149
7150
  };
7150
7151
  /* v8 ignore next 8 */
7152
+ case ';':
7151
7153
  case '!':
7152
7154
  case '~':
7153
7155
  case '=':
@@ -7168,14 +7170,33 @@ var AlgebraicParser = /** @class */ (function () {
7168
7170
  this.parseState.position += 1;
7169
7171
  };
7170
7172
  AlgebraicParser.prototype.parse = function () {
7171
- return this.parseExpression();
7173
+ var nodes = [];
7174
+ while (!this.isAtEnd()) {
7175
+ nodes.push(this.parseExpression());
7176
+ if (!isA_OperatorToken(this.peek(), ';')) {
7177
+ break;
7178
+ }
7179
+ this.advance();
7180
+ }
7181
+ return nodes;
7172
7182
  };
7173
7183
  AlgebraicParser.prototype.parseExpression = function (precedence) {
7174
7184
  var _a;
7175
7185
  if (precedence === void 0) { precedence = 0; }
7186
+ var firstToken = this.peek();
7187
+ if (isA_SymbolToken(firstToken) && firstToken[1] === 'def') {
7188
+ return this.parseDef(firstToken);
7189
+ }
7190
+ if (isA_SymbolToken(firstToken) && firstToken[1] === 'defn') {
7191
+ return this.parseDefn(firstToken);
7192
+ }
7176
7193
  var left = this.parseOperand();
7177
- while (!this.isAtEnd() && !isA_OperatorToken(this.peek(), ',') && !isRBracketToken(this.peek()) && !isRParenToken(this.peek())) {
7178
- var operator = this.peek();
7194
+ var operator = this.peek();
7195
+ while (!this.isAtEnd()
7196
+ && !isA_OperatorToken(operator, ',')
7197
+ && !isA_OperatorToken(operator, ';')
7198
+ && !isRBracketToken(operator)
7199
+ && !isRParenToken(operator)) {
7179
7200
  if (isA_BinaryOperatorToken(operator)) {
7180
7201
  var name_1 = operator[1];
7181
7202
  var newPrecedece = getPrecedence(name_1);
@@ -7205,6 +7226,7 @@ var AlgebraicParser = /** @class */ (function () {
7205
7226
  else {
7206
7227
  break;
7207
7228
  }
7229
+ operator = this.peek();
7208
7230
  }
7209
7231
  if (!left) {
7210
7232
  throw new LitsError('Expected operand', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
@@ -7451,13 +7473,11 @@ var AlgebraicParser = /** @class */ (function () {
7451
7473
  }
7452
7474
  case 'let':
7453
7475
  return this.parseLet(symbol, params);
7454
- case 'def':
7455
7476
  case 'defs':
7456
7477
  case 'if-let':
7457
7478
  case 'when-let':
7458
7479
  case 'when-first':
7459
7480
  case 'fn':
7460
- case 'defn':
7461
7481
  case 'defns':
7462
7482
  case 'try':
7463
7483
  case 'recur':
@@ -7480,8 +7500,32 @@ var AlgebraicParser = /** @class */ (function () {
7480
7500
  }
7481
7501
  };
7482
7502
  AlgebraicParser.prototype.parseLambdaFunction = function () {
7483
- var _a, _b;
7484
7503
  var firstToken = this.peek();
7504
+ try {
7505
+ var _a = this.parseFunctionArguments(), functionArguments = _a.functionArguments, arity = _a.arity;
7506
+ if (!isA_OperatorToken(this.peek(), '=>')) {
7507
+ return null;
7508
+ }
7509
+ this.advance();
7510
+ var body = this.parseExpression();
7511
+ return {
7512
+ t: AstNodeType.SpecialExpression,
7513
+ n: 'fn',
7514
+ p: [],
7515
+ o: [{
7516
+ as: functionArguments,
7517
+ b: [body],
7518
+ a: arity,
7519
+ }],
7520
+ token: getTokenDebugData(firstToken) && firstToken,
7521
+ };
7522
+ }
7523
+ catch (_b) {
7524
+ return null;
7525
+ }
7526
+ };
7527
+ AlgebraicParser.prototype.parseFunctionArguments = function () {
7528
+ var _a, _b, _c, _d, _e;
7485
7529
  this.advance();
7486
7530
  var rest = false;
7487
7531
  var letBindingObject;
@@ -7504,7 +7548,7 @@ var AlgebraicParser = /** @class */ (function () {
7504
7548
  }
7505
7549
  var symbolToken = this.peek();
7506
7550
  if (!isA_SymbolToken(symbolToken)) {
7507
- return null;
7551
+ throw new LitsError('Expected symbol', (_c = getTokenDebugData(this.peek())) === null || _c === void 0 ? void 0 : _c.sourceCodeInfo);
7508
7552
  }
7509
7553
  if (rest) {
7510
7554
  restArg = symbolToken[1];
@@ -7515,47 +7559,36 @@ var AlgebraicParser = /** @class */ (function () {
7515
7559
  this.advance();
7516
7560
  }
7517
7561
  if (!isA_OperatorToken(this.peek(), ',') && !isRParenToken(this.peek())) {
7518
- return null;
7562
+ throw new LitsError('Expected comma or closing parenthesis', (_d = getTokenDebugData(this.peek())) === null || _d === void 0 ? void 0 : _d.sourceCodeInfo);
7519
7563
  }
7520
7564
  if (isA_OperatorToken(this.peek(), ',')) {
7521
7565
  this.advance();
7522
7566
  }
7523
7567
  }
7568
+ var arity = restArg !== undefined ? { min: args.length } : args.length;
7524
7569
  if (!isRParenToken(this.peek())) {
7525
- return null;
7526
- }
7527
- this.advance();
7528
- if (!isA_OperatorToken(this.peek(), '=>')) {
7529
- return null;
7570
+ throw new LitsError('Expected closing parenthesis', (_e = getTokenDebugData(this.peek())) === null || _e === void 0 ? void 0 : _e.sourceCodeInfo);
7530
7571
  }
7531
- this.advance();
7532
7572
  var letBindings = letBindingObject ? arrayToPairs(letBindingObject.p) : [];
7533
- var body = this.parseExpression();
7534
- var arity = restArg !== undefined ? { min: args.length } : args.length;
7573
+ var functionArguments = {
7574
+ m: args,
7575
+ r: restArg,
7576
+ b: letBindings.map(function (pair) {
7577
+ var key = pair[0];
7578
+ var value = pair[1];
7579
+ return {
7580
+ t: AstNodeType.Binding,
7581
+ n: key.v,
7582
+ v: value,
7583
+ p: [],
7584
+ token: getTokenDebugData(key.token) && key.token,
7585
+ };
7586
+ }),
7587
+ };
7588
+ this.advance();
7535
7589
  return {
7536
- t: AstNodeType.SpecialExpression,
7537
- n: 'fn',
7538
- p: [],
7539
- o: [{
7540
- as: {
7541
- m: args,
7542
- r: restArg,
7543
- b: letBindings.map(function (pair) {
7544
- var key = pair[0];
7545
- var value = pair[1];
7546
- return {
7547
- t: AstNodeType.Binding,
7548
- n: key.v,
7549
- v: value,
7550
- p: [],
7551
- token: getTokenDebugData(key.token) && key.token,
7552
- };
7553
- }),
7554
- },
7555
- b: [body],
7556
- a: arity,
7557
- }],
7558
- token: getTokenDebugData(firstToken) && firstToken,
7590
+ functionArguments: functionArguments,
7591
+ arity: arity,
7559
7592
  };
7560
7593
  };
7561
7594
  AlgebraicParser.prototype.parseShorthandLamdaFunction = function () {
@@ -7747,6 +7780,50 @@ var AlgebraicParser = /** @class */ (function () {
7747
7780
  };
7748
7781
  return node;
7749
7782
  };
7783
+ AlgebraicParser.prototype.parseDef = function (token) {
7784
+ this.advance();
7785
+ var symbol = parseSymbol(this.tokenStream, this.parseState);
7786
+ assertA_OperatorToken(this.peek(), '=');
7787
+ this.advance();
7788
+ var value = this.parseExpression();
7789
+ return {
7790
+ t: AstNodeType.SpecialExpression,
7791
+ n: 'def',
7792
+ p: [symbol, value],
7793
+ token: getTokenDebugData(token) && token,
7794
+ };
7795
+ };
7796
+ AlgebraicParser.prototype.parseDefn = function (token) {
7797
+ var _a;
7798
+ this.advance();
7799
+ var symbol = parseSymbol(this.tokenStream, this.parseState);
7800
+ var _b = this.parseFunctionArguments(), functionArguments = _b.functionArguments, arity = _b.arity;
7801
+ assertLBraceToken(this.peek());
7802
+ this.advance();
7803
+ var body = [];
7804
+ while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
7805
+ body.push(this.parseExpression());
7806
+ if (isA_OperatorToken(this.peek(), ';')) {
7807
+ this.advance();
7808
+ }
7809
+ }
7810
+ if (!isRBraceToken(this.peek())) {
7811
+ throw new LitsError('Expected closing brace', (_a = getTokenDebugData(this.peek())) === null || _a === void 0 ? void 0 : _a.sourceCodeInfo);
7812
+ }
7813
+ this.advance();
7814
+ return {
7815
+ t: AstNodeType.SpecialExpression,
7816
+ n: 'defn',
7817
+ f: symbol,
7818
+ p: [],
7819
+ o: [{
7820
+ as: functionArguments,
7821
+ b: body,
7822
+ a: arity,
7823
+ }],
7824
+ token: getTokenDebugData(token) && token,
7825
+ };
7826
+ };
7750
7827
  AlgebraicParser.prototype.isAtEnd = function () {
7751
7828
  return this.parseState.position >= this.tokenStream.tokens.length;
7752
7829
  };
@@ -8036,10 +8113,18 @@ function parsePolishToken(tokenStream, parseState) {
8036
8113
  parseState.position += 1;
8037
8114
  parseState.algebraic = true;
8038
8115
  var algebraicParser = new AlgebraicParser(tokenStream, parseState);
8039
- var node = algebraicParser.parse();
8116
+ var nodes = algebraicParser.parse();
8040
8117
  assertEndNotationToken(tokenStream.tokens[parseState.position++]);
8041
8118
  parseState.algebraic = false;
8042
- return node;
8119
+ if (nodes.length === 1) {
8120
+ return nodes[0];
8121
+ }
8122
+ return {
8123
+ t: AstNodeType.SpecialExpression,
8124
+ n: 'do',
8125
+ p: nodes,
8126
+ token: nodes[0].token,
8127
+ };
8043
8128
  }
8044
8129
  case 'PolNotation': {
8045
8130
  var astNodes = [];
@@ -8106,7 +8191,16 @@ function removeUnnecessaryTokens(tokenStream) {
8106
8191
  function parseToken(tokenStream, parseState) {
8107
8192
  if (parseState.algebraic) {
8108
8193
  var algebraicParser = new AlgebraicParser(tokenStream, parseState);
8109
- return algebraicParser.parse();
8194
+ var nodes = algebraicParser.parse();
8195
+ if (nodes.length === 1) {
8196
+ return nodes[0];
8197
+ }
8198
+ return {
8199
+ t: AstNodeType.SpecialExpression,
8200
+ n: 'do',
8201
+ p: nodes,
8202
+ token: nodes[0].token,
8203
+ };
8110
8204
  }
8111
8205
  return parsePolishToken(tokenStream, parseState);
8112
8206
  }
@@ -8197,13 +8291,10 @@ var algebraicReservedNamesRecord = {
8197
8291
  'false': { value: false },
8198
8292
  'nil': { value: null },
8199
8293
  'null': { value: null },
8200
- 'def': { value: null, forbidden: true },
8201
- 'defs': { value: null, forbidden: true },
8202
8294
  'if-let': { value: null, forbidden: true },
8203
8295
  'when-let': { value: null, forbidden: true },
8204
8296
  'when-first': { value: null, forbidden: true },
8205
8297
  'fn': { value: null, forbidden: true },
8206
- 'defn': { value: null, forbidden: true },
8207
8298
  'defns': { value: null, forbidden: true },
8208
8299
  'try': { value: null, forbidden: true },
8209
8300
  'recur': { value: null, forbidden: true },