<div dir="ltr">I got what I wanted!! to provoke a discussion! you believe me, don't you?? hahahaah<br><div><br></div><div>Yeah, I completely agree Luciano, maybe we should make it more clear with a test and/or comment in the sum:ifEmpty: method... </div><div><br></div><div>Cheers!</div><div>Hernan.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Nov 3, 2022 at 3:45 AM Martin McClure <<a href="mailto:martin@hand2mouse.com">martin@hand2mouse.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div>Hi Luciano,<br>
<br>
Well, a lot depends on exactly which combination of properties one
wants. There are many ways to implement collections, and each
reasonable way is better at some things and worse than others.<br>
<br>
Arrays can already be concurrently modified while iterating.
(Arrays allow duplicate entries, violating my third requirement,
which I now realize should only apply to collections which do not
allow duplicates.)<br>
<br>
Hashed collections (let's say Set, but Dictionary is similar) as
implemented in Smalltalk-80 (open addressing with linear probing)
have two problem points for iterating while modifying -- deletions
can move an existing element earlier in the table, and additions
can cause the table to grow, scrambling everything. The deletion
problem can be handled by using collision buckets instead of
linear probing, which is not quite as fast because more cache line
reads, but still O(1). The grow problem can be handled more
easily. A grow replaces the table and copies the elements over to
the new table. If the iterator caches the table in a temporary
variable then it can do the iteration over the original table even
if the base collection has moved on to a new table. The old table
will be released when the iteration is done.<br>
<br>
One of the nice things about Smalltalk is that if there isn't a
collection class that meets the your exact needs, you have the
ability to implement your own.<br>
<br>
Regards,<br>
-Martin<br>
<br>
On 11/2/22 23:09, Luciano Notarfrancesco via Cuis-dev wrote:<br>
</div>
<blockquote type="cite">
<div dir="auto">Hi Martin,</div>
<div dir="auto">That’s very interesting. I guess this was not the
best example, since not being able to modify a collection while
it’s iterating doesn’t really have to do with the essence of the
collections or their messages, but more with a limitation of the
implementation.</div>
<div dir="auto">Is there a way to change existing collections to
support modification while iterating without loosing
performance? </div>
<div><br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Thu, 3 Nov 2022 at 12:44
Martin McClure <<a href="mailto:martin@hand2mouse.com" target="_blank">martin@hand2mouse.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div>Hi Luciano,<br>
<br>
I agree that restricting #sum: to be used with a block
that is a function is reasonable, and probably best.<br>
<br>
But I disagree about changing a collection while
iterating it. I have often wanted a collection that
could be modified while iterating it. And, given how
much time I've spent writing stuff that has to work in a
multi-threaded environment, I've probably implemented
that sort of collection at least once. My idea of
desirable semantics for this kind of collection are:<br>
1) The iteration <i>will</i> include each element that
is present throughout the iteration.<br>
2) It is <i>unpredictable</i> whether any elements
added or removed during the iteration are included in
the iteration.<br>
3) The same element (same being equal or identical,
depending on the collection) will appear at most once in
the iteration.<br>
<br>
There are a number of cases where this is useful. <br>
<br>
* The iterating thread may want to add or remove
elements while it iterates.<br>
A queue is a simple example of this kind of collection,
where the iterator is unconditionally removing elements
as they're iterated, while some other entity may be
concurrently adding elements. This can be generalized to
conditional removal of elements that are iterated, or
conditional adding of elements based on elements found.<br>
<br>
* Modification of the collection and iteration of the
collection might happen in separate threads. There are
times when a "more or less up-to-date" iteration of the
contents is fine.<br>
<br>
Regards,<br>
-Martin <br>
</div>
</div>
<div>
<div> <br>
On 11/2/22 21:57, Luciano Notarfrancesco via Cuis-dev
wrote:<br>
</div>
<blockquote type="cite">
<div dir="auto">Yes, the method assumes the block is a
function (it maps one element to only one value). We
talked about this here a couple of times. The
Collection protocol is very “functional”, specially
messages like #collect:, #select:, #detect:, etc, and
using them with blocks that are functions is the most
natural way to use them, and I don’t think we loose
anything by making the assumption that the blocks for
these messages are functions.</div>
<div dir="auto">Moreover, the whole point of Bag is to
be able to efficiently store elements with lots of
repetitions, possibly millions of repetitions that
otherwise wouldn’t even fit in memory. If #sum:
iterated over all the repetitions it would defeat the
original purpose of Bag. And I argue that this is not
necessary because no one would ever call #sum: with a
block that is not a function, at least I never had the
need to do that, and it feels unnatural to use #sum:
in that way and I’d use #do: instead.</div>
<div dir="auto">If you think this assumption is strange,
think about all the other assumptions that collections
make. For example, you cannot change a collection
while you’re iterating it. It would just feel wrong to
change a collection while you iterate it, we don’t
need to try to support that because who would do that?</div>
<div dir="auto"><br>
</div>
<div dir="auto"><br>
</div>
<div dir="auto">On Thu, 3 Nov 2022 at 03:12 Hernán
Wilkinson <<a href="mailto:hernan.wilkinson@10pines.com" target="_blank">hernan.wilkinson@10pines.com</a>>
wrote:<br>
</div>
<div>
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">How does that optimization work?
<div>Because I thought about evaluating the
block and multiplying that for the number of
elements, but that makes sense if the block
returns always the same value por the same
element, if it does not then it will not
work...</div>
<div><br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, Nov 2,
2022 at 3:24 PM Juan Vuletich <<a href="mailto:juan@cuis.st" target="_blank">juan@cuis.st</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#ffffff"> On 11/1/2022 11:23 PM,
Hernán Wilkinson via Cuis-dev wrote:
<blockquote type="cite">
<div dir="ltr">yeap, the current
implementation is not correct.
<div>Juan, attached is a change set that
fixes it and another with the related
tests.</div>
<div><br>
</div>
<div>Cheers!</div>
<div>Hernan.</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On
Tue, Nov 1, 2022 at 3:39 AM Luciano
Notarfrancesco <<a href="mailto:luchiano@gmail.com" target="_blank">luchiano@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="auto">I’m afk right now so I
cannot check, but it sounds like I
made a mistake. Of course it should
be the value of aBlock at each
element times the number of
occurrences.</div>
<div><br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On
Tue, 1 Nov 2022 at 07:33 Hernán
Wilkinson <<a href="mailto:hernan.wilkinson@10pines.com" target="_blank">hernan.wilkinson@10pines.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">Hi,
<div> the implementation of
Bag>>#sum: aBlock
ifEmpty: emptyBlock does not
use the parameter aBlock at
all and assumes that each of
the elements answers the
message * </div>
<div> <a class="gmail_plusreply" id="m_-7493885684589873084m_-3526128079982332351m_-8793636495669467945m_7503398456341899303m_-3423588523307269653m_4335152602574426633plusReplyChip-0" href="mailto:luchiano@gmail.com" target="_blank">@Luciano
Notarfrancesco</a> the
implementation is yours and
it is very new? Is there a
reason you did that way? </div>
<div><br>
</div>
<div>Thanks</div>
<div>Hernan</div>
</div>
<div dir="ltr">
<div><br clear="all">
<div><br>
</div>
-- <br>
<div dir="ltr">
<div dir="ltr">
<div>
<div dir="ltr">
<div style="font-size:small">
<div dir="ltr">
<div dir="ltr">
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif"><span style="font-weight:bold;font-family:tahoma,sans-serif">Hernán
Wilkinson</span><br>
Agile Software
Development,
Teaching &
Coaching</span></font></span></span></strong></span></div>
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">Phone: +54-011</span></font></span></span></strong></span><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2" face="tahoma,
sans-serif">-4893-2057</font></div>
<div style="font-size:12.8px"><strong style="font-family:tahoma,sans-serif;font-size:xx-small"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">Twitter:
@HernanWilkinson</span></font></span></span></strong></div>
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">site: <a href="http://www.10pines.com/" style="font-family:tahoma,sans-serif;color:rgb(17,65,112)" target="_blank">http://www.10Pines.com</a></span></font></span></span></strong></span></div>
<div style="font-size:12.8px"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" face="tahoma,
sans-serif"><span style="border-collapse:collapse;font-family:tahoma,sans-serif">Address:
Alem 896</span></font>,
Floor 6,
Buenos Aires,
Argentina</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<br clear="all">
<div><br>
</div>
-- <br>
<div dir="ltr">
<div dir="ltr">
<div>
<div dir="ltr">
<div style="font-size:small">
<div dir="ltr">
<div dir="ltr">
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif"><span style="font-weight:bold;font-family:tahoma,sans-serif">Hernán Wilkinson</span><br>
Agile Software
Development,
Teaching &
Coaching</span></font></span></span></strong></span></div>
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">Phone:
+54-011</span></font></span></span></strong></span><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2" face="tahoma,
sans-serif">-4893-2057</font></div>
<div style="font-size:12.8px"><strong style="font-family:tahoma,sans-serif;font-size:xx-small"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">Twitter:
@HernanWilkinson</span></font></span></span></strong></div>
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">site: <a href="http://www.10pines.com/" style="font-family:tahoma,sans-serif;color:rgb(17,65,112)" target="_blank">http://www.10Pines.com</a></span></font></span></span></strong></span></div>
<div style="font-size:12.8px"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" face="tahoma,
sans-serif"><span style="border-collapse:collapse;font-family:tahoma,sans-serif">Address:
Alem 896</span></font>,
Floor 6, Buenos Aires,
Argentina</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Hi Hernán,<br>
<br>
Your fix disables the optimization Luciano
did. I chose to fix Luciano's code. Did the
same for #product: (same bug). Integrated
your tests, and added another one for
#product:<br>
<br>
Thanks,<br>
<pre cols="72" style="font-family:monospace">--
Juan Vuletich
<a href="http://cuis.st" style="font-family:monospace" target="_blank">cuis.st</a>
<a href="http://github.com/jvuletich" style="font-family:monospace" target="_blank">github.com/jvuletich</a>
<a href="http://researchgate.net/profile/Juan-Vuletich" style="font-family:monospace" target="_blank">researchgate.net/profile/Juan-Vuletich</a>
<a href="http://independent.academia.edu/JuanVuletich" style="font-family:monospace" target="_blank">independent.academia.edu/JuanVuletich</a>
<a href="http://patents.justia.com/inventor/juan-manuel-vuletich" style="font-family:monospace" target="_blank">patents.justia.com/inventor/juan-manuel-vuletich</a>
<a href="http://linkedin.com/in/juan-vuletich-75611b3" style="font-family:monospace" target="_blank">linkedin.com/in/juan-vuletich-75611b3</a>
<a href="http://twitter.com/JuanVuletich" style="font-family:monospace" target="_blank">twitter.com/JuanVuletich</a></pre>
</div>
</blockquote>
</div>
<br clear="all">
<div><br>
</div>
-- <br>
<div dir="ltr">
<div dir="ltr">
<div>
<div dir="ltr">
<div style="font-size:small">
<div dir="ltr">
<div dir="ltr">
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif"><span style="font-weight:bold;font-family:tahoma,sans-serif">Hernán Wilkinson</span><br>
Agile Software
Development, Teaching
& Coaching</span></font></span></span></strong></span></div>
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">Phone:
+54-011</span></font></span></span></strong></span><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2" face="tahoma, sans-serif">-4893-2057</font></div>
<div style="font-size:12.8px"><strong style="font-family:tahoma,sans-serif;font-size:xx-small"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">Twitter:
@HernanWilkinson</span></font></span></span></strong></div>
<div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong style="font-family:tahoma,sans-serif"><span style="font-size:8pt;font-family:tahoma,sans-serif"><span style="font-size:small;font-family:tahoma,sans-serif"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" size="2"><span style="font-weight:normal;font-family:tahoma,sans-serif">site: <a href="http://www.10pines.com/" style="font-family:tahoma,sans-serif;color:rgb(17,65,112)" target="_blank">http://www.10Pines.com</a></span></font></span></span></strong></span></div>
<div style="font-size:12.8px"><font style="font-family:tahoma,sans-serif;color:rgb(0,0,0)" face="tahoma,
sans-serif"><span style="border-collapse:collapse;font-family:tahoma,sans-serif">Address:
Alem 896</span></font>, Floor
6, Buenos Aires, Argentina</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
<br>
<fieldset></fieldset>
</blockquote>
<br>
</div>
</blockquote>
</div>
</div>
<br>
<fieldset></fieldset>
</blockquote>
<br>
</div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div style="font-size:small"><div dir="ltr"><div dir="ltr"><div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal"><span style="font-weight:bold">Hernán Wilkinson</span><br>Agile Software Development, Teaching & Coaching</span></font></span></span></strong></span></div><div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal">Phone: +54-011</span></font></span></span></strong></span><font face="tahoma, sans-serif" size="2">-4893-2057</font></div><div style="font-size:12.8px"><strong style="font-family:tahoma,sans-serif;font-size:xx-small"><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal">Twitter: @HernanWilkinson</span></font></span></span></strong></div><div style="font-size:12.8px"><span style="font-family:tahoma,sans-serif;font-size:xx-small;border-collapse:collapse"><strong><span style="font-size:8pt"><span style="font-size:small"><font size="2"><span style="font-weight:normal">site: <a href="http://www.10pines.com/" style="color:rgb(17,65,112)" target="_blank">http://www.10Pines.com</a></span></font></span></span></strong></span></div><div style="font-size:12.8px"><font face="tahoma, sans-serif"><span style="border-collapse:collapse">Address: Alem 896</span></font>, Floor 6, Buenos Aires, Argentina</div></div></div></div></div></div></div></div>