[Nickle]Twixt and exceptions
Barton C Massey
bart@cs.pdx.edu
Tue, 20 Feb 2001 22:38:13 -0800
Do the predicated twixt with an optional else
part:
twixt (mutex.tryAcquire (m); mutex.release (m))
{
stuff with m locked
} else {
tryAcquire() failed
}
Bart
In message <20010221042338.EC46BDF801@orestes.keithp.com> you wrote:
>
> Two of the unfinished pieces in nickle are exception handling and "critical
> sections" -- pieces of code executed on the way out of a stack context
> during exeception handling.
>
> * critical sections
>
> A big problem Bart and I have seen with other languages is that the
> enter/leave portions of "critical sections" is assymetrical, we usually
> have:
>
> lock_mutex ()
> try {
>
> ... lots of code here ...
>
> } finally {
> unlock_mutex ();
> }
>
> or some such; this is unpleasing to the eye; the lock and unlock are
> separated both by a large distance and are actually at different
> indentation levels.
>
> Instead, Bart came up with the following syntax:
>
> twixt (<enter-expr>; <leave-expr>) <statement>
>
> After <enter-expr> is executed, <leave-expr> is guaranteed to be executed.
>
> So, you would do:
>
> twixt (mutex.acquire (m); mutex.release (m))
> {
> stuff with m locked
> }
>
> Questions: how should this work with non-blocking syncronization
> primitives (mutex.tryAcquire, semahpore.test)?
>
> Suggestion: initial statement is boolean, entry to twixt is denied if the
> first statement evaluates to False.
>
> twixt (mutex.tryAcquire (m); mutex.release (m))
> {
> stuff with m locked
> }
>
> Problem: assymetry returns, need to capture tryAcquire result to learn if
> 'stuff' was executed.
>
> Alternative: force program to handle this case:
>
> twixt (got = mutex.tryAcquire (m); got ? mutex.release (m) : 0)
> {
> if (got) {
> stuff with m locked;
> }
> }
>
> or
> if (mutex.tryAcquire(m) twixt (; mutex.release (m))
> {
> stuff with m locked;
> }
>
>
> Problem: Extra scope, or assymetrical usage.
>
> Suggestions are welcome; I'm leaning towards the predicated twixt form.
>
> * Exceptions.
>
> Here's the current plan, it's not implemented but probably will be soon.
>
> Exceptions are symbols declared with function-like syntax that can
> be dynamically bound to a particular lamda. Uncaught exceptions terminate
> the thread with an error. An example would be helpful here:
>
> exception missing_q (string line);
>
> ...
>
> s = "foobar";
> try {
> if (strings.index (s, "q") < 0)
> throw missing_q (s);
> } catch missing_q (string line) {
> printf ("Hey, bozo, no 'q' found in %s\n", line);
> }
>
> Question: the 'catch' and 'throw' keywords are completely gratuitous
> syntactic sugar. Can I get rid of them? Or would the alternative be too
> confusing?
>
> Would you prefer this syntax instead:
>
> {
> catch missing_q (string line)
> {
> printf ("Hey, bozo, no 'q' found in %s\n", line);
> }
>
> if (strings.index (s, "q") < 0)
> throw missing_q (s);
>
> }
>
> One I'm not fond of:
>
> catch missing_q (string line)
> {
> printf ("Hey, bozo, no 'q' found in %s\n", line);
> }
> {
> if (strings.index (s, "q") < 0)
> throw missing_q (s);
> }
>
> This last form would require the 'catch' keyword to keep it parsable.
>
> Complaints? Comments?
>
> -keith
>
>
>
> _______________________________________________
> Nickle mailing list
> Nickle@keithp.com
> http://keithp.com/mailman/listinfo/nickle