[armedbear-devel] MACROLET environment issue in DO?
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.
Hi! On Sat, Aug 11, 2012 at 11:32 AM, Theam Yong Chew <senatorzergling@gmail.com
wrote:
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.
Thanks for the well-composed bug report. Yes, it's a bug. Just committed the fix. It's easy to backport: see r14069. Thanks again! Bye, Erik.
participants (2)
-
Erik Huelsmann
-
Theam Yong Chew