<html><head></head><body>  <div dir="auto">Oh! That’s exactly the semantics I’m expecting! When the method resumes I’m absolutely expecting self to be the new guy. If a subsequent message call is not understood, a DNU would be raised. Can we get a parallel method to give me those semantics, please? Portability is #becomeForward: but not that breaks your existing contract. Could we test #isEventual in #becomeForward:, perhaps?<caret></caret></div><div><br></div><div class="protonmail_signature_block" id="protonmail_signature_block"><div>❤️‍🔥🐰</div></div> <div class="signature_br" contenteditable="false"><br></div><div class="signature_br" contenteditable="false"><br></div>  <div><br></div><div><br></div>On Sat, Jun 24, 2023 at 20:38, Juan Vuletich <<a class="" href="mailto:On Sat, Jun 24, 2023 at 20:38, Juan Vuletich <<a href=">juan@cuis.st</a>> wrote:<blockquote type="cite" class="protonmail_quote">  

  
    
    <title></title>
  
  
    I'm not familiar with your code.<br>
    <br>
    But that error message you get is real. It is not a problem in Cuis.
    It is a problem in your code. You are doing #becomeForward: of an
    object that is in the midst of running a method. If the become is
    done, that method will later resume running, but self will be a
    different object, maybe an object of another class, where this
    method is not defined, and can not be run.<br>
    <br>
    I suggest understanding this problem. It is safer to only do become
    on objects that are NOT running any methods at that moment.<br>
    <br>
    Squeak doesn't give you this error simply because Squeak doesn't
    check for this problem. A VM crash is likely in this situation. I
    actually added this check to Cuis after someone (it was a long time
    ago, I don't remember who it was) was experiencing VM crashes
    because a method was resumed on a becomed object, and was writing
    instance variables that didn't exist in the becomed object.<br>
    <br>
    HTH,<br>
    <br>
    On 6/24/2023 10:57 AM, rabbit via Cuis-dev wrote:
    <blockquote type="cite">
      
      <p>Hi Juan, I'm attaching 2 squeak source files, one with 2
        methods in compatibility and the other the source.st out of my
        latest PromisesLocal-rabbt.66,mcz. <br>
      </p>
      <p>I got the Vat's eventual process working (issues with
        terminate), <br>
      </p>
      <p>but I'm blowing up on a call to #becomeForward:, from
        ENearPromise>>#becomeContext:, when resolving a promise.
        Here is an image of the resulting debugger. Is there more
        information I could provide or is someone willing to attempt to
        reproduce? Many thanks! ❤️‍🔥🐰</p>
      <p><img alt="" src="cid:part1.07050703.09090700@cuis.st"></p>
      <div class="moz-cite-prefix">On 6/23/23 20:50, rabbit via Cuis-dev
        wrote:<br>
      </div>
      <blockquote type="cite">
        
        <div dir="auto">Ahh! Thanks for the reminder. That’s how I
          started loading code a month ago or whenever I was loading
          mczs. I’ll look into it tomorrow.</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">Is it possible to get Monticello pkg loading
          working again? That’d be very good.</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">What’s my go to solution for code packaging in
          Cuis? I’d like to establish Crypto in Cuis.</div>
        <div><br>
        </div>
        <div id="protonmail_signature_block" class="protonmail_signature_block">
          <div>❤️‍🔥🐰</div>
        </div>
        <div class="signature_br" contenteditable="false"><br>
        </div>
        <div class="signature_br" contenteditable="false"><br>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
        On Fri, Jun 23, 2023 at 19:21, Juan Vuletich via Cuis-dev <<a href="mailto:On%20Fri,%20Jun%2023,%202023%20at%2019:21,%20Juan%0A%20%20%20%20%20%20%20%20Vuletich%20via%20Cuis-dev%20%3C%3Ca%20href=" class="">cuis-dev@lists.cuis.st</a>> wrote:
        <blockquote class="protonmail_quote" type="cite"> Hi rabbit,<br>
          <br>
          I suggest unzipping the Monticello files to extract the code
          in plain text (yes, Monticello files are just zip files). When
          you are there, you can also fix the line ending convention of
          the files. And of course, you'd neet to check the code,
          because Cuis is not 100% compatible with Squeak.<br>
          <br>
          We don't use Monticello in Cuis. At some point in the past it
          was possible to open MC files in Cuis, but nobody used that
          feature in ages and it got bitrotten.<br>
          <br>
          Thanks,<br>
          <br>
          On 6/23/2023 4:00 PM, rabbit via Cuis-dev wrote:
          <blockquote type="cite">
            <p>I just realized I have been working in squeak. I updated
              PromisesLocal-rabbt.66.mcz and am attaching it. I am
              getting the error below when I 'browse code' or 'install
              Mionticello package'. I do not know. How can I load
              Monticello packages? Any way to get the Installer
              available in cuis? Install Monticello config maps?<br>
            </p>
            <p>I appreciate you,<br>
              rabbit</p>
            <p><img width="862" height="398" class="loading-internal" alt=""></p>
            <p><br>
            </p>
            <div class="moz-cite-prefix">On 6/22/23 16:21, rabbit via
              Cuis-dev wrote:<br>
            </div>
            <blockquote type="cite">
              <p>Hey! I got inspired by your proposal, Luciano, and
                here's my solution in eventual promises. Code can be
                loaded as:</p>
              <blockquote>
                <p>Installer ss project: 'Cryptography'; install:
                  'ProCrypto.release.3'.<br>
                </p>
              </blockquote>
              <p>I added a test method <br>
              </p>
              <blockquote>
                <p>RefsTest>>#testMultiReturns<br>
                  <br>
                  | selectCount unionFlag pair |<br>
                  unionFlag := false.<br>
                  selectCount := 0.<br>
                  ((pair := self promiseResolverPair) key xgcd: 9) <br>
                  <<* [:each | selectCount := selectCount + 1.
                  Transcript cr; show: 'each = ', each];<br>
                  <<* [:g :s :t | unionFlag := true. Transcript
                  cr; show: 'g = ', g, '; s = ', s, '; t = ', t. g + s +
                  t].<br>
                  pair value resolve: 21.<br>
                  (Delay forMilliseconds: 333) wait.<br>
                  self assert: (selectCount == 3).<br>
                  self assert: (unionFlag).</p>
              </blockquote>
              <p>This calls new multireturn #xgcd: method</p>
              <blockquote>
                <p>xgcd: anInteger<br>
                  " 21 xgcd: 9"<br>
                  | g s t |<br>
                  g := self gcd: anInteger.<br>
                  s := self / g.<br>
                  t := anInteger / g.<br>
                  ^ { g. s. t}<br>
                </p>
              </blockquote>
              <p>And in the test method there are eventual sends
                (#<<*) to the promise of the #xgcd: send once the
                reciever promise is resolved to 21. This implementation
                detects cardinality of the continuation block and sends
                #whenResolved: appropriately, for future evaluation.</p>
              <blockquote>
                <p>Object>>#<<* continuation<br>
                  <br>
                  (continuation numArgs == 1)<br>
                  ifTrue: [^ self whenResolved: [:result | result do:
                  [:each | continuation value: each]]].<br>
                  ^ self whenResolved: [:result | continuation
                  valueWithArguments: result].</p>
              </blockquote>
              <p>One can see a 1 cardinality schedules the continuation
                to evaluate with each result, while a continuation with
                cardinality 2 or more will be scheduled to receive all
                results. #valueWithArguments:</p>
              <p>Here are 2 return handlers, <br>
              </p>
              <blockquote>
                <p>promise := ((pair := self promiseResolverPair) key
                  xgcd: 9).</p>
              </blockquote>
              <p>the first for each argument <br>
              </p>
              <blockquote>
                <p>promise <<* [:each | selectCount := selectCount
                  + 1. Transcript cr; show: 'each = ', each];</p>
              </blockquote>
              <p>and the second for all three arguments.</p>
              <blockquote>
                <p>promise <<* [:g :s :t | unionFlag := true.
                  Transcript cr; show: 'g = ', g, '; s = ', s, '; t = ',
                  t. g + s + t].</p>
              </blockquote>
              <pre cols="72" class="moz-signature">--
❤️‍🔥🐰



</pre>
              <div class="moz-cite-prefix">On 6/21/23 09:44, Luciano
                Notarfrancesco via Cuis-dev wrote:<br>
              </div>
              <blockquote type="cite">
                <div dir="auto">Interesting, thanks for sharing!</div>
                <div dir="auto">Actually I think it’s the same thing I
                  did, my implementation calls
                  BlockClosure>>#valueWithPossibleArgs: and takes
                  only as many arguments as needed by the block but the
                  array can be bigger than that (it should be named
                  #valueWithPossibleArguments: tho, abbreviations are
                  ugly).</div>
                <div dir="auto"><br>
                </div>
                <div><br>
                  <div class="gmail_quote">
                    <div dir="ltr" class="gmail_attr">On Wed, 21 Jun
                      2023 at 15:37 Christian Haider via Cuis-dev <<a href="mailto:cuis-dev@lists.cuis.st" class="moz-txt-link-freetext">cuis-dev@lists.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 lang="DE" style="">
                        <div class="m_-976565113171439616WordSection1">
                          <p class="MsoNormal"><span lang="EN-CA">I
                              added something similar to my Values
                              package (VW and ports).</span></p>
                          <p class="MsoNormal"><span lang="EN-CA">The
                              source is</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">SequenceableCollection>>asArgumentsIn:

                              aBlock</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              "Evaluate aBlock with the receiver's
                              elements as parameters.</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              aBlock takes its arguments from the
                              receiver.</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              'ok'</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              #(1 2 3) asArgumentsIn: [:a :b :c | a + b
                              + c]</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              #(1 2 3) asArgumentsIn: [:a :b | a + b]</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              #(1 2 3) asArgumentsIn: [:a | a]</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              #(1 2 3) asArgumentsIn: [42]</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              'not ok'</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              #(1 2 3) asArgumentsIn: [:a :b :c :d | a +
                              b + c + d]</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";"> "</span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";"> </span></p>
                          <p class="MsoNormal" style="margin-left: 35.4pt;"><span lang="EN-CA" style="font-family:
                              "Courier New";">
                              ^aBlock cullWithArguments: self asArray</span><span lang="EN-CA"></span></p>
                          <p class="MsoNormal"><span lang="EN-CA"> </span></p>
                          <p class="MsoNormal"><span lang="EN-CA">The
                              difference is that it takes a list of any
                              size and picks out the first items and
                              binds them to the variables.</span></p>
                          <p class="MsoNormal"><span lang="EN-CA">I use
                              it often for CSV processing like</span></p>
                          <p class="MsoNormal"><span lang="EN-CA"> </span><span lang="EN-CA" style="">(line tokensBasedOn:
                              $;) asArgumentsIn: [:first :second :y | …
                              ].</span></p>
                          <p class="MsoNormal"><span lang="EN-CA"> </span></p>
                          <p class="MsoNormal"><span lang="EN-CA">I am
                              just a bit unhappy with the name – it is
                              too long. It reads ok though.</span></p>
                          <p class="MsoNormal"><span lang="EN-CA">The
                              pipe character is an interesting idea. I
                              have to think about it.</span></p>
                          <p class="MsoNormal"><span lang="EN-CA"> </span></p>
                          <p class="MsoNormal"><span lang="EN-CA">I am
                              use it for a while now and I am very happy
                              with it.</span></p>
                          <p class="MsoNormal"><span lang="EN-CA"> </span></p>
                          <p class="MsoNormal"><span lang="EN-CA">Happy
                              hacking,</span></p>
                          <p class="MsoNormal"><span>Christian</span></p>
                        </div>
                      </div>
                      <div lang="DE" style="">
                        <div class="m_-976565113171439616WordSection1">
                          <p class="MsoNormal"><span> </span></p>
                          <p class="MsoNormal"><span> </span></p>
                          <div style="border-width: 1pt medium medium;
                            border-style: solid none none; padding: 3pt
                            0cm 0cm; border-color: rgb(225, 225, 225)
                            currentcolor currentcolor;">
                            <p class="MsoNormal"><b>Von:</b> Cuis-dev
                              <<a href="mailto:cuis-dev-bounces@lists.cuis.st" target="_blank" class="moz-txt-link-freetext">cuis-dev-bounces@lists.cuis.st</a>>

                              <b>Im Auftrag von </b>Luciano
                              Notarfrancesco via Cuis-dev<br>
                              <b>Gesendet:</b> Mittwoch, 21. Juni 2023
                              15:13<br>
                              <b>An:</b> Discussion of Cuis Smalltalk
                              <<a href="mailto:cuis-dev@lists.cuis.st" target="_blank" class="moz-txt-link-freetext">cuis-dev@lists.cuis.st</a>><br>
                              <b>Cc:</b> Luciano Notarfrancesco <<a href="mailto:luchiano@gmail.com" target="_blank" class="moz-txt-link-freetext">luchiano@gmail.com</a>><br>
                              <b>Betreff:</b> [Cuis-dev] Methods that
                              return multiple values</p>
                          </div>
                          <p class="MsoNormal"> </p>
                          <p class="MsoNormal">Smalltalk doesn’t have a
                            convention for methods returning multiple
                            values, and I’m not aware of any
                            implementation.</p>
                          <div>
                            <p class="MsoNormal">An example of such
                              thing is the extended gcd: ‘a xgcd: b’
                              returns g, s, t where g is the gcd, and as
                              + bt = g. Writing methods that return
                              multiple values is easy with the curly
                              brackets syntax, Integer>>#xgcd:
                              ends with something like</p>
                          </div>
                          <div>
                            <p class="MsoNormal"> ^ {g. s. t}</p>
                          </div>
                          <div>
                            <p class="MsoNormal">But using sending
                              messages that return multiple values is
                              kind of annoying, I end up doing something
                              like:</p>
                          </div>
                          <div>
                            <p class="MsoNormal"> xgcd := a xgcd: b.</p>
                          </div>
                          <div>
                            <p class="MsoNormal"> g := xgcd at: 1.</p>
                          </div>
                          <div>
                            <p class="MsoNormal"> s := xgcd at: 2.</p>
                          </div>
                          <div>
                            <p class="MsoNormal"> t := xgcd at: 3</p>
                          </div>
                          <div>
                            <p class="MsoNormal">Some years ago I
                              thought about using blocks for this, but I
                              never tried it. Today I just did a little
                              experiment implementing anArray | aBlock
                              as ‘^ aBlock valueWithPossibleArgs: self’
                              and I can do:</p>
                          </div>
                          <div>
                            <p class="MsoNormal"> (a xgcd: b) | [:g :s
                              :t| … ]</p>
                          </div>
                          <div>
                            <p class="MsoNormal"> </p>
                          </div>
                          <div>
                            <p class="MsoNormal">This is seems quite
                              nice already, I guess I’ll start using it
                              and see how it feels. But the point of
                              this mail is not to show a solution, but
                              to ask if anyone have thought about this
                              or if they know any nicer solutions. Any
                              ideas?</p>
                          </div>
                        </div>
                      </div>
                      -- <br>
                      Cuis-dev mailing list<br>
                      <a href="mailto:Cuis-dev@lists.cuis.st" target="_blank" class="moz-txt-link-freetext">Cuis-dev@lists.cuis.st</a><br>
                      <a href="https://lists.cuis.st/mailman/listinfo/cuis-dev" rel="noreferrer" target="_blank" class="moz-txt-link-freetext">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><br>
                    </blockquote>
                  </div>
                </div>
              </blockquote>
            </blockquote>
            <pre cols="72" class="moz-signature">--
❤️‍🔥🐰</pre>
          </blockquote>
          <br>
          <br>
          <pre cols="72" class="moz-signature">--
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>
        </blockquote>
      </blockquote>
      <pre cols="72" class="moz-signature">--
❤️‍🔥🐰</pre>
    </blockquote>
    <br>
    <br>
    <pre cols="72" class="moz-signature">--
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>
  

</blockquote></body></html>