From c18f86b1f7759f93334fa19ab14815f56f8b53b5 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 08:26:07 -0700 Subject: [PATCH 1/9] ok --- fjs/edag/todo/a1.md | 123 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 fjs/edag/todo/a1.md diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md new file mode 100644 index 000000000..36cfdce48 --- /dev/null +++ b/fjs/edag/todo/a1.md @@ -0,0 +1,123 @@ +```ts +a.b +['.', a, b, []] + + a.b(...c) + ['.', a, b, [['()', c]]] + + a.b?.(...c) + ['.', a, b, [['?.()', c]]] + + a.b?.(...c).d + ['.', a, b, [['?.()', c], ['.', d]]] + +a?.b +['?.', a, b, []] + +a?.(b) +['?.()', a, b, []] + +a(...b) +['()', a, [], b] + + a(b) + ['()', a, [], b] + + a.b(...c) // duplicate, prefer ['.', a, b, [['()', c]]] + ['()', a, [['.', b]], c] + + (a?.b.c)(...d) + ['()', a, [['?.', b], ['.', c]], d] +``` + +## With Requirements + +- Prefer to start with the first operator +- No empty lambdas +- Prefer suffix lambdas + +Not decided: a symbol for lambda (additional chained operations). Currently, we use `|` but `|` means "bitwise-or" in JavaScript. The pipeline proposal uses `|>` but if we combine it with other operator, like `.`, it could be confusing `.|>`. Some languages use `\` for lambda, and `|>` for pipeline. Because we combine operator we may use a symbol that is not used by the language as an operator. We don't want to use `\` because it's an escape symbol. Candidates `@`, `#`. `#` is used for private members. Another option is `_`, which is usually means a placeholder. + +### Option 1. + +```ts +type Call = ['()', Exp, Exp] + +type Dot = ['.', Exp, Index] +type OptionDot = ['?.', Exp, Index] +type OptionCall = ['?.()', Exp, Exp] + +type DotPipe = ['.|', Exp, Index, Lambda] // lambda starts with either `()` or `?.()` +type OptionDotPipe = ['?.|', Exp, Index, Lambda] +type OptionCallPipe = ['?.()|', Exp, Exp, Lambda] + +type PipeCall = ['|()', Exp, Lambda, Exp] +``` + +## Examples + +```ts +// a(b) +const call0: Dot = ['.', a, b] + +// a.b(c) +const dotPipe0: DotPipe = ['.|', a, b, [['()', c]]] +// a.b.?(c) +const dotPipe1: DotPipe = ['.|', a, b, [['?.', c]]] +// a.b.?(c).d +const dotPipe2: DotPipe = ['.|', a, b, [['?.', c], ['.', d]]] + +type Dot = ['.', a, b] +type OptionDot = ['?.', a, b] +type OptionCall = ['?.()', a, b] + +type DotPipe = ['.|', a, b, lambda] +type OptionDotPipe = ['?.|', a, b, lambda] +type OptionCallPipe = ['?.()|', a, b, lambda] + +type PipeCall = ['|()', a, lambda, b] +``` + +## Option 2. + +The same non-lambda expressions and only few lambda operations. + +```ts +type Dot = ['.', Exp, Index] +type Call = ['()', Exp, Exp] +type OptionDot = ['?.', Exp, Index] +type OptionCall = ['?.()', Exp, Exp] + +type OptionLambda = ['_', Exp, Lambda] // at least two lambdas, at least one option lambda +type CallLambda = ['_()', Exp, Lambda, Exp] // at least one lambda +``` + +Every lambda expression is always a chain of at least two non-lambda expressions. + +### Examples + +```ts +// a.b +const dot = ['.', a, b] +// a(...b) +const call = ['()', a, b] +// a?.b +const optionDot = ['?.', a, b] +// a?.(...b) +const optionCall = ['?.()', a, b] + +// a.b(...c) +// (a.b)(...c) +const callLambda0 = ['_()', a, [['.', b]], c] +// (a?.b)(...c) +const callLambda1 = ['_()', a, [['?.', b]], c] +// (a.b?.c)(...d) +const callLambda2 = ['_()', a, [['.', b], ['?.', c]], d] + +// a?.b(...c) +const optionLambda0 = ['_', a, [['?.', b], ['()', c]]] +// a.b?.(...c) +const optionLambda1 = ['_', a, [['.', b], ['?.()', c]]] +// a.b?.(...c).d +const optionLambda2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] +``` From c39bec2da0e562d32a262aa0b42c0cffcbe1b387 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 08:31:00 -0700 Subject: [PATCH 2/9] ok --- fjs/edag/todo/a1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index 36cfdce48..6402af770 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -88,8 +88,8 @@ type Call = ['()', Exp, Exp] type OptionDot = ['?.', Exp, Index] type OptionCall = ['?.()', Exp, Exp] -type OptionLambda = ['_', Exp, Lambda] // at least two lambdas, at least one option lambda -type CallLambda = ['_()', Exp, Lambda, Exp] // at least one lambda +type LambdaExp = ['_', Exp, Lambda] // at least two lambdas, at least one option lambda +type LambdaCallExp = ['_()', Exp, Lambda, Exp] // at least one lambda ``` Every lambda expression is always a chain of at least two non-lambda expressions. From 140501ad56511ed33520f61458b9b465d7e2ffed Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 08:43:38 -0700 Subject: [PATCH 3/9] a1 --- fjs/edag/todo/a1.md | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index 6402af770..770ce7b65 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -121,3 +121,68 @@ const optionLambda1 = ['_', a, [['.', b], ['?.()', c]]] // a.b?.(...c).d const optionLambda2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] ``` + +Note: while `a.b(c)` can be expressed using LambdaExp, +LambdaCallExp is preferred because it has a final call which +doesn't allow addition lambdas like `a.b(...c)?.d`. +`a.b(...c)?.d` should be expressed as two expressions: + +```ts +['?.', ['_()', a, [['.', b]], c], d] +``` + +## Option 3 + +The same non-lambda expressions and only few lambda operations. + +```ts +type Dot = ['.', Exp, Index] +type Call = ['()', Exp, Exp] + +type DotCall = ['.()', Exp, Index, Exp] + +type OptionDot = ['?.', Exp, Index] +type OptionCall = ['?.()', Exp, Exp] + +type LambdaExp = ['_', Exp, Lambda] // at least two lambdas, at least one option lambda +type LambdaCallExp = ['_()', Exp, Lambda, Exp] // at least one lambda, +``` + +Every lambda expression is always a chain of at least two non-lambda expressions. + +### Examples + +```ts +// a.b +const dot = ['.', a, b] +// a(...b) +const call = ['()', a, b] +// a?.b +const optionDot = ['?.', a, b] +// a?.(...b) +const optionCall = ['?.()', a, b] + +// a.b(...c) +// (a.b)(...c) +const callLambda0 = ['_()', a, [['.', b]], c] +// (a?.b)(...c) +const callLambda1 = ['_()', a, [['?.', b]], c] +// (a.b?.c)(...d) +const callLambda2 = ['_()', a, [['.', b], ['?.', c]], d] + +// a?.b(...c) +const optionLambda0 = ['_', a, [['?.', b], ['()', c]]] +// a.b?.(...c) +const optionLambda1 = ['_', a, [['.', b], ['?.()', c]]] +// a.b?.(...c).d +const optionLambda2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] +``` + +Note: while `a.b(c)` can be expressed using LambdaExp, +LambdaCallExp is preferred because it has a final call which +doesn't allow addition lambdas like `a.b(...c)?.d`. +`a.b(...c)?.d` should be expressed as two expressions: + +```ts +['?.', ['_()', a, [['.', b]], c], d] +``` From 729cb5bd5e7e78e94522a4a634b363ffc4c09b62 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 08:51:42 -0700 Subject: [PATCH 4/9] ok --- fjs/edag/todo/a1.md | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index 770ce7b65..01aba6d98 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -133,22 +133,22 @@ doesn't allow addition lambdas like `a.b(...c)?.d`. ## Option 3 -The same non-lambda expressions and only few lambda operations. +Several simple expressions. One `a.b(...c)` expression. And lambda expression which is used only with option `?.*` operator. ```ts type Dot = ['.', Exp, Index] type Call = ['()', Exp, Exp] -type DotCall = ['.()', Exp, Index, Exp] - type OptionDot = ['?.', Exp, Index] type OptionCall = ['?.()', Exp, Exp] -type LambdaExp = ['_', Exp, Lambda] // at least two lambdas, at least one option lambda -type LambdaCallExp = ['_()', Exp, Lambda, Exp] // at least one lambda, -``` +type DotCall = ['.()', Exp, Index, Exp] -Every lambda expression is always a chain of at least two non-lambda expressions. +// at least two lambdas, at least one option lambda +type OptionChain = ['_', Exp, Lambda] +// at least one lambda, at least one option lambda +type OptionChainCall = ['_()', Exp, Lambda, Exp] +``` ### Examples @@ -164,25 +164,17 @@ const optionCall = ['?.()', a, b] // a.b(...c) // (a.b)(...c) -const callLambda0 = ['_()', a, [['.', b]], c] -// (a?.b)(...c) -const callLambda1 = ['_()', a, [['?.', b]], c] -// (a.b?.c)(...d) -const callLambda2 = ['_()', a, [['.', b], ['?.', c]], d] +const dotCall = ['.()', a, b, c] // a?.b(...c) -const optionLambda0 = ['_', a, [['?.', b], ['()', c]]] +const optionChain0 = ['_', a, [['?.', b], ['()', c]]] // a.b?.(...c) -const optionLambda1 = ['_', a, [['.', b], ['?.()', c]]] +const optionChain1 = ['_', a, [['.', b], ['?.()', c]]] // a.b?.(...c).d -const optionLambda2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] -``` +const optionChain2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] -Note: while `a.b(c)` can be expressed using LambdaExp, -LambdaCallExp is preferred because it has a final call which -doesn't allow addition lambdas like `a.b(...c)?.d`. -`a.b(...c)?.d` should be expressed as two expressions: - -```ts -['?.', ['_()', a, [['.', b]], c], d] +// (a?.b)(...c) +const callChain1 = ['_()', a, [['?.', b]], c] +// (a.b?.c)(...d) +const callChain2 = ['_()', a, [['.', b], ['?.', c]], d] ``` From c7594005b80a5b4488368c8d64324b831a453516 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 09:13:42 -0700 Subject: [PATCH 5/9] ok --- fjs/edag/todo/a1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index 01aba6d98..6695d77a2 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -174,7 +174,7 @@ const optionChain1 = ['_', a, [['.', b], ['?.()', c]]] const optionChain2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] // (a?.b)(...c) -const callChain1 = ['_()', a, [['?.', b]], c] +const optionChainCall1 = ['_()', a, [['?.', b]], c] // (a.b?.c)(...d) -const callChain2 = ['_()', a, [['.', b], ['?.', c]], d] +const optionChainCall2 = ['_()', a, [['.', b], ['?.', c]], d] ``` From e6a59286060558efba8830b5d97dd339d3317858 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 14:45:03 -0700 Subject: [PATCH 6/9] ok --- fjs/edag/todo/a1.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index 6695d77a2..b46e11d97 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -178,3 +178,27 @@ const optionChainCall1 = ['_()', a, [['?.', b]], c] // (a.b?.c)(...d) const optionChainCall2 = ['_()', a, [['.', b], ['?.', c]], d] ``` + +```ts +type PropertyLambdaFunc = (_: Property) => Value + +type ValueLambdaFunc = (_: Value) => Value + +// a.bc +type Dot = ['.', Exp, Exp, PropertyLambda] + +// a?.bc +type optionDot = ['.', Exp, Exp, PropertyLambda] + +// a?(b)c +type optionCall = ['.', Exp, Exp, ValueLambda] + +type ValueLambda = + | ['.', Exp, PropertyLambda] + | ['?.', Exp, PropertyLambda] + +type PropertyLambda = + | ['()', Exp] + | ['?.()', ValueLambda] + +``` From 01cca5bc51311852fea24a5fcbf1c6e54ad6da9f Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 15:18:33 -0700 Subject: [PATCH 7/9] ok --- fjs/edag/todo/a1.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index b46e11d97..4864cb3e7 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -200,5 +200,31 @@ type ValueLambda = type PropertyLambda = | ['()', Exp] | ['?.()', ValueLambda] +``` + +```ts +// a(b) +type Call = ['()', Exp, Exp] + +// a.bc +type Dot = ['.', Exp, Exp, PropertyLambda] + +// a?.bc +type OptionDot = ['?.', Exp, Exp, SkipPropertyLambda] + +// a?(b)c +type OptionCall = ['?.()', Exp, Exp, SkipValueLambda] + +type PropertyLambda = + | ['()', Exp] + | ['?.()', Exp, SkipValueLambda] + +type SkipValueLambda = + | ['()', Exp, SkipValueLambda] + | ['.', Exp, SkipPropertyLambda] +type SkipPropertyLambda = + | ['()', Exp, SkipValueLambda] + | ['.', Exp, SkipPropertyLambda] + | ['?.()', Exp, SkipValueLambda] ``` From 3d2fb15090f0595b707628e6daac156fb7be5a00 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 15:59:08 -0700 Subject: [PATCH 8/9] ok --- fjs/edag/todo/a1.md | 232 +++----------------------------------------- 1 file changed, 16 insertions(+), 216 deletions(-) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index 4864cb3e7..2cae156f7 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -1,230 +1,30 @@ -```ts -a.b -['.', a, b, []] - - a.b(...c) - ['.', a, b, [['()', c]]] - - a.b?.(...c) - ['.', a, b, [['?.()', c]]] - - a.b?.(...c).d - ['.', a, b, [['?.()', c], ['.', d]]] - -a?.b -['?.', a, b, []] - -a?.(b) -['?.()', a, b, []] - -a(...b) -['()', a, [], b] - - a(b) - ['()', a, [], b] - - a.b(...c) // duplicate, prefer ['.', a, b, [['()', c]]] - ['()', a, [['.', b]], c] - - (a?.b.c)(...d) - ['()', a, [['?.', b], ['.', c]], d] -``` - -## With Requirements - -- Prefer to start with the first operator -- No empty lambdas -- Prefer suffix lambdas - -Not decided: a symbol for lambda (additional chained operations). Currently, we use `|` but `|` means "bitwise-or" in JavaScript. The pipeline proposal uses `|>` but if we combine it with other operator, like `.`, it could be confusing `.|>`. Some languages use `\` for lambda, and `|>` for pipeline. Because we combine operator we may use a symbol that is not used by the language as an operator. We don't want to use `\` because it's an escape symbol. Candidates `@`, `#`. `#` is used for private members. Another option is `_`, which is usually means a placeholder. - -### Option 1. - -```ts -type Call = ['()', Exp, Exp] - -type Dot = ['.', Exp, Index] -type OptionDot = ['?.', Exp, Index] -type OptionCall = ['?.()', Exp, Exp] - -type DotPipe = ['.|', Exp, Index, Lambda] // lambda starts with either `()` or `?.()` -type OptionDotPipe = ['?.|', Exp, Index, Lambda] -type OptionCallPipe = ['?.()|', Exp, Exp, Lambda] - -type PipeCall = ['|()', Exp, Lambda, Exp] -``` - -## Examples - ```ts // a(b) -const call0: Dot = ['.', a, b] - -// a.b(c) -const dotPipe0: DotPipe = ['.|', a, b, [['()', c]]] -// a.b.?(c) -const dotPipe1: DotPipe = ['.|', a, b, [['?.', c]]] -// a.b.?(c).d -const dotPipe2: DotPipe = ['.|', a, b, [['?.', c], ['.', d]]] - -type Dot = ['.', a, b] -type OptionDot = ['?.', a, b] -type OptionCall = ['?.()', a, b] - -type DotPipe = ['.|', a, b, lambda] -type OptionDotPipe = ['?.|', a, b, lambda] -type OptionCallPipe = ['?.()|', a, b, lambda] - -type PipeCall = ['|()', a, lambda, b] -``` - -## Option 2. - -The same non-lambda expressions and only few lambda operations. - -```ts -type Dot = ['.', Exp, Index] type Call = ['()', Exp, Exp] -type OptionDot = ['?.', Exp, Index] -type OptionCall = ['?.()', Exp, Exp] - -type LambdaExp = ['_', Exp, Lambda] // at least two lambdas, at least one option lambda -type LambdaCallExp = ['_()', Exp, Lambda, Exp] // at least one lambda -``` - -Every lambda expression is always a chain of at least two non-lambda expressions. - -### Examples - -```ts -// a.b -const dot = ['.', a, b] -// a(...b) -const call = ['()', a, b] -// a?.b -const optionDot = ['?.', a, b] -// a?.(...b) -const optionCall = ['?.()', a, b] - -// a.b(...c) -// (a.b)(...c) -const callLambda0 = ['_()', a, [['.', b]], c] -// (a?.b)(...c) -const callLambda1 = ['_()', a, [['?.', b]], c] -// (a.b?.c)(...d) -const callLambda2 = ['_()', a, [['.', b], ['?.', c]], d] - -// a?.b(...c) -const optionLambda0 = ['_', a, [['?.', b], ['()', c]]] -// a.b?.(...c) -const optionLambda1 = ['_', a, [['.', b], ['?.()', c]]] -// a.b?.(...c).d -const optionLambda2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] -``` - -Note: while `a.b(c)` can be expressed using LambdaExp, -LambdaCallExp is preferred because it has a final call which -doesn't allow addition lambdas like `a.b(...c)?.d`. -`a.b(...c)?.d` should be expressed as two expressions: - -```ts -['?.', ['_()', a, [['.', b]], c], d] -``` - -## Option 3 - -Several simple expressions. One `a.b(...c)` expression. And lambda expression which is used only with option `?.*` operator. - -```ts -type Dot = ['.', Exp, Index] -type Call = ['()', Exp, Exp] - -type OptionDot = ['?.', Exp, Index] -type OptionCall = ['?.()', Exp, Exp] - -type DotCall = ['.()', Exp, Index, Exp] - -// at least two lambdas, at least one option lambda -type OptionChain = ['_', Exp, Lambda] -// at least one lambda, at least one option lambda -type OptionChainCall = ['_()', Exp, Lambda, Exp] -``` - -### Examples - -```ts -// a.b -const dot = ['.', a, b] -// a(...b) -const call = ['()', a, b] -// a?.b -const optionDot = ['?.', a, b] -// a?.(...b) -const optionCall = ['?.()', a, b] - -// a.b(...c) -// (a.b)(...c) -const dotCall = ['.()', a, b, c] - -// a?.b(...c) -const optionChain0 = ['_', a, [['?.', b], ['()', c]]] -// a.b?.(...c) -const optionChain1 = ['_', a, [['.', b], ['?.()', c]]] -// a.b?.(...c).d -const optionChain2 = ['_', a, [['.', b], ['?.()', c], ['.', d]]] - -// (a?.b)(...c) -const optionChainCall1 = ['_()', a, [['?.', b]], c] -// (a.b?.c)(...d) -const optionChainCall2 = ['_()', a, [['.', b], ['?.', c]], d] -``` - -```ts -type PropertyLambdaFunc = (_: Property) => Value - -type ValueLambdaFunc = (_: Value) => Value // a.bc type Dot = ['.', Exp, Exp, PropertyLambda] // a?.bc -type optionDot = ['.', Exp, Exp, PropertyLambda] - -// a?(b)c -type optionCall = ['.', Exp, Exp, ValueLambda] - -type ValueLambda = - | ['.', Exp, PropertyLambda] - | ['?.', Exp, PropertyLambda] - -type PropertyLambda = - | ['()', Exp] - | ['?.()', ValueLambda] -``` - -```ts -// a(b) -type Call = ['()', Exp, Exp] - -// a.bc -type Dot = ['.', Exp, Exp, PropertyLambda] - -// a?.bc -type OptionDot = ['?.', Exp, Exp, SkipPropertyLambda] +type OptionDot = ['?.', Exp, Exp, OptionPropertyLambda] // a?(b)c -type OptionCall = ['?.()', Exp, Exp, SkipValueLambda] +type OptionCall = ['?.()', Exp, Exp, OptionLambda] type PropertyLambda = + | null | ['()', Exp] - | ['?.()', Exp, SkipValueLambda] - -type SkipValueLambda = - | ['()', Exp, SkipValueLambda] - | ['.', Exp, SkipPropertyLambda] - -type SkipPropertyLambda = - | ['()', Exp, SkipValueLambda] - | ['.', Exp, SkipPropertyLambda] - | ['?.()', Exp, SkipValueLambda] + | ['?.()', Exp, OptionLambda] + +type OptionLambda = + | null + | ['()', Exp, OptionLambda] + | ['.', Exp, OptionPropertyLambda] + +type OptionPropertyLambda = + | null + | ['()', Exp, OptionLambda] + | ['.', Exp, OptionPropertyLambda] + | ['?.()', Exp, OptionLambda] + | ['!()', Exp] ``` From 8483f9cfb330eb349b75d0a52c0f841f051e3e1d Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Tue, 25 Aug 2026 16:10:00 -0700 Subject: [PATCH 9/9] index --- fjs/edag/todo/a1.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fjs/edag/todo/a1.md b/fjs/edag/todo/a1.md index 2cae156f7..379219244 100644 --- a/fjs/edag/todo/a1.md +++ b/fjs/edag/todo/a1.md @@ -3,10 +3,10 @@ type Call = ['()', Exp, Exp] // a.bc -type Dot = ['.', Exp, Exp, PropertyLambda] +type Dot = ['.', Exp, Index, PropertyLambda] // a?.bc -type OptionDot = ['?.', Exp, Exp, OptionPropertyLambda] +type OptionDot = ['?.', Exp, Index, OptionPropertyLambda] // a?(b)c type OptionCall = ['?.()', Exp, Exp, OptionLambda] @@ -19,12 +19,12 @@ type PropertyLambda = type OptionLambda = | null | ['()', Exp, OptionLambda] - | ['.', Exp, OptionPropertyLambda] + | ['.', Index, OptionPropertyLambda] type OptionPropertyLambda = | null | ['()', Exp, OptionLambda] - | ['.', Exp, OptionPropertyLambda] + | ['.', Index, OptionPropertyLambda] | ['?.()', Exp, OptionLambda] | ['!()', Exp] ```