problems with scoping

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

problems with scoping

Ch Lamprecht
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
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

RE: problems with scoping

Ramon Leon-5
> 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
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: problems with scoping

Mathieu SUEN
In reply to this post by Ch Lamprecht
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
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners