Josef Wolf <j...@raven.inka.de> writes: > On Fri, Mar 19, 2010 at 05:15:57PM +0100, Andreas Rottmann wrote: >> defmacros are bound to bite you in the proverbial ass real hard when you >> combine them with modules, so it's best to avoid them like the >> plague. At least that's my experience, FWIW. > > Thanks for the warning. I'd like to understand why this is dangerous, though. > Do you have an example for me? > Yes, consider the following two modules:
;;---------------8<---------------- (define-module (test a) #:export-syntax (test-a) #:use-module (srfi srfi-34) #:use-module (srfi srfi-35)) (define (funny-condition? c) (and (message-condition? c) (string-prefix? "FUNNY: " (condition-message c)))) (define-syntax test-a (syntax-rules () ((test-a expr) (guard (c ((funny-condition? c) 'funny)) expr)))) (define-module (test b) #:use-module (srfi srfi-34) #:use-module (srfi srfi-35) #:use-module (test a)) (test-a (raise (condition (&message (message (string-append "FUNNY: ")))))) ;;---------------8<---------------- Now running it causes this: WARNING: (test b): imported module (srfi srfi-34) overrides core binding `raise' Throw to key `unbound-variable': ERROR: In procedure module-lookup: ERROR: Unbound variable: funny-condition? Entering the debugger. Type `bt' for a backtrace or `c' to continue. Now why doesn't this work, and return 'funny in module B's body? It's because currently, the `guard' macro from SRFI-34 is implemented with `define-macro', and it hence throws away (among other things) the information what `funny-condition?' refers to when being expanded. The fully expanded code of the `test-a' form now contains a free reference to `funny-condition?', while it should have a bound reference referring to the `funny-condition?' defined in module (test a). As you can see, the use of a single defmacro can poison your otherwise perfectly fine hygienic, referentially transparent, syntax-rules macros. > Do common-lisp macros suffer from the same problems or is this a scheme > specific problem? > I've just superficial knowledge of CL, but AFAIK, Common Lisp macros still have similiar issues, but they are (largely) mitigated by the fact that CL has a function namespace separate from the variable namespace. > Please note that I am very new to lisp, so please don't beat me if I ask > dumb questions :-) > They were actually very reasonable questions! Regards, Rotty -- Andreas Rottmann -- <http://rotty.yi.org/>