perform withArguments

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
17 messages Options
Reply | Threaded
Open this post in threaded view
|

perform withArguments

OrgmiGeek
Hi,
I've read the sparse documentation on 'dynamic message' calls and I've experimented a lot and still cannot figure out how to do something that should be simple:

I want to build a message like this:

                       cellObject cellLock: aBoolean

where cellObject is to look like: cell1, cell2, cell3 ..., or cell9

I can build up cellObject like this:

                        self perform: ('cell', cellNumber asString) asSymbol

but I can't figure out how to build the full message with the key selector "cellLock:", and the value 'aBoolean'.
I've tried everything I can think of based on the terse documentation, and anything I can find on the internet, which isn't much (including this forum).

Any help would be appreciated.

Thanks
---
Under the age of 15 so don't want to post my name
Reply | Threaded
Open this post in threaded view
|

perform withArguments

Louis LaBrunda
Hi,

For your example:

        cellObject cellLock: aBoolean

where cellObject is to look like: cell1, cell2, cell3 ..., or cell9

I don't think you want or need to use #perform:.  You use #perform: when
you want to construct the message name and sent the constructed message
name to an object.

In your case you know the message you want to send, it is #cellLock:.  What
you don't know (or have easily available) is the object you want to send
the message to.

What I think you need to do is save your cell objects in an array or
collection (I will let you look up collections, but ask again if you need
help).  With something like:

cellObjects := OrderedCollection new.
cellObjects add: YourCellClass new.

Once you have a collection of your cells, you can access one or more of
them and sent the #cellLock: message to it like so:

(cellObjects at: cellNumber) cellLock: aBoolean

Good luck and keep posting if you need help.

Lou

On Mon, 23 Apr 2012 07:58:47 -0700 (PDT), OrgmiGeek
<[hidden email]> wrote:

>Hi,
>I've read the sparse documentation on 'dynamic message' calls and I've
>experimented a lot and still cannot figure out how to do something that
>should be simple:
>
>I want to build a message like this:
>
>                       cellObject cellLock: aBoolean
>
>where cellObject is to look like: cell1, cell2, cell3 ..., or cell9
>
>I can build up cellObject like this:
>
>                        self perform: ('cell', cellNumber asString) asSymbol
>
>but I can't figure out how to build the full message with the key selector
>"cellLock:", and the value 'aBoolean'.
>I've tried everything I can think of based on the terse documentation, and
>anything I can find on the internet, which isn't much (including this
>forum).
>
>Any help would be appreciated.
>
>Thanks
>
>-----
>---
>Under the age of 15 so don't want to post my name :D
-----------------------------------------------------------
Louis LaBrunda
Keystone Software Corp.
SkypeMe callto://PhotonDemon
mailto:[hidden email] http://www.Keystone-Software.com

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Bert Freudenberg
In reply to this post by OrgmiGeek

On 23.04.2012, at 07:58, OrgmiGeek wrote:

> Hi,
> I've read the sparse documentation on 'dynamic message' calls and I've
> experimented a lot and still cannot figure out how to do something that
> should be simple:
>
> I want to build a message like this:
>
>                       cellObject cellLock: aBoolean
>
> where cellObject is to look like: cell1, cell2, cell3 ..., or cell9
>
> I can build up cellObject like this:
>
>                        self perform: ('cell', cellNumber asString) asSymbol
>
> but I can't figure out how to build the full message with the key selector
> "cellLock:", and the value 'aBoolean'.
> I've tried everything I can think of based on the terse documentation, and
> anything I can find on the internet, which isn't much (including this
> forum).
>
> Any help would be appreciated.


So if I understand correctly you want to do something equivalent to this:

        cell1 cellLock: true.
        cell2 cellLock: true.
        cell3 cellLock: true.
        ... etc ...

