> On Nov 2, 2016, at 11:38 AM, John McCall <rjmcc...@apple.com> wrote:
>
>> On Nov 2, 2016, at 9:05 AM, Joe Groff via swift-dev <swift-dev@swift.org>
>> wrote:
>>> On Nov 1, 2016, at 9:23 PM, Slava Pestov <spes...@apple.com> wrote:
>>>
>>>>
>>>> On Nov 1, 2016, at 11:00 AM, Jordan Rose via swift-dev
>>>> <swift-dev@swift.org> wrote:
>>>>
>>>> - Does this help us with the nested dictionary CoW problem?
>>>> `foo["bar"]["baz"] += 1`
>>>
>>> My understanding is that this problem arises because we don’t have
>>> ‘optional addressors’. A dictionary lookup might return nil. If addressors
>>> had a way to return an optional wrapping a pointer, and optional evaluation
>>> supported this, we could do in-place updates of this kind. For Apple
>>> people: I have a radar that I think describes this problem
>>> (rdar://17509619).
>>
>> I think our long-term goal here is to let the property definition fully
>> control the `inout` access with a coroutine-like definition, something like:
>>
>> var foo: T {
>> get { return /*value for read-only access*/ }
>> set { _foo = /*write-only access*/ }
>> mutate {
>> var tmp = prepareForMutation()
>> yield &tmp // continue nested inout access
>> reconcileMutation(tmp)
>> }
>> }
>>
>> This should let the dictionary implementation do whatever it needs to
>> present a moved Optional value to the chained access. If Dictionary can't
>> store Optionals directly inline in all cases, we ought to still be able to
>> rely on enforced inout uniqueness to get away with moving in and out of a
>> temporary.
>
> It's tricky, because if Dictionary is going to support non-movable values,
> then we also want the non-mutating accessor to be able to return a
> Borrowed<Optional<V>>, which it can't do if that representation has to be a
> pointer to an Optional<V>. It can returned an Optional<Borrowed<V>> just
> fine, of course.
>
> This relates to the earlier conversation we had about borrowed tuples. We
> may have to make the representation of a Borrowed<T> potentially different
> from just a T*, and that really stinks.
Being able to model an access as Optional<borrowed T> or Optional<inout T>
might fit better with the move-only types model for dictionaries, and would be
useful for other things like optional protocol members and properties found on
AnyObject. Dictionaries have the "delete" operation to shoehorn into the `inout
Optional<T>` model and give `foo["bar"] = nil` meaning, but there are other
mutation interfaces for which that isn't true. (Even for dictionaries, I've
always felt it was a bit of a hack.)
-Joe
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev