There are many books about Smalltalk.  Stephane Ducasse has made many
of them available as FREE pdfs.
Of course Pharo by Example would be a good start.  The latest edition
of Pharo by Example I have ready to hand is 8.0, 2020, where what you
want is chapter 13, Collections.

aCollection do: [:element | ...]

aKeyedCollection keysAndValuesDo: [:key :element | ...]

dictionaries are keyed and so are sequences.  You can iterate over the
elements of any collection using #do: with a one-argument block.  The
elements will be passed to the block and the keys will NOT.  If you
want the keys, must use #keysAndValuesDo: with a two-argument block.
The keys and corresponding elements will be passed to the block.

You "AI buddy" is a treacherous lying ignorant bastard.  Such is the
start of AI.

1.  Open a browser on Dictionary.
2. Select "enumerating" the the method category panel (top row, third
from left).
3. In the method panel (top row, rightmost) you will see do:
keysAndValuesDo: keysDo: valuesDo:
4. Selecting them one at a time you will see

    do: aBlock
      ^self valuesDo: aBlock
    keysAndValuesDo: aBlock
      ^self associationsDo: [:assoc |
        aBlock value: assoc key value: assoc value]
    keysDo: aBlock
      ^self associationsDo:: [:association |
         aBlock value: associatoin key]
    valuesDo: aBlock
      tally = 0 ifTrue: [^self].
      1 to: array size do: [:eachIndex |
        |eachAssociation|
        eachAssociation := array at: eachIndex.
        nil == eachAssociation ifFalse: [
          aBlock value: eachAssociation value]].

Now to fully make sense of this, you'd have to understand how a
Dictionary is implemented in Pharo.  (An Array whose elements are
reach either nil or an Association holding a key and a value.  This is
a traditional Smalltalk implementation of dictionaries, but others
except and some are better.)  But you CAN see quite easily from this
code that #do:, #keysDo:, and #valuesDo: pass just one value to their
block argument, while #keysAndValuesDo: passes TWO values.  And this
is typicalk of trying to glean understanding by looking at the system
source code:  it is easy, you won't undersand everything, but you'll
learn *something*.







On Wed, 24 Jan 2024 at 05:24, sergio ruiz <sergio....@gmail.com> wrote:
>
> I need to iterate over a dictionary.
>
> I asked the AI buddy for a little help, and he says:
>
> | myDictionary |
>
> "Create a dictionary"
> myDictionary := Dictionary new.
> myDictionary at: 'one' put: 1.
> myDictionary at: 'two' put: 2.
> myDictionary at: 'three' put: 3.
>
> "Iterate over the dictionary"
> myDictionary do: [ :key :value |
>     Transcript show: key , ' -> ', value printString ; nl.
> ].
>
> but when i try this, I get:
>
> ArgumentsCountMismatch: This block accepts 2 arguments, but was called with 1 
> argument.
>
> Is the AI using a different dialect of smalltalk?
>
> how would I go about acting on each pair?
>
> Thanks!
>
> ----
> peace,
> sergio
> photographer, journalist, visionary
>
> Public Key: 
> https://pgp.key-server.io/pks/lookup?op=get&search=0x69B08F58923AB3A2
> #BitMessage BM-NBaswViL21xqgg9STRJjaJaUoyiNe2dV
> @sergio_101@mastodon.social
> https://sergio101.com
> http://www.codeandmusic.com
> http://www.twitter.com/sergio_101
> http://www.facebook.com/sergio101
>

Reply via email to