Yes? If so, then perform is not what you are looking for. Perform lets you assemble the message selector, but not the receiver of the message. The Right Way to do this would be to have an Array of cells. Arrays are a collection of objects, and individual objects can be accessed by index. So if "cells" was an array of your cell objects, you could write

        (cells at: 1) cellLock: true.
        (cells at: 2) cellLock: true.
        (cells at: 3) cellLock: true.
        ... etc ...
       
but also iterate over all of them:

        1 to: 10 do: [:i | (cells at: i) cellLock: true]

Does that make sense?

- Bert -


_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Bert Freudenberg
In reply to this post by Louis LaBrunda
Ah that's curious - your reply did not have a Re: and was not threaded with the original message. Would have saved me to write a message very similar to yours ;)

- Bert -

On 23.04.2012, at 10:44, Louis LaBrunda wrote:

> Hi,
>
> For your example:
>
> cellObject cellLock: aBoolean
>
> where cellObject is to look like: cell1, cell2, cell3 ..., or cell9
>
> I don't think you want or need to use #perform:.  You use #perform: when
> you want to construct the message name and sent the constructed message
> name to an object.
>
> In your case you know the message you want to send, it is #cellLock:.  What
> you don't know (or have easily available) is the object you want to send
> the message to.
>
> What I think you need to do is save your cell objects in an array or
> collection (I will let you look up collections, but ask again if you need
> help).  With something like:
>
> cellObjects := OrderedCollection new.
> cellObjects add: YourCellClass new.
>
> Once you have a collection of your cells, you can access one or more of
> them and sent the #cellLock: message to it like so:
>
> (cellObjects at: cellNumber) cellLock: aBoolean
>
> Good luck and keep posting if you need help.
>
> Lou
>
> On Mon, 23 Apr 2012 07:58:47 -0700 (PDT), OrgmiGeek
> <[hidden email]> wrote:
>
>> Hi,
>> I've read the sparse documentation on 'dynamic message' calls and I've
>> experimented a lot and still cannot figure out how to do something that
>> should be simple:
>>
>> I want to build a message like this:
>>
>>                      cellObject cellLock: aBoolean
>>
>> where cellObject is to look like: cell1, cell2, cell3 ..., or cell9
>>
>> I can build up cellObject like this:
>>
>>                       self perform: ('cell', cellNumber asString) asSymbol
>>
>> but I can't figure out how to build the full message with the key selector
>> "cellLock:", and the value 'aBoolean'.
>> I've tried everything I can think of based on the terse documentation, and
>> anything I can find on the internet, which isn't much (including this
>> forum).
>>
>> Any help would be appreciated.
>>
>> Thanks
>>
>> -----
>> ---
>> Under the age of 15 so don't want to post my name :D
> -----------------------------------------------------------
> Louis LaBrunda
> Keystone Software Corp.
> SkypeMe callto://PhotonDemon
> mailto:[hidden email] http://www.Keystone-Software.com
>



_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Dawson
In reply to this post by Bert Freudenberg
Hi,

actually, that is not quite what we want to do (we meaning my son and I
in our first squeak project).

Since we were unable to assemble the message, we ended up doing a
brute force method to get it to work:

lockCell: aBoolean row: aRow column: aColumn

        self addressToCellNumber: aRow and: aColumn
        "this converts the big grid aRow, aCoulumn into a cellNumber"
       
        (aBoolean isKindof: Boolean)
          ifTrue: [
                   (cellNumber =1) ifTrue: [cell1 cellLock:aBoolean].
                   (cellNumber =2) ifTrue: [cell2 cellLock:aBoolean].
                   (cellNumber =3) ifTrue: [cell3 cellLock:aBoolean].
                   (cellNumber =4) ifTrue: [cell4 cellLock:aBoolean].
                   (cellNumber =5) ifTrue: [cell5 cellLock:aBoolean].
                   (cellNumber =6) ifTrue: [cell6 cellLock:aBoolean].
                   (cellNumber =7) ifTrue: [cell7 cellLock:aBoolean].
                   (cellNumber =8) ifTrue: [cell8 cellLock:aBoolean].
                   (cellNumber =9) ifTrue: [cell9 cellLock:aBoolean].
                ].

