[swift-evolution] ed/ing, InPlace, Set/SetAlgebra naming resolution
Dave Abrahams
dabrahams at apple.com
Sat Feb 13 11:13:46 CST 2016
on Sat Feb 13 2016, Taras Zakharko <swift-evolution at swift.org> wrote:
>> On 12 Feb 2016, at 17:29, Dave Abrahams via swift-evolution
>> <swift-evolution at swift.org> wrote:
>>
>>
>> on Fri Feb 12 2016, Taras Zakharko
>
>> <swift-evolution at swift.org
>> <mailto:swift-evolution at swift.org>>
>> wrote:
>>
>>> IMO, using the converb/gerund/participle (whatever you call it) here
>>> is a terrible idea (I say that as someone with a PhD in linguistics :)
>>> ). It appears very counter-intuitive to me that ‘union’ should be the
>>> in-place version, as it goes agains any convention I am aware of. I’d
>>> rather just keep InPlace here or, as Greg suggests, rely on compiler
>>> optimisations.
>>
>> FWIW, I think it's almost impossible for compler optimizations to help
>> with arbitrarily complex LHS expressions such as a[b].c.d[e] =
>> a[b].c.d[e].union(f)
>>
>> ...and then you have the readability problem of repeated code.
>
> I don’t think that the problem is that complicated: if the compiler
> detects that the invoked member has a in-place version, it just needs
> to check that the expression ASTs on the left and right side are
> identical (and that no getters have side effects).
The devil is in the parentheses, brother.
> In the end, its just a special case of CSE, but its also true that
> Swift does not seem to do anything like this right now.
>
>>
>>>
>>> — Taras
>>>
>>>> On 12 Feb 2016, at 08:43, Xiaodi Wu via swift-evolution <swift-evolution at swift.org> wrote:
>>>>
>>>> I could get behind that. At the call site there would be little
>>>> visible difference between this and the alternative where functions
>>>> beginning with "=" are allowed. One I can think of would be that the
>>>> `.=` operator would require some instances (of classes that have
>>>> properties that are reference types) declared with `let` to be
>>>> declared with `var`.
>>>>
>>>>
>>>> On Fri, Feb 12, 2016 at 1:26 AM, Greg Parker via swift-evolution
>>>> <swift-evolution at swift.org> wrote:
>>>>>
>>>>>> On Feb 11, 2016, at 10:05 PM, Dave Abrahams via swift-evolution
>>>>>> <swift-evolution at swift.org> wrote:
>>>>>>
>>>>>>> on Thu Feb 11 2016, Xiaodi Wu <swift-evolution at swift.org> wrote:
>>>>>>>
>>>>>>> Understandable. FWIW, if one believes in autocomplete, superscript
>>>>>>> equal sign is already a valid identifier head character (per
>>>>>>> documentation and experimentation in a playground). So, if the gist of
>>>>>>> the proposal is acceptable, one can already name a pair of functions
>>>>>>> union() and union=() if the "=" is replaced with its superscript (and
>>>>>>> for that matter, =union(), but autocomplete might not help with that
>>>>>>> one).
>>>>>>
>>>>>> Hmm, use the fullwidth equal sign; it reads better, and compiles:
>>>>>>
>>>>>> mutating func =union(other: Self) { ... }
>>>>>>
>>>>>> Heh, that is awesome; we could do some real fun proofs-of-concept for
>>>>>> the proposal using that trick. The autocomplete problem can/should be
>>>>>> fixed by tooling.
>>>>>
>>>>> Now y'all are approaching the syntax of a proposal I made long ago
>>>>> for a .= operator. Here's what I wrote then (with a handful of
>>>>> syntax updates).
>>>>>
>>>>> "
>>>>>
>>>>> I suggest eliminating "…InPlace" as follows:
>>>>> 1. Use the same method name for value-creating methods and in-place
>>>>> mutation methods. No "…InPlace" suffix.
>>>>> 2. Write all client code syntactically as if the in-place
>>>>> implementations did not exist. Rely on the compiler to choose the
>>>>> in-place implementation when possible.
>>>>> 3. Add a new operator .= for in-place modification, to shorten the
>>>>> "expr = expr.method()" case.
>>>>>
>>>>>
>>>>> 1. Use the same method name for value-creating methods and in-place mutation methods
>>>>>
>>>>> struct String {
>>>>> func upper() -> String { ... } // value-creating / out-of-place implementation
>>>>> @inplace func upper() { ... } // in-place implementation
>>>>> }
>>>>>
>>>>> struct String2 {
>>>>> @inplace func upper() { ... } // in-place implementation
>>>>> }
>>>>>
>>>>> The value-creating implementation is optional. If it is not
>>>>> present, the compiler will generate a default value-creating
>>>>> implementation that copies the object and calls the in-place
>>>>> implementation. There is no default in-place implementation; if
>>>>> there is no in-place implementation of a value-creating method then
>>>>> the compiler simply fails to optimize to it.
>>>>>
>>>>>
>>>>> 2. Write all client code syntactically as if the in-place implementations did not exist.
>>>>>
>>>>> Instead of this
>>>>> s.upperInPlace()
>>>>> write this
>>>>> s = s.upper()
>>>>>
>>>>> The compiler optimizer can choose the in-place upper() implementation if it is present.
>>>>>
>>>>> Instead of this
>>>>> t = s.upper().trim().truncate(toLength: 5) // oops, there's an
>>>>> extra copy here
>>>>> t = s.upper().trimInPlace().truncateInPlace(toLength: 5) // oops, compile error
>>>>> write this
>>>>> t = s.upper().trim().truncate(toLength: 5)
>>>>>
>>>>> The developer can chain methods together and let the compiler
>>>>> optimizer choose which in-place implementations to use. In this
>>>>> case, if all in-place implementations are available, it should call
>>>>> value-creating upper() followed by in-place trim() and in-place
>>>>> truncate(toLength:).
>>>>>
>>>>>
>>>>> 3. Add operator .= for in-place modification.
>>>>>
>>>>> Operator .= is analogous to arithmetic operators like += . It is
>>>>> shorthand for `expr = expr.stuff` for the case where `expr` is
>>>>> inconveniently long. (It also doesn't evaluate `expr` twice, if
>>>>> Swift's optimization rules otherwise would allow it or require it
>>>>> for the longhand case.)
>>>>>
>>>>> s .= upper()
>>>>> // like s = s.upper()
>>>>>
>>>>> p .= next
>>>>> // like p = p.next
>>>>>
>>>>> some().long().expression .= upper().trim().truncateToLength(5)
>>>>> // like some().long().expression =
>>>>> some().long().expression.upper().trim().truncateToLength(5)
>>>>>
>>>>> As seen in this last example, one advantage of this syntax is that
>>>>> it allows chained mutations but cleanly separates the "lookup"
>>>>> calls from the "mutate" calls. This is an improvement upon language
>>>>> and API designs with mutating methods where the property being
>>>>> changed is buried in the middle of the expression somewhere.
>>>>>
>>>>> some().long().expression.upperInPlace().trimInPlace().truncateInPlace(toLength: 5)
>>>>> some().long().expression().upper.trimInPlace().truncateInPlace(toLength: 5)
>>>>>
>>>>> some().long().expression .= upper().trim().truncate(toLength: 5)
>>>>> some().long().expression().upper .= trim().truncate(toLength: 5)
>>>>>
>>>>>
>>>>> One consequence of these changes is that compiler optimizations to
>>>>> take advantage of in-place implementation are much more important
>>>>> for performance, because there isn't any syntax to call the
>>>>> in-place implementation directly.
>>>>>
>>>>> "
>>>>>
>>>>>
>>>>> --
>>>>> Greg Parker gparker at apple.com Runtime Wrangler
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution at swift.org
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org
>>> <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>
>> --
>> -Dave
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
--
-Dave
More information about the swift-evolution
mailing list