The simplest way seems to be returning a magic value whenever a Scheme primitive is executed. An alternative is to use setjump() to provide an error exit point. Let's try the latter. Using USE_SETJUMP Done. It works by calling _Error_1 in the context of the C foreign function, followed by a longjmp() which aborts the current C stack and returns to the function's invokation point.