As you can see that is really repetitive. So, it seemed to us that one
should be able to dynamically build the message in one line,

that is why we tried to do something like:

 self perform: ('cell', cellNumber asString) asSymbol ... to build up
the "cell1 ... cell9" object. But we couldn't figure out how to build up
the rest of the message.

(One solution which is possible was presented by Louis Labranda which
involves using an ordered collection ... that should work fine ... but
is there no way of building up the message similar to our attempt, but
expanding on it?  We thought that everything's an object in Squeak ...
what happened to that?)

Thanks,

Dawson (I'm the under 15 year old's father, and I don't mind my name
being published)






On 24/04/12 7:59 AM, Bert Freudenberg wrote:

> So if I understand correctly you want to do something equivalent to this:
>
> cell1 cellLock: true.
> cell2 cellLock: true.
> cell3 cellLock: true.
> ... etc ...
>
> Yes? If so, then perform is not what you are looking for. Perform lets you assemble the message selector, but not the receiver of the message. The Right Way to do this would be to have an Array of cells. Arrays are a collection of objects, and individual objects can be accessed by index. So if "cells" was an array of your cell objects, you could write
>
> (cells at: 1) cellLock: true.
> (cells at: 2) cellLock: true.
> (cells at: 3) cellLock: true.
> ... etc ...
>
> but also iterate over all of them:
>
> 1 to: 10 do: [:i | (cells at: i) cellLock: true]
>
> Does that make sense?
>
> - Bert -
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Re: perform withArguments

Louis LaBrunda
In reply to this post by Bert Freudenberg
Hi Bert,

>Ah that's curious - your reply did not have a Re: and was not threaded with the original message. Would have saved me to write a message very similar to yours ;)
>- Bert -

Sorry about that.  I don't like seeing all the Re: Re:.... filling up the
subject line often to the point where you can't see the real subject any
more, so I often remove it.

I use Forte Agent for email and news groups because it (by and large)
treats them the same and I can keep them all in one place.  I read the post
at and posted my reply to gmane.comp.lang.smalltalk.squeak.beginners.  With
Forte Agent, all the posts, including mine were in the same thread.  What
is also curious is that I also received a copy of your post (the one I am
replying to here) as an email but none of the other posts including your
other one.

I seem to get all the posts via the news group but only some of the emails.
I would rather I just get the news group posts but don't know how to turn
off the email copies.

Anyway, I will try to remember to leave one Re: in the future.  Although
I'm not sure why it is required to keep the thread together.  If anything,
having exactly the same subject line should keep post together better than
having to ignore a lot of Re:'s to fine the real subject.

Lou

>
>On 23.04.2012, at 10:44, Louis LaBrunda wrote:
>
>> Hi,
>>
>> For your example:
>>
>> cellObject cellLock: aBoolean
>>
>> where cellObject is to look like: cell1, cell2, cell3 ..., or cell9
>>
>> I don't think you want or need to use #perform:.  You use #perform: when
>> you want to construct the message name and sent the constructed message
>> name to an object.
>>
>> In your case you know the message you want to send, it is #cellLock:.  What
>> you don't know (or have easily available) is the object you want to send
>> the message to.
>>
>> What I think you need to do is save your cell objects in an array or
>> collection (I will let you look up collections, but ask again if you need
>> help).  With something like:
>>
>> cellObjects := OrderedCollection new.
>> cellObjects add: YourCellClass new.
>>
>> Once you have a collection of your cells, you can access one or more of
>> them and sent the #cellLock: message to it like so:
>>
>> (cellObjects at: cellNumber) cellLock: aBoolean
>>
>> Good luck and keep posting if you need help.
>>
>> Lou
>>
>> On Mon, 23 Apr 2012 07:58:47 -0700 (PDT), OrgmiGeek
>> <[hidden email]> wrote:
>>
>>> Hi,
>>> I've read the sparse documentation on 'dynamic message' calls and I've
>>> experimented a lot and still cannot figure out how to do something that
>>> should be simple:
>>>
>>> I want to build a message like this:
>>>
>>>                      cellObject cellLock: aBoolean
>>>
>>> where cellObject is to look like: cell1, cell2, cell3 ..., or cell9
>>>
>>> I can build up cellObject like this:
>>>
>>>                       self perform: ('cell', cellNumber asString) asSymbol
>>>
>>> but I can't figure out how to build the full message with the key selector
>>> "cellLock:", and the value 'aBoolean'.
>>> I've tried everything I can think of based on the terse documentation, and
>>> anything I can find on the internet, which isn't much (including this
>>> forum).
>>>
>>> Any help would be appreciated.
>>>
>>> Thanks
>>>
>>> -----
>>> ---
>>> Under the age of 15 so don't want to post my name :D
>> -----------------------------------------------------------
>> Louis LaBrunda
>> Keystone Software Corp.
>> SkypeMe callto://PhotonDemon
>> mailto:[hidden email] http://www.Keystone-Software.com
>>
-----------------------------------------------------------
Louis LaBrunda
Keystone Software Corp.
SkypeMe callto://PhotonDemon
mailto:[hidden email] http://www.Keystone-Software.com

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Randal L. Schwartz
In reply to this post by Dawson
>>>>> "Dawson" == Dawson  <[hidden email]> writes:

