[squeak-dev] Full block closure return value testing/using in workspace?
Das.Linux at gmx.de
Mon Nov 28 11:15:14 UTC 2022
good to see you.
> On 28. Nov 2022, at 11:58, LawsonEnglish <LEnglish5 at cox.net> wrote:
> I was trying to test some ideas and was using the new FullBlockClosure to return values for further use in a workspace.
> This works with “print it”:
> [Transcript show: 2;cr. ^2] value => 2
> This does not work:
> test := [Transcript show: 2;cr. ^2] value <do it>
> test => nil.
Yes, and that is expected.
First, it seems you want to assign the _return value_ of a block to a variable.
To achieve this, do
test := [Transcript show: 2;cr. 2] value "Note the missing caret/return"
This is because the last statement of a block will be its return value.
Second, yes, the return/caret in the block does something but apparently not the thing you expected.
The effect for caret/^/return is:
^ statement "Returns the value from statement from the method"
The last word is crucial. You return from the method, regardless of the block you are in.
Transcript showln: 'foo 1'.
[Transcript showln: 'block 1'.
Transcript showln: 'foo 2'.
Transcript showln: 'bar 1'.
Transcript showln: 'bar 2'.
If you send #foo, transcript will contain
an the return value will be 1.
This is because the Return in the block will return form the _method #foo_ (where the block is defined) and not only from the block.
What does that have to do with the Workspace???
Workspaces create artificial methods for doIts and PrintIts.
Hence, your actually sent method looks like that:
test := [Transcript show: 2;cr. ^2] value
If you run that method as print-it, "^2" returns form the DoIt method and the workspace can print the 2.
If you run that method as print-it, "^2" returns form the DoIt method but the assignment has never taken place, so test remains at its previous value, wich is nil.
I hope this helps.
> nor does this:
> test :=( [Transcript show: 2;cr. ^2] value) <do it>
> test => nil
> print it still works:
> test := ([Transcript show: 2;cr. ^2] value) => 2
> test => nil.
> In all cases, a 2 appears in the Transcript window, so I know that *something* is happening.
> I would have thought that if print-it and do-it work, then the returned value would be put in the test variable, but that is not the case.
> I can use a workspace global variable to access the output, but that kinda makes the ^ a one-trick-pony: useful for breaking out of loops, but not giving me access to the return value.
> [test := 2. Transcript show: test;cr. ^test] value => 2
> test => 2
> Is this an oversight or bug or feature for workspaces, or is it working as intended?
More information about the Squeak-dev