<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">martin@hand2mouse.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">
  
    
  
  <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-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">
            <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-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">
                <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-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">
                        <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-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">
                              <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_-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>