On 04.10.2011, at 17:58, Erlis Vidal wrote:

> Hi all, 
> 
> I was looking at the implementation of some of the flow control methods and I 
> have a question with the method whileTrue. 
> 
> First of all, I can see two identical implementation in the classes 
> BlockClosure and BlockContext the implementation is this 
> 
> whileTrue: aBlock 
>     "Ordinarily compiled in-line, and therefore not overridable.
>     This is in case the message is sent to other than a literal block.
>     Evaluate the argument, aBlock, as long as the value of the receiver is 
> true."
> 
>     ^ [self value] whileTrue: [aBlock value]
> 
> I'm assuming here that there's another class Block I'm missing (something 
> like the literal block mentioned in the comment) which is the one that 
> contains the logic I was looking for. But I'm not able to find any other 
> whileTrue method in my image.

"Block" is just short for either BlockClosure or BlockContext. "Literal" blocks 
are those written directly with square brackets. If you store a block in a 
variable and pass that variable, the block would not be literal.

> What's the difference between BlockClosure and BlockContext? 


BlockClosures are BlockContexts Done Right.

If you wrote square brackets in older Squeak versions (3.x) you would get a 
BlockContext. In a current Squeak you get a BlockClosure.

So since now we only have closures, the difference is only of historic 
interest. You can do some things with closures that you couldn't do with block 
contexts, e.g. recursive blocks:

| fac |
fac := nil.
fac := [:n | n > 1 ifTrue: [n * (fac value: n - 1)] ifFalse: [1]].
fac value: 10

This would not have worked with contexts.

- Bert -


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

Reply via email to