diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-12-01 21:27:40 -0500 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-12-01 21:33:19 -0500 |
| commit | 972a0543c98aa8cd3c2034725397953413c8776e (patch) | |
| tree | 77c4dba3ce0ccb5efcfbc8f74431b035cfc785d9 /spec | |
| parent | 12b3835d0e06438c0b1f8e3aeac1b2b864206c47 (diff) | |
Specify placeholder assignment to ·
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/evaluate.md | 4 | ||||
| -rw-r--r-- | spec/grammar.md | 4 |
2 files changed, 4 insertions, 4 deletions
diff --git a/spec/evaluate.md b/spec/evaluate.md index fbc97087..c3e82c18 100644 --- a/spec/evaluate.md +++ b/spec/evaluate.md @@ -28,9 +28,9 @@ If there is no left argument, but the `BODY` contains `𝕨` or `𝕎` at the to ### Assignment -An *assignment* is one of the four rules containing `ASGN`. It is evaluated by first evaluating the right-hand-side `subExpr`, `FuncExpr`, `_m1Expr`, or `_m2Exp_` expression, and then storing the result in the left-hand-side identifier or identifiers. The result of the assignment expression is the result of its right-hand side. Except for subjects, only a lone identifier is allowed on the left-hand side and storage sets it equal to the result. For subjects, *destructuring assignment* is performed when an `lhs` is `lhsList` or `lhsStr`. Destructuring assignment is performed recursively by assigning right-hand-side values to the left-hand-side targets, with single-identifier assignment as the base case. +An *assignment* is one of the four rules containing `ASGN`. It is evaluated by first evaluating the right-hand-side `subExpr`, `FuncExpr`, `_m1Expr`, or `_m2Exp_` expression, and then storing the result in the left-hand-side identifier or identifiers. The result of the assignment expression is the result of its right-hand side. Except for subjects, only a lone identifier is allowed on the left-hand side and storage sets it equal to the result. For subjects, *destructuring assignment* is performed when an `lhs` is `lhsList` or `lhsStr`. Destructuring assignment is performed recursively by assigning right-hand-side values to the left-hand-side targets, with single-identifier assignment as the base case. The target `"·"` is also possible in place of a `NAME`, and performs no assignment. -The right-hand-side value, here called `v`, in destructuring assignment must be a list (rank 1 array) or namespace. If it's a list, then each `LHS_ENTRY` node must be an `LHS_ELT`. The left-hand side is treated as a list of `lhs` targets, and matched to `v` element-wise, with an error if the two lists differ in length. If `v` is a namespace, then the left-hand side must be an `lhsStr` where every `LHS_ATOM` is an `LHS_NAME`, or an `lhsList` where every `LHS_ENTRY` is an `LHS_NAME` or `lhs "⇐" LHS_NAME`, so that it can be considered a list of `LHS_NAME` nodes some of which are also associated with `lhs` nodes. To perform the assignment, the value of each name is obtained from the namespace `v`, giving an error if `v` does not define that name. The value is assigned to the `lhs` node if present (which may be a destructuring assignment or simple subject assignment), and otherwise assigned to the same `LHS_NAME` node used to get it from `v`. +The right-hand-side value, here called `v`, in destructuring assignment must be a list (rank 1 array) or namespace. If it's a list, then each `LHS_ENTRY` node must be an `LHS_ELT`. The left-hand side is treated as a list of `lhs` targets, and matched to `v` element-wise, with an error if the two lists differ in length. If `v` is a namespace, then the left-hand side must be an `lhsStr` where every `LHS_ATOM` is an `NAME`, or an `lhsList` where every `LHS_ENTRY` is an `NAME` or `lhs "⇐" NAME`, so that it can be considered a list of `NAME` nodes some of which are also associated with `lhs` nodes. To perform the assignment, the value of each name is obtained from the namespace `v`, giving an error if `v` does not define that name. The value is assigned to the `lhs` node if present (which may be a destructuring assignment or simple subject assignment), and otherwise assigned to the same `NAME` node used to get it from `v`. *Modified assignment* is the subject assignment rule `lhs Derv "↩" subExpr?`. In this case, `lhs` is evaluated as if it were a `subExpr` (the syntax is a subset of `subExpr`), and passed as an argument to `Derv`. The full application is `lhs Derv subExpr`, if `subExpr` is given, and `Derv lhs` otherwise. Its value is assigned to `lhs`, and is also the result of the modified assignment expression. diff --git a/spec/grammar.md b/spec/grammar.md index 7e4ca950..7f9fc198 100644 --- a/spec/grammar.md +++ b/spec/grammar.md @@ -54,13 +54,13 @@ Subject expressions are complicated by the possibility of list and namespace ass nothing = "·" | ( subject | nothing )? Derv nothing NAME = s | F | _m | _c_ - LHS_ANY = NAME | lhsList + LHS_ANY = NAME | "·" | lhsList LHS_ATOM = LHS_ANY | "(" lhsStr ")" LHS_ELT = LHS_ANY | lhsStr LHS_ENTRY= LHS_ELT | lhs "⇐" NAME lhsStr = LHS_ATOM ( "‿" LHS_ATOM )+ lhsList = "⟨" ⋄? ( ( LHS_ENTRY ⋄ )* LHS_ENTRY ⋄? )? "⟩" - lhs = s | lhsList | lhsStr + lhs = s | "·" | lhsList | lhsStr subExpr = arg | lhs ASGN subExpr | lhs Derv "↩" subExpr? # Modified assignment |
