problems with scoping

View: New views
3 Messages — Rating Filter:   Alert me  

problems with scoping

by Ch Lamprecht :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi,
I face a problem with variable scoping in block-closures:

arr := Array  withAll: #(1 2 3 4 5 ).
blocks := arr collect: [ :i | [Transcript show: i] ].
blocks do:[:item | item value].

This prints 55555 because blocks contains
[Transcript show: i]
for all of its elements and accesses the current value of i.

I would like to have blocks contain
[Transcript show: 1]
[Transcript show: 2]
[Transcript show: 3]
etc.

so it would print 12345

TIA Christoph

_______________________________________________
Beginners mailing list
Beginners@...
http://lists.squeakfoundation.org/mailman/listinfo/beginners

RE: problems with scoping

by Ramon Leon-5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

> Hi,
> I face a problem with variable scoping in block-closures:
>
> arr := Array  withAll: #(1 2 3 4 5 ).
> blocks := arr collect: [ :i | [Transcript show: i] ].
> blocks do:[:item | item value].
>
> This prints 55555 because blocks contains [Transcript show:
> i] for all of its elements and accesses the current value of i.
>
> I would like to have blocks contain
> [Transcript show: 1]
> [Transcript show: 2]
> [Transcript show: 3]
> etc.
>
> so it would print 12345
>
> TIA Christoph

Try this instead.

arr := Array  withAll: #(1 2 3 4 5 ).
blocks := arr collect: [ :i | [Transcript show: i] fixTemps ].
blocks do:[:item | item value].

Squeak doesn't have true block closures, fixTemps is the standard way around
this.

Ramon Leon
http://onsmalltalk.com 

_______________________________________________
Beginners mailing list
Beginners@...
http://lists.squeakfoundation.org/mailman/listinfo/beginners

Re: problems with scoping

by Mathieu SUEN :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Ch Lamprecht a écrit :

> Hi,
> I face a problem with variable scoping in block-closures:
>
> arr := Array  withAll: #(1 2 3 4 5 ).
> blocks := arr collect: [ :i | [Transcript show: i] ].
> blocks do:[:item | item value].
>
> This prints 55555 because blocks contains
> [Transcript show: i]
> for all of its elements and accesses the current value of i.
>
> I would like to have blocks contain
> [Transcript show: 1]
> [Transcript show: 2]
> [Transcript show: 3]
> etc.
>
> so it would print 12345
>
> TIA Christoph
>

You can read this to understand:
http://lists.squeakfoundation.org/pipermail/squeak-dev/2006-October/109809.html

        Math
_______________________________________________
Beginners mailing list
Beginners@...
http://lists.squeakfoundation.org/mailman/listinfo/beginners
LightInTheBox - Buy quality products at wholesale price