5 Apr 2000 graydon   » (Master)

the temperature plummets

spent a little while in number theory class thinking about the discussion we had here regarding exceptions the other day. got to thinking that there's a powerful generalization lurking here. I've recently been stupendously impressed with the flexibility and clarity of sather's iterator abstraction, which neatly handles all repetitive control flow mechanisms in a single, clean form; so I got to wondering if there's a similarly lucid way of describing things which stack-local-objects are used for (in good C++). Especially when considering jwz's salient comment about general purpose macros for transforming control, I think there is:

what I'm thinking of is a way to subsume the try, catch, throw, finally, return and synchronized statements in Java; as well as the concept of auto_ptr and the resource-aquisition-is-initialization pattern in C++. The way to do this is to introduce a language-supported parametric type akin to this:

template <class Inner,Class Outer> Frame {
	void enter(Thread me);
	Outer leave(Thread me, Inner retval);
};
Then you introduce a new language keyword frame and construct of the following form:
frame (<Frame-Expr>) {
...
}
The enter method is called when a thread enters the frame, and the leave method is called when a thread leaves the frame, implicitly transforming the Inner return value of the block contained in the frame into the Outer return value of the frame. then augment the return keyword to take an argument specifying which containing frame the return should return to. Omission of the parameter implicitly means "current method", otherwise a named Frame is expected.

This approach accomodates a lot of strategies.

You can, for instance, have a virtual method which produces a Frame which handles "appropriate synchronization" of an object, and let subclasses decide if that means a local mutex, a static mutex, a semaphore, or nothing at all. You can do exception handling by constructing a frame of type Frame<union<ExceptionType,ReturnType>,ReturnType>, or you can do exception propagation by constructing a frame of type Frame<union<ExceptionType,ReturnType>,union<ExceptionType,ReturnType>> You can (as Ankh suggested) pass an error reporting object into a method, and have it used as a Frame around a sensitive block of code.You can factor out a whole class of exception handling code into a Frame produced from a common method implemented in a mixin class. You can make a finalizer which cleans up objects when it exits, like an auto_ptr.

There are at least 3 advantages to this approach over stack objects in C++:

  • it works with a references-only language like java
  • it requires that programmers be aware of it, and eases them into the task of writing their own Frames, since they already use it for synchronization and exception handling. many C++ people don't actually know any methodology involving stack-local objects
  • it's possible to parameterize behaviour more easily. stack-local objects must have concrete type (must be named by their constructor), but a frame block must simply typecheck. the Frame object it uses can be a subtype of the checked type.

Comments? I'm curious if anyone either (a) has seen this before, or (b) thinks it would work.

fatjim: go see a chiropractor. it's probably your neck. my arms were killing me, I got a chiro to adjust my neck, a pinched nerve became unpinched -- now my arms don't hurt anymore.

dria: I rank someone a master if either (a) I have already learned something really significant from them, or else (b) their work leads me to believe that if/when I sit down and get to know them, I'll learn something really significant from them.

Latest blog entries     Older blog entries

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!