wmb@MITCH.ENG.SUN.COM (01/05/91)
\ Deep in the kernel... : ABORT TRUE THROW ; ... \ Toward the end of the kernel... : INTERACT QUERY INTERPRET ; : QUIT RP0 @ RP! BEGIN ['] INTERACT CATCH IF ." Aborted" ELSE " OK" THEN CR AGAIN ; THROW need not test for a null handler because there is always a handler at the top level. Also note that the CATCH in QUIT automatically cleans up the data stack! Furthermore, with ABORT defined in terms of THROW (instead of needing to call QUIT), the kernel no longer has ANY forward references, so the metacompiler can be simpler (if that matters). The other (and this is a BIG one) advantage of defining ABORT in terms of THROW is that the user program can CATCH system aborts. When I changed my kernel implementation to use this technique, the kernel got smaller, because it gave me the ability to release resources at exactly the right places. In particular, I do a CATCH in INCLUDE-FILE . If it receives a THROW , it closes the file and re-executes the THROW , thus neatly handling the "clean up nested includes" problem. I do a similar thing to release allocated memory buffers, although that tends to be an application problem rather than a kernel problem. Mitch Bradley, wmb@Eng.Sun.COM