I'm wrapping my head around the details of TCO in the spec. Two parts to
this: 1. Could I ask someone to double-check me on a particular
understanding, and 2. What's the significance of some productions in the
various statement and expression rules being indented and set apart from
others? (A problem I've had reading several parts of the spec. I feel a bit
thick.)
First, the particular: My read of [the definition of
HasCallInTailPosition][1] is that `b` is in the tail position here
(obviously, this is the easiest case):
```js
function a() {
// ...do something...
return b();
}
```
...but not here:
```js
function a() {
// ...do something...
const r = b();
return r;
}
```
I base that on the statement rule:
```
ReturnStatement : returnExpression
1. Return HasCallInTailPosition of Expression with argument call.
```
`r` is an *IdentifierReference* expression, which doesn't have a
tail-position call (obviously, and also I believe in [the expression
rules][3]).
Am I reading that correctly?
Second, the general: What's the significance of the indentation? Some
productions are indented more than others, and I can't see meaning in it.
For example, under [Statement Rules][2], there's (I'll try to replicate it
faithfully here):
```
FunctionStatementList: [empty]
StatementListItem: Declaration
Statement:
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ThrowStatement
DebuggerStatement
Block:{}
ReturnStatement: return;
LabelledItem: FunctionDeclaration
IterationStatement:
for (LeftHandSideExpression of AssignmentExpression) Statement
for (var ForBinding of AssignmentExpression) Statement
for (ForDeclaration of AssignmentExpression) Statement
CaseBlock: {}
1. Return false.
```
Similarly under the expression rules we start off with an
*AssignmentExpression* rule indented, then a bunch of bitwise expression
rules not indented, then several indented ones again, etc., on again off
again, without apparent relationships between them.
Thanks,
-- T.J. Crowder
[1]:
http://www.ecma-international.org/ecma-262/8.0/index.html#sec-static-semantics-hascallintailposition
[2]:
http://www.ecma-international.org/ecma-262/8.0/index.html#sec-statement-rules
[3]:
http://www.ecma-international.org/ecma-262/8.0/index.html#sec-expression-rules
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss