On 21 Apr 2014, at 18:22, Douglas Katzman dougk@google.com wrote:
;; In the test below, COMPUTE-INSIDES should be called by EXAMP-FAIL
java -jar abcl-bin-1.3.0/abcl.jar ... CL-USER(1): (defmacro ultra-fancy-macro (&optional (x 'compute-insides)) (list 'cons ''loop (list x))) ULTRA-FANCY-MACRO
CL-USER(2): (defun examp-fail (directives) (labels ((compute-insides () '((here-are-the-guts))) (compute-loop () (ultra-fancy-macro))) (compute-loop))) ; Note: deleting unused local function LABELS COMPUTE-INSIDES EXAMP-FAIL
CL-USER(3): (examp-fail nil) ; just checking.. maybe the Note was wrong? (examp-fail nil) #<THREAD "interpreter" {652D03DC}>: Debugger invoked on condition of type UNDEFINED-FUNCTION The function COMPUTE-INSIDES is undefined. Restarts: ... 3: TOP-LEVEL Return to top level. [1] CL-USER(4): 3
CL-USER(5): (defun examp-works (directives) (labels ((compute-insides () '((here-are-the-guts))) (compute-loop () (ultra-fancy-macro))) #'compute-insides ; spuriously reference it (compute-loop))) EXAMP-WORKS
CL-USER(6): (examp-works nil) (LOOP (HERE-ARE-THE-GUTS))
Without a statically observable use of compute-insides it is considered unused. Macros have expanded *before* deciding that. It is clear that the macro expands correctly based on 'examp-works'
Filed as [ticket-358][]. Thanks for the report!
[ticket-358]: http://abcl.org/trac/ticket/358