then I get dak@lola:/usr/local/tmp/guile$ meta/guile /tmp/zorpo.scm ;;; note: source file /tmp/zorpo.scm ;;; newer than compiled /usr/local/tmp/guile/cache/guile/ccache/2.2-LE-4-3.4/tmp/zorpo.scm.go ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the --no-auto-compile argument to disable. ;;; compiling /tmp/zorpo.scm ;;; compiled /usr/local/tmp/guile/cache/guile/ccache/2.2-LE-4-3.4/tmp/zorpo.scm.go Warning: Unwind-only `stack-overflow' exception; skipping pre-unwind handler. Warning: Unwind-only `stack-overflow' exception; skipping pre-unwind handler. and what of it? If you really, really must, do one recursive top-level check of everything before starting. But re-verifying structural integraty after applying every single rule is madness. Actually, replacing '+ by 'and in that example will lead to the same bomb-out. So it does not look like structural integrity verification is happening anyway. > The simplest solution would be to replace all occurrences of "y ..." > with ". y" in the two macros above, but that has the slight downside > of making the error message much less comprehensible if you use a > dotted tail in an 'and' or 'or' form. Maybe that's not worth worrying > about though. If you care about nice error messages, do a single upfront check. > Alternatively, we could use procedural macros here, but we'd have to > limit ourselves to very primitive forms in the code because this is so > early in the bootstrap. I don't think it's worth it just for and/or (the form generated by or actually seems more prone to buildup and churn). But for syntax replacements in general? Sure. You don't want quadratic behavior in bare-bones replacements like these. -- David Kastrup