<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
A feature that would be nice to have is functional blocks. Some way
to be certain that some block will evaluate without modifying any
existing object at all. Then, Smalltalk would be better as a
functional language, and many operations taking a block would be
more natural.<br>
<br>
Just rambling out loud.<br>
<br>
BTW, comments at these methods could be enhanced, possibly with
links to this email thread.<br>
<br>
Cheers,<br>
<br>
On 11/3/2022 8:56 AM, Hernán Wilkinson via Cuis-dev wrote:
<blockquote
cite="mid:CAGgF3GwoX5MYatrAFYkxDiCXo5-nWQNBNJ7w9h0JV35ocp3qsA@mail.gmail.com"
type="cite">
<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 moz-do-not-send="true"
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
moz-do-not-send="true"
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 moz-do-not-send="true"
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 moz-do-not-send="true"
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
moz-do-not-send="true"
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
moz-do-not-send="true"
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
moz-do-not-send="true"
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
moz-do-not-send="true" 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
moz-do-not-send="true" 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 style="font-family: monospace;" cols="72">--
Juan Vuletich
<a moz-do-not-send="true" href="http://cuis.st" style="font-family: monospace;" target="_blank">cuis.st</a>
<a moz-do-not-send="true" href="http://github.com/jvuletich" style="font-family: monospace;" target="_blank">github.com/jvuletich</a>
<a moz-do-not-send="true" href="http://researchgate.net/profile/Juan-Vuletich" style="font-family: monospace;" target="_blank">researchgate.net/profile/Juan-Vuletich</a>
<a moz-do-not-send="true" href="http://independent.academia.edu/JuanVuletich" style="font-family: monospace;" target="_blank">independent.academia.edu/JuanVuletich</a>
<a moz-do-not-send="true" href="http://patents.justia.com/inventor/juan-manuel-vuletich" style="font-family: monospace;" target="_blank">patents.justia.com/inventor/juan-manuel-vuletich</a>
<a moz-do-not-send="true" href="http://linkedin.com/in/juan-vuletich-75611b3" style="font-family: monospace;" target="_blank">linkedin.com/in/juan-vuletich-75611b3</a>
<a moz-do-not-send="true" 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
moz-do-not-send="true" 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
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;"><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
moz-do-not-send="true"
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>
</blockquote>
<br>
<br>
<pre class="moz-signature" cols="72">--
Juan Vuletich
cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
linkedin.com/in/juan-vuletich-75611b3
twitter.com/JuanVuletich</pre>
</body>
</html>