From da6694e6cb0755d6a232676808ee96cd5c06ef55 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 29 Nov 2021 21:18:19 -0500 Subject: Remove partial 2-modifier application from the spec and docs --- spec/evaluate.md | 6 ++---- spec/grammar.md | 6 ++---- spec/system.md | 2 -- 3 files changed, 4 insertions(+), 10 deletions(-) (limited to 'spec') diff --git a/spec/evaluate.md b/spec/evaluate.md index a1c4ef43..c991e3c6 100644 --- a/spec/evaluate.md +++ b/spec/evaluate.md @@ -49,12 +49,10 @@ In each case the constituent expressions are evaluated in reverse source order: Modifiers that are evaluated when they receive operands are called *immediate*. Other modifiers, including primitives and some kinds of block, simply record the operands and are called *deferred*. The result of applying a deferred modifier once is called a *derived function*. -The following rules always create *derived operations*, either 1-modifiers or derived functions. A derived operation is identified by the rule that created it, and the values of its parts. +The rules for trains create another kind of derived function. A derived function is identified by the rule that created it, and the values of its parts. | Left | Center | Right | Result |------------|-----------|-----------------------|-------------- -| | `_mod2_` | `( subject \| Func )` | `{š”½ _C_ R}` -| `Operand` | `_mod2_` | | `{L _C_ š”½}` | `Operand` | `Derv` | `Fork` | `{(š•ØLš•©)C(š•ØRš•©)}` | `nothing?` | `Derv` | `Fork` | `{ C(š•ØRš•©)}` -As with applications, all expressions are evaluated in reverse source order before doing anything else. Then a result is formed without calling the center value. Its behavior as a function is described in the rightmost column, using `L`, `C`, and `R` for the results of the expressions in the left, center, and right columns, respectively. For the first two rules (*partial application*), the given operand is bound to the 2-modifier: the result is a 1-modifier that, when called, calls the center 2-modifier with the bound operand on the same side it appeared on and the new operand on the remaining side. A *train* is a function that, when called, calls the right-hand function on all arguments, then the left-hand function, and calls the center function with these results as arguments. +A *train* is a function that, when called, calls the right-hand function on all arguments, then the left-hand function, and calls the center function with these results as arguments. As with applications, all expressions are evaluated in reverse source order before doing anything else. Then a result is formed without calling the center value. Its behavior as a function is described in the rightmost column, using `L`, `C`, and `R` for the results of the expressions in the left, center, and right columns, respectively. diff --git a/spec/grammar.md b/spec/grammar.md index b672243e..dfe7f9c2 100644 --- a/spec/grammar.md +++ b/spec/grammar.md @@ -24,17 +24,15 @@ Here we define the "atomic" forms of functions and modifiers, which are either s list = "⟨" ā‹„? ( ( EXPR ā‹„ )* EXPR ā‹„? )? "⟩" subject = atom | ANY ( "‿" ANY )+ -Starting at the highest-order objects, modifiers have fairly simple syntax. In most cases the syntax for `←` and `↩` is the same, but only `↩` can be used for modified assignment. The export arrow `⇐` can be used in the same ways as `←`, but it can also be used at the beginning of a header to force a namespace result, or with no expression on the right in an `EXPORT` statement. +Starting at the highest-order objects, modifiers have simple syntax. In most cases the syntax for `←` and `↩` is the same, but only `↩` can be used for modified assignment. The export arrow `⇐` can be used in the same ways as `←`, but it can also be used at the beginning of a header to force a namespace result, or with no expression on the right in an `EXPORT` statement. ASGN = "←" | "⇐" | "↩" _m2Expr_ = _mod2_ | _c_ ASGN _m2Expr_ _m1Expr = _mod1 - | _mod2_ ( subject | Func ) # Right partial application - | Operand _mod2_ # Left partial application | _m ASGN _m1Expr -Functions can be formed by fully applying modifiers or as trains. Modifiers are left-associative, so that the left operand (`Operand`) can include modifier applications but the right operand (`subject | Func`) cannot. Trains are right-associative, but bind less tightly than modifiers. Assignment is not allowed in the top level of a train: it must be parenthesized. +Functions can be formed by applying modifiers, or with trains. Modifiers are left-associative, so that the left operand (`Operand`) can include modifier applications but the right operand (`subject | Func`) cannot. Trains are right-associative, but bind less tightly than modifiers. Assignment is not allowed in the top level of a train: it must be parenthesized. Derv = Func | Operand _mod1 diff --git a/spec/system.md b/spec/system.md index 872126c3..6567f341 100644 --- a/spec/system.md +++ b/spec/system.md @@ -198,8 +198,6 @@ Each function in this section is monadic. | 3-train | 3 | `f,g,h` | 1-mod | 4 | `š•—,š•£` | 2-mod | 5 | `š•—,š•£,š•˜` -| Left partial | 6 | `š•—,š•£` -| Right partial | 7 | ` š•£,š•˜` ## Time -- cgit v1.2.3