aboutsummaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2021-11-16 21:36:14 -0500
committerMarshall Lochbaum <mwlochbaum@gmail.com>2021-11-16 21:36:14 -0500
commit7ef8161ca78a0b807d13f64cdfbf8679bbc8d6fe (patch)
treea656d7905ed6474bfacef33b366c240e0cc751e4 /spec
parent25311370e215cd12018dde8bd162583dbe36d473 (diff)
Specify monadic modified assignment
Diffstat (limited to 'spec')
-rw-r--r--spec/evaluate.md2
-rw-r--r--spec/grammar.md2
2 files changed, 2 insertions, 2 deletions
diff --git a/spec/evaluate.md b/spec/evaluate.md
index 7ddbb616..a508a895 100644
--- a/spec/evaluate.md
+++ b/spec/evaluate.md
@@ -30,7 +30,7 @@ An *assignment* is one of the four rules containing `ASGN`. It is evaluated by f
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`.
-*Modified assignment* is the subject assignment rule `lhs Derv "↩" subExpr`. In this case, `lhs` should be evaluated as if it were a `subExpr` (the syntax is a subset of `subExpr`), and the result of the function application `lhs Derv subExpr` should be assigned to `lhs`, and is also the result of the modified assignment expression.
+*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.
### Expressions
diff --git a/spec/grammar.md b/spec/grammar.md
index 64c607bf..92d26c1a 100644
--- a/spec/grammar.md
+++ b/spec/grammar.md
@@ -67,7 +67,7 @@ Subject expressions are complicated by the possibility of list and namespace ass
lhs = s | lhsList | lhsStr
subExpr = arg
| lhs ASGN subExpr
- | lhs Derv "↩" subExpr # Modified assignment
+ | lhs Derv "↩" subExpr? # Modified assignment
A header looks like a name for the thing being headed, or its application to inputs (possibly twice in the case of modifiers). As with assignment, it is restricted to a simple form with no extra parentheses. The full list syntax is allowed for arguments. As a special rule, a monadic function header specifically can omit the function when the argument is not just a name (as this would conflict with a subject label). The following cases define only headers with arguments, which are assumed to be special cases; there can be any number of these. Headers without arguments can only refer to the general case—note that operands are not pattern matched—so there can be at most two of these kinds of headers, indicating the monadic and dyadic cases.