[swift-evolution] ed/ing, InPlace, Set/SetAlgebra naming resolution

David Hart david at hartbit.com
Sun Feb 14 10:52:11 CST 2016


My vocabulary is probably not precise (and please correct me if so), but:

a.members(in: b)
a.members(notIn: b)

Are both overrides in my original message, because they use the same base name before the parentheses. I know that argument labels are part of the function signature. I was just trying to say that I find the code above more consistent because the mutating versions also share the same base name:

a.removeMembers(notIn: b)
a.removeMembers(in: b)

> On 14 Feb 2016, at 17:39, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 
> on Sun Feb 14 2016, David Hart <swift-evolution at swift.org> wrote:
> 
>> I don’t really agree with Dave’s comments about removing ‘with', 
> 
> When one road merges with another, both are changed.
> 
>> but here’s one of mine – making the non-mutating difference an
>> override of intersection because it sounds clearer to me and is
>> consistent with the mutable versions being overrides:
> 
> I don't see any overrides around here.  Care to clarify?
> 
>> Non-mutable
>> 
>> let union = a.merged(with: b)
>> let intersection = a.members(in: b)
>> let difference = a.members(notIn: b)
>> let symmetricDifference = a.merged(with: b, removingMembersInCommon: true)
>> 
>> Mutable (In-Place)
>> 
>> a.merge(with: b) // union in-place
>> a.removeMembers(notIn: b) // intersect in-place
>> a.removeMembers(in: b)	// difference in-place
>> a.merge(with: b, removingMembersInCommon: true) // symmetric difference in-place
>> 
>>> On 14 Feb 2016, at 17:10, Dave Abrahams via swift-evolution
>>> <swift-evolution at swift.org> wrote:
>>> 
>>> 
>>> on Sat Feb 13 2016, Ricardo Parada <rparada-AT-mac.com> wrote:
>>> 
>>>> Hi Dave,
>>>> 
>>>> I would be okay with staying away from the mathematical terms similar
>>>> to what you are suggesting except that the union can still be made
>>>> more concise if you use merged / merge for the base name and shorten
>>>> the labels to a bare minimum without loosing clarity.  In addition,
>>>> the merge can have a second parameter with a default to false in order
>>>> to implement the symmetric difference (a.k.a. exclusive or).  Recall
>>>> that symmetric difference is the union of two sets and then removing
>>>> the intersection (or members in common).  I think it looks perfect
>>>> (concise and clear).  What does everybody else think?
>>>> 
>>>> Non-mutable
>>>> 
>>>> let union = 			a.merged(with: b)
>>>> let intersection = 		a.members(in: b)
>>>> let difference = 		a.removingMembers(in: b)
>>>> let symmetricDifference = 	a.merged(with: b, removingMembersInCommon: true)
>>>> 
>>>> Mutable (In-Place)
>>>> 
>>>> a.merge(with: b)		// union in-place
>>>> a.removeMembers(notIn: b)	// intersect in-place
>>>> a.removeMembers(in: b)		// difference in-place
>>>> a.merge(with: b, removeMembersInCommon: true)	// symmetric difference in-place
>>> 
>>> I love your changes to my suggestion, Ricardo!  The minor alterations I
>>> would make are:
>>> 
>>> 1. In both cases the Bool parameter ought to be called
>>>  “removingMembersInCommon”
>>> 
>>> 2. I would remove “with” from the in-place merge operation.  We're
>>>  really asking the receiver to merge b into itself.  “With” gives it
>>>  the sense that it might almost be mutating b.
>>> 
>>>> Ricardo Parada
>>>> 
>>>>> On Feb 13, 2016, at 1:16 PM, Dave Abrahams via swift-evolution
>>>>> <swift-evolution at swift.org> wrote:
>>>>> 
>>>>> 
>>>>> on Fri Feb 12 2016, Ricardo Parada <swift-evolution at swift.org
>>>>> <mailto:swift-evolution at swift.org>> wrote:
>>>>> 
>>>>>> Hi all,
>>>>>> 
>>>>>> I can’t make up my mind.  Let me propose two different alternatives
>>>>>> that I’m not sure if they have been considered:
>>>>>> 
>>>>>> ALTERNATIVE 1
>>>>>> 
>>>>>> Non-mutable (noun-based)
>>>>>> 
>>>>>> -  func union(other: Self) -> Self
>>>>>> +  func union(other: Self) -> Self		Assumes union is a noun, i.e. not a verb
>>>>>> 
>>>>>> -  func intersect(other: Self) -> Self
>>>>>> +  func intersection(other: Self) -> Self
>>>>>> 
>>>>>> -  func subtract(other: Self) -> Self
>>>>>> +  func subtraction(other: Self) -> Self
>>>>>> 
>>>>>> -  func exclusiveOr(other: Self) -> Self
>>>>>> +  func symmetricSubtraction(other: Self) -> Self
>>>>>> 
>>>>>> Mutable (verb-based)
>>>>>> 
>>>>>> -  mutating func unionInPlace(other: Self)
>>>>>> +  mutating func unite(other: Self)
>>>>>> 
>>>>>> -  mutating func intersectInPlace(other: Self)
>>>>>> +  mutating func intersect(other: Self)
>>>>>> 
>>>>>> -  mutating func subtractInPlace(other: Self)
>>>>>> +  mutating func subtract(other: Self)
>>>>>> 
>>>>>> -  mutating func exclusiveOrInPlace(other: Self)
>>>>>> +  mutating func symmetricSubtract(other: Self)
>>>>>> 
>>>>>> Comments: 
>>>>>> 
>>>>>> With this alternative we keep the union name which I assume is
>>>>>> popular.  However, one has to accept unite as a verb (for the mutable
>>>>>> version) as I wanted all the mutable methods use verbs for
>>>>>> consistency.  I think unite is acceptable because it can be found in
>>>>>> the dictionary and it is a verb.
>>>>>> 
>>>>>> Notice that all the non-mutable methods use nouns: union,
>>>>>> intersection, subtraction and symmetricSubtraction.
>>>>>> 
>>>>>> I understand some may oppose to symmetricSubtraction saying that
>>>>>> symmetricSubraction is not as common as "exclusive or".  However,
>>>>>> using symmetricSubtraction is consistent with subtraction and it hints
>>>>>> to a variation of the “subtraction" operation.  We will get used to it
>>>>>> quickly / easily.
>>>>>> 
>>>>>> The mutable methods all use verbs:  unite, intersect, subtract and symmetricSubtract.
>>>>>> 
>>>>>> ALTERNATIVE 2
>>>>>> 
>>>>>> Non-mutable
>>>>>> 
>>>>>> -  func union(other: Self) -> Self
>>>>>> +  func adding(other: Self) -> Self
>>>>>> 
>>>>>> -  func intersect(other: Self) -> Self
>>>>>> +  func intersecting(other: Self) -> Self
>>>>>> 
>>>>>> -  func exclusiveOr(other: Self) -> Self
>>>>>> +  func exclusiveOring(other: Self) -> Self
>>>>>> 
>>>>>> -  func subtract(other: Self) -> Self
>>>>>> +  func removing(other: Self) -> Self
>>>>>> 
>>>>>> Mutable
>>>>>> 
>>>>>> -  mutating func unionInPlace(other: Self)
>>>>>> +  mutating func add(other: Self)
>>>>>> 
>>>>>> -  mutating func intersectInPlace(other: Self)
>>>>>> +  mutating func intersect(other: Self)
>>>>>> 
>>>>>> -  mutating func exclusiveOrInPlace(other: Self)
>>>>>> +  mutating func exclusiveOr(other: Self)
>>>>>> 
>>>>>> -  mutating func subtractInPlace(other: Self)
>>>>>> +  mutating func remove(other: Self)
>>>>>> 
>>>>>> Comments: This alternative gives up on union in favor or add.  Many
>>>>>> may not like this, that is why I have it as the second alternative.
>>>>>> It brings back exclusiveOr and treats it as a verb.  Some may argue
>>>>>> that exclusiveOr is a noun for the "exclusive or" operation.
>>>>> 
>>>>> If we are going to force Set fit the naming guidelines, I would prefer
>>>>> to stay away from the mathematical terms altogether.
>>>>> 
>>>>> func insertingContentsOf(other: Self) -> Self                 // union
>>>>> mutating func insertContentsOf(other)
>>>>> 
>>>>> func members(in other: Self) -> Self                           // intersection
>>>>> mutating func removeMembers(notIn: other)
>>>>> 
>>>>> func removingMembersAndAddingNonMembers(in other: Self) -> Self // symmetric difference
>>>>> mutating func removeMembersAndAddingNonMembers(in other: Self)
>>>>> 
>>>>> func removingMembers(in other: Self) -> Self                    // subtract
>>>>> mutating func removeMembers(in other: Self)
>>>>> 
>>>>> If it would help with clarity, we could replace "in" with "foundIn"
>>>>> above.
>>>>> 
>>>>> -- 
>>>>> -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>
>>> 
>>> -- 
>>> -Dave
>>> _______________________________________________
>>> 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
> 
> -- 
> -Dave
> 
> _______________________________________________
> 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/20160214/72ce0370/attachment.html>


More information about the swift-evolution mailing list