[Newbies] Block and Closure
anlarionov at gmail.com
Fri Apr 10 16:40:27 UTC 2009
Thanks, all. Now I'm understood differences.
On Fri, Apr 10, 2009 at 20:09, Ralph Johnson <johnson at cs.uiuc.edu> wrote:
> In the original Smalltalk, blocks were almost but not quite closures.
> The ANSII standard says they are closures. As far as I know, all the
> Smalltalks except Squeak make blocks be closures. So, changing the
> way Squeak implements blocks will bring it into compliance with the
> standard and more like other implementations of Smalltalk
> I first ran into the problem of blocks not being closures when I tried
> to write a program like
> (1 to: 100) do: [:each | [self process: each] fork]
> This will fork 100 processes. If the first spawned process (the one
> running [self process: 1]) starts to run right away, it will behave
> like I expect. But suppose the main thread creates all 100 processes
> before it gives up control. Then the value of "each" will be 100 and
> so all 100 processes will execute [self process: 100], which is not at
> all what I expect. If blocks were closures then each execution of the
> block would have its own context to store its argument, i.e. there
> would be 100 versions of "each".
> You can see a similar problem if you try to implement factorial the
> way that Scheme programmers do it.
> factBlock := [:x | x <= 1 ifTrue:  ifFalse: [x * (factBlock value: x-1)]].
> factBlock value: 100
> Squeak complains that you are trying to evaluate a block recursively.
> Most Smalltalk programmers would never try this, so they don't care
> about Squeak's limitations. But people coming to Squeak from a
> functional programming language are annoyed, because they expect that
> they can do this with blocks, but blocks are not complete closures.
> -Ralph Johnson
> Beginners mailing list
> Beginners at lists.squeakfoundation.org
More information about the Beginners