Dawson>   (cellNumber =1) ifTrue: [cell1 cellLock:aBoolean].
Dawson>   (cellNumber =2) ifTrue: [cell2 cellLock:aBoolean].
Dawson>   (cellNumber =3) ifTrue: [cell3 cellLock:aBoolean].
Dawson>   (cellNumber =4) ifTrue: [cell4 cellLock:aBoolean].
Dawson>   (cellNumber =5) ifTrue: [cell5 cellLock:aBoolean].
Dawson>   (cellNumber =6) ifTrue: [cell6 cellLock:aBoolean].
Dawson>   (cellNumber =7) ifTrue: [cell7 cellLock:aBoolean].
Dawson>   (cellNumber =8) ifTrue: [cell8 cellLock:aBoolean].
Dawson>   (cellNumber =9) ifTrue: [cell9
Dawson>   cellLock:aBoolean].

The problem is upstream of this.  Why do you have variables named like
"cell1" through "cell9"?  At that point, your design went awry.  Back up
to there, and put those values into an array, and things will clear up.

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<[hidden email]> <URL:http://www.stonehenge.com/merlyn/>
Smalltalk/Perl/Unix consulting, Technical writing, Comedy, etc. etc.
See http://methodsandmessages.posterous.com/ for Smalltalk discussion
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Re: perform withArguments

Louis LaBrunda
In reply to this post by Dawson
Hi Dawson and Dawson's 15 year old son,

>From your code below, I assume that somewhere in your program you have
created (instantiated) nine cells in instance variables named cell1-cell9.
This is fine but you should realize that they (cell1-cell9) are variables
that hold pointers to the objects and not really the objects themselves. It
is okay to think of them as the objects because for the most part it is
easier than thinking of them as pointers to objects.  The real point is to
realize that more than one variable can point to the same instance of an
object.  For example, if I were to write:

cell10 := cell1.

There would not be two copies of cell1, there would just be two pointers to
it.  Any messages sent to cell10 would effect cell1.  This can be
confusing, so I'm not recommending doing it exactly.  But putting the nine
cells in a collection is a good idea because it gives you another way to
get to the cells without using the original variables they were created in.

You ask about everything being an object is Smalltalk.  Yes everything is
an object.  You also ask if there is a way to construct the message with
the original variable names.  I don't know how to do it and don't think you
can with many Smalltalks.  Bert may know how to do it with Squeak.  Even if
Bert knows how, I wouldn't recommend it and I hope I'm not speaking out of
turn but I doubt Bert would recommend it either.  If it is doable, it's use
would be unusual and therefor confusing.  Even #perform: is seldom used by
most programmers and even less so by beginners.

