> On Jan 24, 2017, at 1:27 PM, Xiaodi Wu <[email protected]> wrote:
> 
> Hmm, brainstorming here. Given the pervasive use of `with` to mean "this 
> isn't accessible otherwise but inside this closure it's $0", maybe 
> `reduce(with: 42) { $0 += 1 }` might give a useful hint?

Are there any current uses of `with` passed `inout`?

> On Tue, Jan 24, 2017 at 13:19 Matthew Johnson <[email protected] 
> <mailto:[email protected]>> wrote:
>> On Jan 24, 2017, at 1:01 PM, Xiaodi Wu <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Hmm, it reads well, but IMO it avoids being misleading only because it 
>> doesn't mean anything. In what way are you reducing "into" the first 
>> argument any more so than the classic reduce function?
> 
> It isn't perfect, but it’s better than the alternatives I’ve seen so far.
> 
> In the classic reduce function a new value is produced for each step of the 
> reduction.  In this variation, each step reduces “into” an accumulator that 
> is initialized with the seed value.  In that sense, you could say that you 
> reduce “into” the seed value.
> 
> Labeling the argument `into` is a little bit of a stretch but I think it's 
> far superior to `mutating` which is pretty misleading at the call site.  I 
> think it would be pretty hard to come up with something better, but let’s 
> keep the bikeshed going if anyone has additional ideas.
> 
> 
>> On Tue, Jan 24, 2017 at 12:44 Matthew Johnson via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>>> On Jan 24, 2017, at 12:36 PM, Pyry Jahkola via swift-evolution 
>>> <[email protected] <mailto:[email protected]>> wrote:
>>> 
>>> 
>>> Freak Show wrote:
>>> 
>>>> Am I the only one who finds this incredibly ugly and hard to read?
>>>> 
>>>> This is more or less solved by inject:into: idiom.  There is no reason for 
>>>> inout for this particular problem.
>>> 
>>> Yeah, the original signature seems more useful. If you go all `inout` like 
>>> Gwendal suggested, you might as well just iterate over the sequence with 
>>> `for x in xs`, updating the state as you go.
>>> 
>>> But your comment brought another idea to mind: if `mutating:` is considered 
>>> a bad name for a non-`inout` argument, how about `reduce(into:combine:)`, 
>>> similar to what Karl suggested earlier in this thread?
>>> 
>>> I think it reads very well at the call site, does not suggest `inout`ness 
>>> of the argument too much (of course there's no `&` at the call site 
>>> either), and it's still easily found with auto-completion:
>>> 
>>>     let counts = words.reduce(into: [:]) {
>>>       $0[$1] = ($0[$1] ?? 0) + 1
>>>     }
>> 
>> +1.  This is concise and I think it captures the essence of what is 
>> happening pretty well!
>> 
>> The third variation where the seed argument actually *is* `inout` might also 
>> be interesting in some cases where you *already* have a `var` that you want 
>> to accumulate into.  I believe I have done this in the past in my own code 
>> but don’t have an example handy.
>> 
>>> 
>>> — Pyry
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to