The following form fails to compile correctly:
(macrolet ((output-var (var) `(format t "var = ~A~%" ,var))) (defun baz (bat) (output-var bat)))
When the above form has been compiled and loaded
CL-USER> (baz 3)
errors by complaining.
The function OUTPUT-VAR is undefined.
Interestingly abcl-0.12.0 behaves correctly, but abcl-0.15.0 fails (For some reason, I don't currently have abcl-0.{13,14} handy to test).
I distilled this bug down from trying to compile CXML, so this is a "real-world" problem. CXML bombs on compiling its "xml/xml-parse.lisp" at this point:
… (macrolet ((with-context ((validator) &body body) `(let ((*ctx* (context ,validator)) (*validate* t)) (with-scratch-pads () ;nicht schoen ,@body)))) (defmethod sax:start-element ((handler validator) uri lname qname attributes) uri lname (with-context (handler) (validate-start-element *ctx* qname) (process-attributes *ctx* qname attributes))) …
with
Wrong number of arguments for CXML::HANDLER. [Condition of type PROGRAM-ERROR]
I assume that my "distilled" version has the same cause, namely that the precompiler is not expanding macros properly for function/method definitions in top-level MACROLET forms, but I explicitly mention my root problem here if the slightly different error turns out to provide a clue that I have missed.