<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">We do talk about set “minus”. So A \ B is also written A - B and is A union B complement. Although you can properly use the word complement to refer to A \ B, it generally applies to one set. So B complement is the set of elements that don’t belong to A.&nbsp;<div class=""><br class=""></div><div class="">Formally, I think what you’re referring to is the analog of “-“ in ordinary arithmetic having meaning as a unary operator and as an infix operator.</div><div class=""><br class=""></div><div class="">I tend to use minus for A - B, complement for B complement, and difference for the symmetric difference of A and B (which is (A union B) - (A intersect B))</div><div class=""><br class=""></div><div class="">Best,</div><div class=""><br class=""></div><div class="">Daniel&nbsp;<br class=""><div><blockquote type="cite" class=""><div class="">On Mar 29, 2016, at 5:28 AM, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class="">I do believe, if we're going to try to go down the route of correctness, that A \ B is generally spoken of as the complement of B in A, which I guess could be written in Swift as `a.complement(of: b)`. However, that doesn't read too well and I don't think it clarifies anything.<br class=""><br class="">Alternatively, and this would be a bigger change but would be unambiguous and correct, we could have it as `b.complement(in: a)`, which has the added but practically useless virtue that a hypothetical universal complement could be named in a consistent way as `b.complement()`.<br class=""><br class="">Difference does seem to be the consensus word among most programming languages for this method, and in Python it really is just `a.difference(b)`. I don't think it's ever referred to as "difference from", and I would not know if `a.formDifference(from: b)` denotes A \ B or B \ A without looking it up.<br class=""><br class="">So, I guess, I'd prefer subtract over "difference from", as neither is really mathematically correct and at least the former is unambiguous. If the core team is willing to entertain b.complement(in: a), I'd be +1 on that. At the end of the day, this particular method will have to look different from the others no matter what because it is unique in not being commutative.<br class=""><div class="gmail_quote"><div dir="ltr" class="">On Mon, Mar 28, 2016 at 9:59 PM Dave via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class=""><blockquote type="cite" class=""><div class="">On Mar 28, 2016, at 7:34 PM, Erica Sadun &lt;<a href="mailto:erica@ericasadun.com" target="_blank" class="">erica@ericasadun.com</a>&gt; wrote:</div><br class=""><div class=""><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><blockquote type="cite" class=""><div class=""><br class="">On Mar 28, 2016, at 6:19 PM, Dave via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class=""><div class=""><div class=""><br class=""><blockquote type="cite" class="">On Mar 25, 2016, at 4:45 PM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com" target="_blank" class="">dabrahams@apple.com</a>&gt; wrote:<br class=""><br class="">on Fri Mar 25 2016,<span class="">&nbsp;</span><a href="http://davesweeris-at-mac.com/" target="_blank" class="">davesweeris-AT-mac.com</a><span class="">&nbsp;</span>wrote:<br class=""><br class=""><blockquote type="cite" class="">Can we rename `subtract` to `complement`, since that’s the correct<br class="">term? At least, I’m assuming that’s what `subtract` means… if not, I’m<br class="">confused.<br class=""><a href="https://en.wikipedia.org/wiki/Set_(mathematics)#Complements" target="_blank" class="">https://en.wikipedia.org/wiki/Set_(mathematics)#Complements</a><br class=""></blockquote><br class="">It's not just “complement,” because that means inverting set membership<br class="">of everything in a finite domain.&nbsp; It would have to be “relative<br class="">complement.” &nbsp;But “relative complement” lacks the directional<br class="">implication that plagues terms like “difference,” but not “subtracting.”<br class=""></blockquote><br class="">Fair points… I accidentally left off the argument label. May I amend my suggestion to "rename `subtract(:)` to `complement(relativeTo:)`”? It just seems to me that if we’re going to claim we’re implementing something, we should adopt as much of its “standard" syntax and terminology as possible. It makes Swift easier to use for those coming from other disciplines, IMHO.<br class=""></div></div></blockquote></div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">If you took 100 random developers off the street, and showed them code that said:</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><font face="Menlo" class="">set1.formRelativeComplement(set2)</font></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">and</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><font face="Menlo" class="">set1.subtracting(set2)</font></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">About 99.5% of them would understand the second better than the first on first read.&nbsp;</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">The other 0.5 of a developer would be living somewhere near Boulder and growing&nbsp;</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">his own hemi-pharmaceuticals.</div></div></blockquote></div></div><div style="word-wrap:break-word" class=""><div class=""><div class="">With my amended suggestion, that would read "<font face="Menlo" class="">set1.formComplement(relativeTo: set2)</font>”. Either way, though, if you’re claiming that “complement(relativeTo:)” or “complementRelativeTo(:)” shouldn’t be used because it’s too unrecognizable compared to the roughly-analogous term “subtract", then surely “union”, intersection”, and especially “symmetricDifference” all fail that test as well when compared to some very well-known terms:</div><div class=""><font face="Menlo" class="">set1.or(set2) &nbsp; &nbsp;//union</font></div><div class=""><font face="Menlo" class="">set1.and(set2) &nbsp; //intersection</font></div><div class=""><span style="font-family:Menlo" class="">set1.xor(set2) &nbsp; </span><span style="font-family:Menlo" class="">//symmetric difference</span></div><div class="">(Plus, they work &amp; play well with non-unicode operators.)</div><div class=""><br class=""></div><div class="">My issue isn’t so much that the proposal doesn’t implement the “correct” mathematical notation, it’s that it uses a very formal-sounding name ("Set Algebra”), and very nearly implements the basic operations of Set Theory (which sounds very similar to “Set Algebra”), but then falls short by renaming just one operation. Although, come to think of it, the proposal is missing `cartesianProduct` as well… &nbsp;Oh well, at least it’s not in there under a different name. :-)</div></div></div><div style="word-wrap:break-word" class=""><div class=""><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">The problem with subtraction is that there isn't really a good<span class="">&nbsp;</span><font face="Menlo" class="">noun/formNoun</font><span class="">&nbsp;</span>pair</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">for it.&nbsp;</div></div></blockquote></div></div><div style="word-wrap:break-word" class=""><div class="">...</div></div><div style="word-wrap:break-word" class=""><div class=""><br class=""><blockquote type="cite" class=""><div class=""><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">In all my attempts at trying to brainstorm up a better word that would (1) retain</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">the characteristics of mutating/non-mutating pairing while (2) being easy to read</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">and understand, I could not come up with better than Dave A's<span class="">&nbsp;</span><font face="Menlo" class="">subtract/subtracting</font>.</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">I may not like it aesthetically but when it comes to offering something better,</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">I've got nothing.</div></div></blockquote></div></div><div style="word-wrap:break-word" class=""><div class=""><div class="">I think these two statements have the same root cause: Pretty much everyone has heard of subtraction, but the closest most people come to formally thinking about sets is trying to decide who to pick for their fantasy football team. The concept of operating on sets simply isn’t widespread enough for english to have a colloquial word which conveys the required meaning. “Subtract” does come close, but the AFAIK two concepts are only analogous in that subtraction is often first taught from the POV of “imagine a set of x elements, take away y of them, and count how many are left over” (see the first graphic in <a href="https://en.wikipedia.org/wiki/Subtraction" target="_blank" class="">https://en.wikipedia.org/wiki/Subtraction</a>, if that doesn’t ring a bell). The analogy doesn’t really work if your sets are, well, sets, as opposed to visual representations of numbers. The only other “widely-recognized” term that I can think of is “minus” (which I’d prefer over “subtract” because it seems less precisely defined to me). Neither one is a noun, though, so they both break the noun/formNoun pattern.</div><div class=""><br class=""></div><div class="">Speaking of nouns...</div></div></div><div style="word-wrap:break-word" class=""><div class=""><div class=""><div class=""></div></div><blockquote type="cite" class=""><div class=""><div class="">That means either breaking the pair into two words that aren't well matched</div><div class="">or using a noun that isn't that amazing, such as&nbsp;<font face="Menlo" class="">difference</font>.</div><div class=""><br class=""></div><div class=""><font face="Menlo" class="">set1.difference(set2)</font></div><div class=""><font face="Menlo" class="">set1.formDifference(set2)</font></div></div></blockquote></div></div><div style="word-wrap:break-word" class=""><div class=""><div class="">You can gain the requisite “directional implication” Dave Abrahams was talking about by adding some labels:</div><div class=""><font face="Menlo" class="">set1.difference(from: set2)</font></div><div class=""><font face="Menlo" class="">set1.formDifference(from: set2)</font></div></div></div><div style="word-wrap:break-word" class=""><div class=""><div class=""><br class=""></div><div class=""><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">That said, I'd really like to see a Swift Doc markup that allows you to mark</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">pairs of mutating/nonmutating functions, not from a compiler point of</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">view but in doc markup.</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><font face="Menlo" class="">/// - nonmutatingVersion:&nbsp;</font></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><font face="Menlo" class="">/// - mutatingVersion:</font></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">What group handles expansion of the markup keywords and how can I file a</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">feature request asking for this to be added?</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">Thanks,</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">-- E</div></div></blockquote></div></div><div style="word-wrap:break-word" class=""><div class=""></div>+1 :-)</div>_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="">
</blockquote></div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></div></body></html>