Back to your program.  I assume that you have a good reason for putting the
cells in variables named (cell1-cell9) and again that is fine but there is
no reason why you can't have the same objects addressable or accessible
from a collection.

Smalltalk's collection classes are one of its many unknown treasures.  They
are a big part of why Smalltalk code is shorter and more understandable
than code of other languages.  Check them out.  And please keep asking
questions.

Lou

>Hi,
>actually, that is not quite what we want to do (we meaning my son and I
>in our first squeak project).
>
>Since we were unable to assemble the message, we ended up doing a
>brute force method to get it to work:
>
>lockCell: aBoolean row: aRow column: aColumn
>
> self addressToCellNumber: aRow and: aColumn
> "this converts the big grid aRow, aCoulumn into a cellNumber"
>
> (aBoolean isKindof: Boolean)
>  ifTrue: [
>   (cellNumber =1) ifTrue: [cell1 cellLock:aBoolean].
>   (cellNumber =2) ifTrue: [cell2 cellLock:aBoolean].
>   (cellNumber =3) ifTrue: [cell3 cellLock:aBoolean].
>   (cellNumber =4) ifTrue: [cell4 cellLock:aBoolean].
>   (cellNumber =5) ifTrue: [cell5 cellLock:aBoolean].
>   (cellNumber =6) ifTrue: [cell6 cellLock:aBoolean].
>   (cellNumber =7) ifTrue: [cell7 cellLock:aBoolean].
>   (cellNumber =8) ifTrue: [cell8 cellLock:aBoolean].
>   (cellNumber =9) ifTrue: [cell9 cellLock:aBoolean].
> ].
>
>As you can see that is really repetitive. So, it seemed to us that one
>should be able to dynamically build the message in one line,
>
>that is why we tried to do something like:
>
> self perform: ('cell', cellNumber asString) asSymbol ... to build up
>the "cell1 ... cell9" object. But we couldn't figure out how to build up
>the rest of the message.
>
>(One solution which is possible was presented by Louis Labranda which
>involves using an ordered collection ... that should work fine ... but
>is there no way of building up the message similar to our attempt, but
>expanding on it?  We thought that everything's an object in Squeak ...
>what happened to that?)
>
>Thanks,
>
>Dawson (I'm the under 15 year old's father, and I don't mind my name
>being published)
>
>
>
>
>
>
>On 24/04/12 7:59 AM, Bert Freudenberg wrote:
>> So if I understand correctly you want to do something equivalent to this:
>>
>> cell1 cellLock: true.
>> cell2 cellLock: true.
>> cell3 cellLock: true.
>> ... etc ...
>>
>> Yes? If so, then perform is not what you are looking for. Perform lets you assemble the message selector, but not the receiver of the message. The Right Way to do this would be to have an Array of cells. Arrays are a collection of objects, and individual objects can be accessed by index. So if "cells" was an array of your cell objects, you could write
>>
>> (cells at: 1) cellLock: true.
>> (cells at: 2) cellLock: true.
>> (cells at: 3) cellLock: true.
>> ... etc ...
>>
>> but also iterate over all of them:
>>
>> 1 to: 10 do: [:i | (cells at: i) cellLock: true]
>>
>> Does that make sense?
>>
>> - Bert -
-----------------------------------------------------------
Louis LaBrunda
Keystone Software Corp.
SkypeMe callto://PhotonDemon
mailto:[hidden email] http://www.Keystone-Software.com

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Dawson
In reply to this post by Louis LaBrunda
Hi Louis,

Thanks, your advice looks very good here we hadn't even thought about
ordered collections (we studied the "Squeak by example book" before we
started our project, but sometimes it's hard to figure out when exactly
you might need to use stuff you read about, even if you do the examples)

.. I had thought there might be a way of "building up" the "cellObject
cellLock: aBoolean" ... judging from the replies, it seems that it is
either a) crazy, b) it can't be done, c) no one knows how to do it.

I think we'll give your suggestion a go when we get a few minutes.
(ah .. the we is my son and I).

