[squeak-dev] Full block closure return value testing/using in workspace?

Tobias Pape Das.Linux at gmx.de
Mon Nov 28 11:15:14 UTC 2022

Hi Lawson

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.

Two things: 
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.

Like so:


  Transcript showln: 'foo 1'.
  self bar: 
    [Transcript showln: 'block 1'.
    ^ 1].
  Transcript showln: 'foo 2'.
  ^ 2.

bar: aBlock

  Transcript showln: 'bar 1'.
  aBlock value.
  Transcript showln: 'bar 2'.

If you send #foo, transcript will contain

 foo 1
 bar 1
 block 1

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.

Best regards

> 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?
> Lawson

More information about the Squeak-dev mailing list