On Tue, Mar 25, 2014 at 12:05 PM, Frank Shearar <frank.shearar@gmail.com>wrote:
On 24 March 2014 23:33, phil@highoctane.be <phil@highoctane.be> wrote:
On Tue, Mar 25, 2014 at 12:11 AM, Eliot Miranda <eliot.miranda@gmail.com
wrote:
On Mon, Mar 24, 2014 at 4:02 PM, phil@highoctane.be <phil@highoctane.be
wrote:
I am curious.
Maybe on the first one, substitute something when a DNU is encountered. Like logging undefined receivers.
I wonder how the next one behaves on JITted methods. I fear that offset errors may lead to weird errors.
It *should* "just work" :-) (provided the jump distance of -12 is correct). The VM traps assignments to variables of contexts, and converts them to vanilla contexts. Therefore the jump doesn't occur in JITTED code but back in normal interpreted bytecode.
How magical!
On Mon, Mar 24, 2014 at 11:51 PM, Pavel Krivanek <pavel.krivanek@gmail.com> wrote:
Who can find the most useful usage of this?
thisContext instVarNamed: #receiver put: 42. self factorial
GOTO statement in Pharo:
FileStream stdout nextPutAll: 'Hello world'; lf. thisContext jump: -12. Let's collect the next ones :-)
this is my favourite, and would lock-up a strict blue book VM. (I once locked up Allen Wirfs-Brock's 4404 with this and he wasn't best pleased [forgive me Allen])
| a | a := Array with: #perform:withArguments: with: nil. a at: 2 put: a. a perform: a first withArguments: a
;-)
The infinite is near.
Not as blocking, but still... (Alt-. interrupts this one)
Crazy>>run Continuation currentDo: [ :cc | here := cc ]. here value: true.
Crazy new run
BTW, is there any support for partial continuations in Pharo? Continuations like this one look like full continuations and that's *huge*.
Yes: http://ss3.gemstone.com/ss/Control.html
Last time I checked I did need to add a shim (see the ControlPharo package), but it did load cleanly and pass all its own tests.
I have now loaded the SS3 version. All tests do pass. I loaded the one from SqueakSource before.
Control not only provides a convenient way of making partial continuations (of the shift/reset sort, if you're familiar with the literature),
Nice article of yours. Now, I have something to chew on :-)
but also _delimited_ dynamic variables. As soon as you start stack-slicing with partial continuations, you quickly find that standard implementations of dynamic variables fail in all sorts of nasty ways. Fundamentally, "normal" dynamic variables _cannot_ work cleanly with partial continuations because they either close over too much of the dynamic environment, or too little.
Here's some reading on the topic:
[1] http://okmij.org/ftp/Computation/dynamic-binding.html [2] http://www.cs.rutgers.edu/~ccshan/dynscope/DDBinding.pdf [3] http://www.lshift.net/blog/2012/06/27/resumable-exceptions-can-macro-express...
Ah, more head banging against the desk, sweet. Phil
frank
Cheers, -- Pavel
-- best, Eliot