<!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">
    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
      cite="mid:e1b225e8-4867-50df-c751-170cd4a6d247@callistohouse.org"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <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 src="cid:part1.06000006.00060206@cuis.st" 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"
        cite="mid:abdf8bb6-80ab-e5c9-2b1d-7571d0f6a047@callistohouse.org">
        <meta http-equiv="Content-Type" content="text/html;
          charset=UTF-8">
        <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"
cite="mid:CAL5GDyrAapan9L5do9F_rM1oEkB_iE9=tfHu-i14ew25fHHH6A@mail.gmail.com">
          <meta http-equiv="content-type" content="text/html;
            charset=UTF-8">
          <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"
                  moz-do-not-send="true" 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 link="#0563C1" vlink="#954F72" 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 link="#0563C1" vlink="#954F72" 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
                          href="mailto:cuis-dev-bounces@lists.cuis.st"
                          target="_blank" moz-do-not-send="true"
                          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" moz-do-not-send="true"
                          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" moz-do-not-send="true"
                          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"
                  moz-do-not-send="true" 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"
                  moz-do-not-send="true" 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>
  </body>
</html>