blocks (was: Caper needs Self Help)

Mike Austin mike_ekim at yahoo.com
Thu Nov 20 09:17:16 UTC 2003


--- In self-interest at yahoogroups.com, Jecel Assumpcao Jr <jecel at m...> 
wrote:
> On Tuesday 18 November 2003 21:48, Mike Austin wrote:
> > A huge complication?  Aren't block closure's just anonymous 
methods
> > (which are objects) with their proto set to their enclosing
> > environment?  I thought it was something like this in self.
> 
> It does look simple when you put it that way.
> 
> But what is "their enclosing environment"?
> 
>   A) The method object in which the block literal is stored?
>   B) The closure/context/activation object cloned from A in which 
the 
> "push literal" bytecode is actually executed?

B) The activation object, or method-instance for another term

> And who are we talking about in "their proto (parent, actually) set 
to"?
> 
>   1) The block literal object?
>   2) The result of referencing 1 with a "push literal"?
>   3) The block closure resulting from sending 'value' to 2?

1) The block literal object

> In Self, we set the parent of 3 to point to B and that is far more 
> complicated to arrange than I would like. Sadly, simplifying this 
> normally leads to a loss of important functionality (like being 
able to 
> send 'value' more than once to one of your block arguments or 
recursive 
> invocation of blocks).

Although Io handles locals a bit different, it is essentially the 
same idea when I do this:

myObject = Object clone do (
` add = method ( n,
` ` return block( x, return n + x )
` )
)

a = myObject add( 10 )
b = myObject add( 20 )

write( a( 10 ), "\n" )
write( b( 10 ), "\n" )

> io closure_test.io
20
30

The returned block's proto is set to the new "Locals" instance that 
is created when calling add.  It works simply, and beautifully.

-- Mike




More information about the Self-interest mailing list