Thanks,

Dawson

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Dawson
In reply to this post by Randal L. Schwartz
Hi Randal,

thanks for your note ... yes we believe we've made some mistakes in our
program already, but there are so many undocumented things in Squeak ...
(or at least we can't find them, or know what to look for) that we
figured we'd try to get a prototype going, and then fix it up as we
learned more about Squeak. Each of the cells (cell1, cell2 ... etc) are
insantiations of a Class that we wrote called SudokuCell which is one
cell in a 3cell X 3cell Sudoku block, and then nine of these blocks are
built up by the 3cells X 3 cells ... we did some brute force stuff
because we just couldn't find things that we thought we needed. We are
really quite new to Squeak. I've come from a Fortran / Assembly language
/ C / C++ / Eiffel background, and my son came from a Scratch background.

Thanks for your suggestions,

Dawson

On 24/04/12 6:07 PM, Randal L. Schwartz wrote:
           cellLock:aBoolean].
>
> The problem is upstream of this.  Why do you have variables named like
> "cell1" through "cell9"?  At that point, your design went awry.  Back up
> to there, and put those values into an array, and things will clear up.
>
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Randal L. Schwartz
In reply to this post by Dawson
>>>>> "Dawson" == Dawson  <[hidden email]> writes:

Dawson> .. I had thought there might be a way of "building up" the "cellObject
Dawson> cellLock: aBoolean" ... judging from the replies, it seems that it is
Dawson> either a) crazy, b) it can't be done, c) no one knows how to do
Dawson> it.

There are ways to do anything and everything in Squeak.  And many ways
are crazy. :)

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<[hidden email]> <URL:http://www.stonehenge.com/merlyn/>
Smalltalk/Perl/Unix consulting, Technical writing, Comedy, etc. etc.
See http://methodsandmessages.posterous.com/ for Smalltalk discussion
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Re: perform withArguments

Dawson
In reply to this post by Louis LaBrunda
Hi Louis,

thanks for your very helpful posts, particularly the most recent one ...

On 24/04/12 6:49 PM, Louis LaBrunda wrote:
> Hi Dawson and Dawson's 15 year old son,
>
>>From your code below, I assume that somewhere in your program you have
> created (instantiated) nine cells in instance variables named cell1-cell9.

Yes, you are right .. these are instantiations of a class (more info in
my other reply to Randal)
> This is fine but you should realize that they (cell1-cell9) are variables
> that hold pointers to the objects and not really the objects themselves. It
> is okay to think of them as the objects because for the most part it is

Yes, I was using inexact language here (back to everything is an object
... are pointers in Squeak considered objects then? or is this a case of
something that isn't an object in Squeak?)
> easier than thinking of them as pointers to objects.  The real point is to
> realize that more than one variable can point to the same instance of an
> object.  For example, if I were to write:
>
> cell10 := cell1.
>
Point taken.

SNIP

> Back to your program.  I assume that you have a good reason for putting the
> cells in variables named (cell1-cell9) and again that is fine but there is
> no reason why you can't have the same objects addressable or accessible
> from a collection.
>
Yeah .. I suppose with very little context it looks like we haven't got
a clue what we are doing. (Maybe we don't, but what we've written so far
works even if there is a bit of brute force kind of stuff in there). To
be honest, it is why we started asking questions, as a trained engineer,
and as an artist, I like elegant solutions, perhaps that is what drew me
to Squeak after my son began enquiring if we could learn it together.
But our program right now is certainly not very elegant yet. As we learn
more we can tweak it though.
> Smalltalk's collection classes are one of its many unknown treasures.  They
> are a big part of why Smalltalk code is shorter and more understandable
> than code of other languages.  Check them out.  And please keep asking
> questions.

Excellent. We have read the "Squeak by Example" book, but we don't
always know how to use the stuff we've read about even after following
the examples. We figured after we wrote this program, that we'd re-read
the book, and get more out of it the next time through.

Thanks again for taking the time to write your advice and suggestions,
we appreciate it.

Dawson
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Bert Freudenberg
In reply to this post by Dawson
On 24.04.2012, at 10:59, Dawson wrote:

> .. I had thought there might be a way of "building up" the "cellObject
> cellLock: aBoolean" ... judging from the replies, it seems that it is
> either a) crazy, b) it can't be done, c) no one knows how to do it.


