[swift-evolution] [swift-evolution-announce] [Review] SE-0091: Improving operator requirements in protocols
Xiaodi Wu
xiaodi.wu at gmail.com
Wed May 18 00:46:34 CDT 2016
I too have a little trouble with the suggested trampoline syntax:
> static prefix func ++(value: inout Self) -> Self
> static postfix func ++(value: inout Self) -> Self
I agree with Brent that the most appropriate way to write the trampoline
itself would be something more like:
```
static func ++ (prefix value: inout Self) -> Self
```
No particular need to eliminate declaration modifiers altogether quite yet
for the non-trampoline operators. The reasoning is this: a "prefix func" or
a "postfix func" would be used at the call site by actually prefixing or
postfixing the value. By contrast, the trampoline functions are called like
any other static member -- i.e. `T.++(prefix: foo)` -- and thus the
function itself is not really a "prefix func" or a "postfix func", just a
func with a parameter label.
On Tue, May 17, 2016 at 9:57 PM, Brent Royal-Gordon via swift-evolution <
swift-evolution at swift.org> wrote:
> > Additionally, I am generally +1 for the same reasons as Brent, but I
> > have another caveat as well:
> >
> > Defining prefix and postfix functions looks like this in the proposal:
> >
> > static prefix func ++(value: inout Self) -> Self
> > static postfix func ++(value: inout Self) -> Self
> >
> > yet the proposal suggests calling them this way from these boilerplate
> > methods:
> >
> > prefix func ++ <T: SomeProtocol>(value: inout T) -> T {
> > return T.++(prefix: &value)
> > }
> > postfix func ++ <T: SomeProtocol>(value: inout T) -> T {
> > return T.++(postfix: &value)
> > }
>
> I actually found this bizarre too, but forgot to mention it. My suggested
> solution runs in the other direction: We should require that *all* unary
> operator declarations and references use `prefix` or `postfix` as a
> parameter label. Thus, the trampoline operators themselves would be written
> as:
>
> func ++ <T: SomeProtocol>(prefix value: inout T) -> T {
> return T.++(prefix: &value)
> }
>
> func ++ <T: SomeProtocol>(postfix value: inout T) -> T {
> return T.++(postfix: &value)
> }
>
> Not would be written as:
>
> func ! <B: BooleanType>(prefix value: B) -> Bool
>
> While force-unwrap (if we had inout return values) would be written:
>
> func ! <T>(postfix value: inout Optional<T>) -> inout T
>
> `prefix` and `postfix` would be eliminated from the language as
> declaration modifiers, except when declaring custom operators (which is
> already the Land Of Ad-Hoc Syntax).
>
> --
> Brent Royal-Gordon
> Architechies
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160517/0c7de6d0/attachment.html>
More information about the swift-evolution
mailing list