What would Squeak be like without non-local returns

nicolas cellier ncellier at ifrance.com
Wed Nov 7 00:03:40 UTC 2007


Rob, ask this to a Compiler, an interpreter, but not to a Smalltalk 
programmer please!


Rob Withers a écrit :
> I'll just throw this out and see what turns up.   As you have probably 
> heard, I am toying with adding eventual refs to Squeak.  Unfortunately, 
> they don't play well with non-local returns.  Igor and I had been 
> discussing what could be done with methods having non-local returns adn 
> it is looking nasty.   So I thought to look at another piece of the 
> puzzle and question its existence. 
>  
> How important is non-local return to Squeak?  What would Squeak look 
> like without it?
>  
> So I thought of the first use of it, detecting an object in a 
> collection.  Here is #detect:ifNone: with non-local return:
>  
> detect: aBlock ifNone: exceptionBlock 
>     self do: [:each | (aBlock value: each) ifTrue: [^ each]].
>     ^ exceptionBlock value
>  
> and here is a version without non-local return:
>  
> detectNoNonLocalReturn: aBlock ifNone: exceptionBlock 
>     | foundElement index each |
>     index := 1.
>     [foundElement isNil and: [index <= self size]] whileTrue: [
>         (aBlock value: (each := self at: index)) ifTrue: [foundElement 
> := each].
>         index := index + 1].
>     ^ foundElement isNil
>         ifTrue: [exceptionBlock value]
>         ifFalse: [foundElement].
> 
>  
> Hopefully someone can do better.  As it stands it is much worse and I 
> just don't know how to program in Squeak without non-local returns.  It 
> feels like there is a missing helper method in there or something.  I 
> don't know.  At the point of detection we know we want to return that 
> thing and the rest of this mathod just transfers it down to the end of 
> the method.  Noise.
>  
> Tell me what you think!
>  
> Cheers,
> Rob
>  
> 
> 
> ------------------------------------------------------------------------
> 
> 




More information about the Squeak-dev mailing list