Blocks and it's temp vars

Sebastian Sastre ssastre at seaswork.com
Sun Dec 9 13:42:12 UTC 2007


Hi Mathieu,

	seems necessary for the example I've exposed but not for in the code
that was giving me trouble. Anyway.. thanks for letting me know this
curification technique to help in this cases.

	cheers,

Sebastian Sastre


> -----Mensaje original-----
> De: squeak-dev-bounces at lists.squeakfoundation.org 
> [mailto:squeak-dev-bounces at lists.squeakfoundation.org] En 
> nombre de Mathieu Suen
> Enviado el: Sábado, 08 de Diciembre de 2007 21:41
> Para: The general-purpose Squeak developers list
> Asunto: Re: Blocks and it's temp vars
> 
> Hi,
> 
> I don't think that #fixTemps should fix the problem:
> 
> The to:do: block is create once but #fixTemps copy the home 
> context This copy change the semantic scope of i.
> 
> => Even with full closure your code would not work without #fixTemps.
> 
> An other solution is to use curification:
> 
> 	stuff := #(foo bar).
> 	results := OrderedCollection new.
> 	1 to: 2 do:[:i|
> 		results add: ([:show | [Transcript cr; 
> nextPutAll: show;flush]]
> value: (stuff at: i))
> 	].
> 	results do:[:e| e value].
> 
> This work with full closure but don't work with squeak block. 
> So you still need a #fixTemps if you are not using full closure:
> 
> 	stuff := #(foo bar).
> 	results := OrderedCollection new.
> 	1 to: 2 do:[:i|
> 		results add: ([:show | [Transcript cr; 
> nextPutAll: show;flush]] fixTemps value: (stuff at: i))
> 	].
> 	results do:[:e| e value].
> 
> Cheers
> 
> On Dec 8, 2007, at 8:23 PM, Randal L. Schwartz wrote:
> 
> >
> > [copied from Seaside list, where this was asked and answered as 
> > follows]
> >
> >>>>>> "Sebastian" == Sebastian Sastre <ssastre at seaswork.com> writes:
> >
> > Sebastian> 	At first I was suspecting about the #fixCallbackTemps
> > but the block
> > Sebastian> was already malformed when reach that point.  
> > Investigating about this I'm
> > Sebastian> surprised to found that it's related to Squeak being
> > unable to do properly
> > Sebastian> this smalltalk code:
> >
> > Sebastian> 	stuff := #(foo bar).
> > Sebastian> 	results := OrderedCollection new.
> > Sebastian> 	1 to: 2 do:[:i|
> > Sebastian> 		results add: [Transcript cr; 
> nextPutAll: (stuff at:
> > Sebastian> i);flush]].
> > Sebastian> 	results do:[:e| e value]
> >
> > I believe that this is a place where you need the fixTemps 
> call on the 
> > block.
> >
> > Did you try this as:
> >
> > 1 to: 2 do: [ :i |
> >  results add: [
> >    Transcript cr;
> >       nextPutAll: (stuff at: Sebastian> i);flush
> >       ] fixTemps
> >  ].
> >
> > As in, notice the difference between:
> >
> > ((1 to: 3) collect: [:i | [i]]) collect: [:aBlock | aBlock value]
> >
> > => #(3 3 3)
> >
> > and
> >
> > ((1 to: 3) collect: [:i | [i] fixTemps]) collect: [:aBlock | aBlock 
> > value]
> >
> > => #(1 2 3)
> >
> > --
> > Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503
> > 777 0095
> > <merlyn at stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
> > Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
> > See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl 
> > training!
> >
> 
> 	Mth
> 
> 
> 
> 




More information about the Squeak-dev mailing list