It's a) crazy.

Of course there's a way to do it. It depends on where your variables actually are. For temporary variables, you would use thisContext.

| cell1 cell2 cell3 |
cell1 := 'this'.
cell2 := 'is'.
cell3 := 'crazy'.
ctx := thisContext.
(1 to: 3) inject: '' into: [:s :i | s, (ctx at: i), ' ']

For instance variables, you would use "instVarNamed:"

cell1 := 'this'.
cell2 := 'is'.
cell3 := 'crazy'.
(1 to: 3) inject: '' into: [:s :i | s, (self instVarNamed: 'cell', i asString), ' ']

Both of these are equally crazy. An array is much less crazy:

cell1 := 'not'.
cell2 := 'so'.
cell3 := 'crazy'.
array := {cell1. cell2. cell3}.
array inject: '' into: [:s :cell | s, cell, ' ']

But as others pointed out, in real code you would not even put cells into individual variables in the first place, but create them as an array (not OrderedCollection, since you do not need the number of cells to change).

- Bert -


_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Louis LaBrunda
In reply to this post by Dawson
Hi Dawson,

>Hi Louis,
>Thanks, your advice looks very good here we hadn't even thought about
>ordered collections (we studied the "Squeak by example book" before we
>started our project, but sometimes it's hard to figure out when exactly
>you might need to use stuff you read about, even if you do the examples)

Your welcome.  Please don't feel bad about asking what seems like dumb
questions, there really aren't any.  Also, it is often hard to know which
programming construct best fits your needs, that takes experience.

>.. I had thought there might be a way of "building up" the "cellObject
>cellLock: aBoolean" ... judging from the replies, it seems that it is
>either a) crazy, b) it can't be done, c) no one knows how to do it.

I don't know if I would say it is crazy but some might.  Mostly I use VA
Smalltalk, it is designed more for business use that Squeak is (that's not
a knock on Squeak, it's just the way it is).  In VA Smalltalk the compiler
is not included with the packaged images.  In Squeak, you always live in
the image with the compiler.  I expect there is a way to build up a string
that might look like this: "cell1 cellLock: true" and then send it to the
compiler and then execute the compiled code returned by the compiler.  I
bet Bert and many other in the group know how to do this.  But once you
play with collections, you will see it is not needed.

>I think we'll give your suggestion a go when we get a few minutes.
>(ah .. the we is my son and I).
>Thanks,
>Dawson

Sounds like a great father/son project.  I have done some with my boys but
wish I could do more, so I envy you both.

Lou
-----------------------------------------------------------
Louis LaBrunda
Keystone Software Corp.
SkypeMe callto://PhotonDemon
mailto:[hidden email] http://www.Keystone-Software.com

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Bert Freudenberg
On 24.04.2012, at 11:34, Louis LaBrunda wrote:

>
>> .. I had thought there might be a way of "building up" the "cellObject
>> cellLock: aBoolean" ... judging from the replies, it seems that it is
>> either a) crazy, b) it can't be done, c) no one knows how to do it.
>
> I don't know if I would say it is crazy but some might.  Mostly I use VA
> Smalltalk, it is designed more for business use that Squeak is (that's not
> a knock on Squeak, it's just the way it is).  In VA Smalltalk the compiler
> is not included with the packaged images.  In Squeak, you always live in
> the image with the compiler.  I expect there is a way to build up a string
> that might look like this: "cell1 cellLock: true" and then send it to the
> compiler and then execute the compiled code returned by the compiler.  I
> bet Bert and many other in the group know how to do this.  But once you
> play with collections, you will see it is not needed.


Hah! Using the compiler is even more crazy than the meta programming facilities (thisContext, instVarNamed:). But yes, it's possible:

Compiler new evaluate: 'cell1 cellLock: true' in: thisContext to: self

- Bert -

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: perform withArguments

Louis LaBrunda
In reply to this post by Dawson
Hi Dawson,

>Snip...
>Yes, I was using inexact language here (back to everything is an object
>... are pointers in Squeak considered objects then? or is this a case of
>something that isn't an object in Squeak?)

Well everything is an object in Smalltalk.  If you really had to you could
probably get to the pointer that is in the instance variable.  We should
stop talking about it as a pointer.  The only thing that cares it is a
pointer is the Smalltalk/Squeak VM (virtual machine - usually a C program).
The VM uses the pointer in the variable to find the data that is the
object.  It is much better to just think of the instance variables as the
objects as long as we remember that more than one instance variable can
address/access/point to the same object.

Spoiler alert:

I have written a Sudoku program and used many arrays to map the same cells
to make it easier to check the values of the cells.  One set of arrays
would map the nine columns of cells.  Another set of arrays maps the nine
rows of cells.  And another set to map the cells in a 3x3 block.  Each cell
is in more than one of the arrays.  And the might themselves be in arrays.

Lou
-----------------------------------------------------------
Louis LaBrunda
Keystone Software Corp.
SkypeMe callto://PhotonDemon
mailto:[hidden email] http://www.Keystone-Software.com

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Re: perform withArguments

Ben Coman
In reply to this post by Dawson
Dawson wrote:
Hi Louis,

thanks for your very helpful posts, particularly the most recent one ...

On 24/04/12 6:49 PM, Louis LaBrunda wrote:
  
Hi Dawson and Dawson's 15 year old son,

>From your code below, I assume that somewhere in your program you have
created (instantiated) nine cells in instance variables named cell1-cell9.
    

Yes, you are right .. these are instantiations of a class (more info in
my other reply to Randal)
  
This is fine but you should realize that they (cell1-cell9) are variables
that hold pointers to the objects and not really the objects themselves. It
is okay to think of them as the objects because for the most part it is
    

Yes, I was using inexact language here (back to everything is an object
... are pointers in Squeak considered objects then? or is this a case of
something that isn't an object in Squeak?)
  
easier than thinking of them as pointers to objects.  The real point is to
realize that more than one variable can point to the same instance of an
object.  For example, if I were to write:

cell10 := cell1.

    
Point taken.

SNIP

  
Back to your program.  I assume that you have a good reason for putting the
cells in variables named (cell1-cell9) and again that is fine but there is
no reason why you can't have the same objects addressable or accessible
from a collection.

    
Yeah .. I suppose with very little context it looks like we haven't got
a clue what we are doing. (Maybe we don't, but what we've written so far
works even if there is a bit of brute force kind of stuff in there). To
be honest, it is why we started asking questions, as a trained engineer,
and as an artist, I like elegant solutions, perhaps that is what drew me
to Squeak after my son began enquiring if we could learn it together.
But our program right now is certainly not very elegant yet. As we learn
more we can tweak it though.
  
Smalltalk's collection classes are one of its many unknown treasures.  They
are a big part of why Smalltalk code is shorter and more understandable
than code of other languages.  Check them out.  And please keep asking
questions.
    

Excellent. We have read the "Squeak by Example" book, but we don't
always know how to use the stuff we've read about even after following
the examples. We figured after we wrote this program, that we'd re-read
the book, and get more out of it the next time through.

Thanks again for taking the time to write your advice and suggestions,
we appreciate it.

Dawson
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners

  
I found Stephan Wessels' Laser Game [1] very useful as an end-to-end development example.
Seeing how the development of a whole application progresses using Squeak is quite insightful.
It is written against an older Squeak 3.9, but I just downloaded that version to match the tutorial.

[1] http://squeak.preeminent.org/tut2007/html/008.html
http://squeak.preeminent.org/tut2007/html/

_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners