<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <title></title>
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 6/24/2023 10:05 PM, rabbit via Cuis-dev wrote:
    <blockquote
cite="mid:eT7cOmn7LhVD87fLR_xz4V1LP1yUG0hiy2caeHlT2PMK2b4ZMcOUDAh8abEMEWrZ5pEj1yoI2EKcfKXxu3OCMDl6ubINoeel0ET3QmMu180=@callistohouse.org"
      type="cite">
      <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. </div>
    </blockquote>
    <br>
    And the new guy doesn't include the method you are resuming! Please
    check references to MethodInCallStackToBecomeInvalid . If the new
    guy includes the same exact method, then it makes sense to resume
    its execution. Maybe you can include that method.<br>
    <br>
    <blockquote
cite="mid:eT7cOmn7LhVD87fLR_xz4V1LP1yUG0hiy2caeHlT2PMK2b4ZMcOUDAh8abEMEWrZ5pEj1yoI2EKcfKXxu3OCMDl6ubINoeel0ET3QmMu180=@callistohouse.org"
      type="cite">
      <div dir="auto">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?</div>
    </blockquote>
    <br>
    Not in Cuis base image. That programming pattern is completely wrong
    in my view. But I won't police your code, I'll just be very careful
    with the Cuis base image.<br>
    <br>
    <blockquote
cite="mid:eT7cOmn7LhVD87fLR_xz4V1LP1yUG0hiy2caeHlT2PMK2b4ZMcOUDAh8abEMEWrZ5pEj1yoI2EKcfKXxu3OCMDl6ubINoeel0ET3QmMu180=@callistohouse.org"
      type="cite">
      <div dir="auto"><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
        moz-do-not-send="true" class=""
href="mailto:On%20Sat,%20Jun%2024,%202023%20at%2020:38,%20Juan%20Vuletich%20%3C%3Ca%20href=">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.03010406.06090709@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 moz-do-not-send="true"
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 moz-do-not-send="true" class="loading-internal"
                    alt="" height="398" width="862"></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 class="moz-signature" cols="72">--
❤️‍🔥🐰



</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 moz-do-not-send="true"
                            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 style="" lang="DE">
                            <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 style="font-family:
                                  "Courier New";" lang="EN-CA">SequenceableCollection>>asArgumentsIn:


                                  aBlock</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  "Evaluate aBlock with the receiver's
                                  elements as parameters.</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  aBlock takes its arguments from the
                                  receiver.</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  'ok'</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  #(1 2 3) asArgumentsIn: [:a :b :c | a
                                  + b + c]</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  #(1 2 3) asArgumentsIn: [:a :b | a +
                                  b]</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  #(1 2 3) asArgumentsIn: [:a | a]</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  #(1 2 3) asArgumentsIn: [42]</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  'not ok'</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  #(1 2 3) asArgumentsIn: [:a :b :c :d |
                                  a + b + c + d]</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  "</span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                </span></p>
                              <p class="MsoNormal" style="margin-left:
                                35.4pt;"><span style="font-family:
                                  "Courier New";" lang="EN-CA">
                                  ^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
                                  style="" lang="EN-CA">(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 style="" lang="DE">
                            <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 moz-do-not-send="true"
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
                                    moz-do-not-send="true"
                                    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
                                    moz-do-not-send="true"
                                    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 moz-do-not-send="true"
                            href="mailto:Cuis-dev@lists.cuis.st"
                            target="_blank"
                            class="moz-txt-link-freetext">Cuis-dev@lists.cuis.st</a><br>
                          <a moz-do-not-send="true"
                            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 class="moz-signature" cols="72">--
❤️‍🔥🐰</pre>
              </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>
            </blockquote>
          </blockquote>
          <pre class="moz-signature" cols="72">--
❤️‍🔥🐰</pre>
        </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>
      </blockquote>
    </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>