2010/4/21 Lukas Renggli <renggli@gmail.com>:
thisContext is a special object for representing an activation in a stack frame in a stack-based VM.
Actually "thisContext" represents *the current* activation/stack-frame.
  foo: anObject     ^ thisContext at: 1
is the same as
  foo: anObject     ^ anObject
Of course, "this" refers to "the current" in common language usage.
There are two kinds of contexts: Method Contexts and Block Contexts.
Actually in Pharo images there are only instances of MethodContext. Though you can ask the context if it comes from a block by sending the message #isExecutingBlock.
Actually in Pharo there is a BlockContext class, which is not instantiated anymore after the introduction of the closure compiler? In other Smalltalks aBlockContext is the resulting context of a block activation during its evaluation and is activated by sending #value,.this fills thisContext with the execution information inside the block. In Squeak (or the old compiler) block contexts were created using #blockCopy:, now I see #closureNumCopied:numArgs:. Does this means BlockContext could be completely removed and replaced with MethodContext semantics? I've removed the BlockContext class and used Pharo a little bit with no problems, maybe some Decompiler issues in the Debugger... Now, test yourself before evaluating :) what should be the result of this expression? [: arg | arg perform: #isExecutingBlock ] value: thisContext Can somebody justify the result?
Context creation is optimized in the VM in most Smalltalks, so it's only really created as an object in the environment (reified) when it's specifically needed through "thisContext".
In Pharo contexts are not reified like that. Stack-frames are actual objects at all times. However, for speed reasons, their creation and garbage-collection is optimized by the VM. Stack frames get automatically recycled if nobody refers to them.
I think is what I said :)
There are several applications related with computational reflection (Reflective Programming, Meta-Programming, MOP, etc) which makes use of the current context.
Also: exception handling, generators, continuations, co-routines, ...
For another fun use of "thisContext" check this Stack-Overflow question:
http://stackoverflow.com/questions/2500483/is-there-a-way-in-a-message-only-...
Lukas
-- Lukas Renggli www.lukas-renggli.ch
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project