Hi devs,
I've just stumbled upon something that looks buggy. In the following form, I am particularly focusing on the end-test-form in the do macro.
(macrolet ((foo () '(print "macrolet foo"))) (foo) (do ((p 0 (1+ p))) ((foo)) (print "LOOP"))) Prints "macrolet foo" "macrolet foo" then returns ==> NIL
Looks fine, but if I wrap that in a function,
(defun use-foo () (macrolet ((foo () '(print "macrolet foo"))) (foo) (do ((p 0 (1+ p))) ((foo)) (print "LOOP"))))
(use-foo) Prints "macrolet test" then raises an error:
The function FOO is undefined. [Condition of type UNDEFINED-FUNCTION]
Restarts: 0: [CONTINUE] Try again. 1: [USE-VALUE] Specify a function to call instead. 2: [RETURN-VALUE] Return one or more values from the call to FOO. 3: [RETRY] Retry SLIME interactive evaluation request. 4: [*ABORT] Return to SLIME's top level. 5: [ABORT] Abort thread.
Backtrace: 0: (#<FUNCTION {1879842}> #<UNDEFINED-FUNCTION {1426780}> #<FUNCTION {1879842}>) 1: (APPLY #<FUNCTION {1879842}> (#<UNDEFINED-FUNCTION {1426780}> #<FUNCTION {1879842}>)) 2: (SYSTEM::RUN-HOOK SYSTEM::*INVOKE-DEBUGGER-HOOK* #<UNDEFINED-FUNCTION {1426780}> #<FUNCTION {1879842}>) 3: (INVOKE-DEBUGGER #<UNDEFINED-FUNCTION {1426780}>) 4: (ERROR #<UNDEFINED-FUNCTION {1426780}>) 5: (SYSTEM:UNDEFINED-FUNCTION-CALLED FOO NIL) 6: (FOO) Locals: "??" = "??" 7: (USE-FOO) Locals: "??" = "??" 8: (SYSTEM::%EVAL (USE-FOO)) Locals: "??" = "??" 9: (EVAL (USE-FOO)) Locals: "??" = "??" ....
If I define a function with same name as the local macro,
(defun test () (print "function test"))
(defun use-test () (macrolet ((test () '(print "macrolet test"))) (test) (do ((p 0 (1+ p))) ((test)) (print "LOOP"))))
(use-test) Prints "macrolet test" "function test" then returns ==> NIL
If I manually macroexpand the do form & substitute the expansion back into the function (with some gensym tidy up),
(defun macro-expanded-do () (macrolet ((test () '(print "macrolet test"))) (test) (BLOCK NIL (LET ((P 0)) (TAGBODY (GO G4759) G4758 (PRINT "LOOP") (PSETQ P (1+ P)) G4759 (UNLESS (TEST) (GO G4758)) (RETURN-FROM NIL (PROGN)))))))
(macro-expanded-do) Prints "macrolet test"
"macrolet test" ; No value and returns ==> NIL
Is this a bug? I'm running on Windows, using
(lisp-implementation-version) ==> "1.0.1-svn-13750-13751"
Thanks,
Yong.