|WikiProject Computing||(Rated C-class, Low-importance)|
Call by reference
Macros transform arguments into call by reference? Weird. orthogonal 19:25, 20 Nov 2003 (UTC)
- No, macros transform code before it hits the compiler or interpreter. There's no references at all, at macro expansion time, all you have available as arguments are tokens. -BrianCully 14:54, 2 September 2006 (UTC)
It's great that there's a C example here, but I've never heard anybody speak of hygienic macros in the context of C -- only in dialects of Lisp. Could we get (1) a similar example of the hygiene problem in Common Lisp, (2) the same example in Scheme (which claims to have hygienic macros), and (3) how a Common Lisper would resolve the problem? Thanks!
- That's fine, but a lot of us don't speak Lisp, so the examples as given are utterly impenetrable. I appreciate the Lisp examples; I wonder if it's possible to "translate" some of them into similar C code? --Doradus 00:24, 7 July 2009 (UTC)
I have to admit, I don't follow any of these examples. It seems to me, in the lisp example, it's doing exactly what you would want and expect. Consider the following:
(defun foo (x) (- x 3)) (flet ((foo (x) x)) (foo 4)) => 4
So, wouldn't you expect that when you over-ride not to not be not at all, your unless breaks? The only reason this works with not is because its special, but you can still over-ride it with macrolet:
(macrolet ((not (x) x)) (unless t (format t "This should not be printed.~%")))
On top of that, trying to run the example code in OpenMCL produces:
;Compiler warnings : ; Attempt to bind compiler special name: NOT. Result undefined, in an anonymous lambda form.
-BrianCully 14:54, 2 September 2006 (UTC)
The CL examples are not valid Common Lisp code. The standard prohibits rebinding of symbols external to the COMMON-LISP package, see Section 22.214.171.124.2. Many compilers (like OpenMCL above, or SBCL) will signal an error.
126.96.36.199 14:36, 21 October 2007 (UTC) firstname.lastname@example.org
Why the hygiene problem is a problem
Yes, it is doing what you would expect, if you always knew when it was going to happen; consider if you were using a software package that included macros written by someone else; you wouldn't likely read the implementations of all of them (and whether you would or not, a user shouldn't have to). And the source might not be available for whatever reason.
Suppose one of these macros happened to use a symbol you were rebinding for another purpose in your code? You'd be quite surprised and disappointed after finally figuring out what was going wrong.
One of the reasons why hygiene matters a lot in LISP and its kin is the heavy usage macros get in that language, mostly because they are very sophisticated and offer many useful features beyond what you see in the C family macros.
Elugelab 13:01, 24 April 2007 (UTC)
This article seems rather biased towards Lisp macros, and is somewhat out of reach of the rest of us that don't know it (or Lisp, for that matter). There is a little about C-style macros, (relatively simple to implement assuming arbitrary memory), but little else.
It also happens to enable literal syntactical extensions of the language itself, including support for infix macros.
Scheme not really hygienic?
If I use "set!" instead of "let" to overwrite the "not" in the example, like this:
(define-syntax my-unless (syntax-rules () ((_ condition body ...) (if (not condition) (begin body ...))))) (set! not (lambda (x) x)) (my-unless #t (display "This should not be printed!") (newline))
Guile still prints "This should not be printed". So it's still capturing definitions made after the macro definition. Is that intended behaviour? Did I misunderstand something? --2A03:4000:15:2A3:1:0:0:1002 (talk) 12:09, 29 March 2017 (UTC)
Hello fellow Wikipedians,
I have just modified one external link on Hygienic macro. Please take a moment to review my edit. If you have any questions, or need the bot to ignore the links, or the page altogether, please visit this simple FaQ for additional information. I made the following changes:
- Added archive https://web.archive.org/web/20121113081854/http://nemerle.org/metaprogramming.pdf to http://nemerle.org/metaprogramming.pdf
|checked=, on this template, to true or failed to let other editors know you reviewed the change. If you find any errors, please use the tools below to fix them or call an editor by setting
|needhelp= to your help request.
- If you found an error with any archives or the URLs themselves, you can fix them with this tool.
|needhelp=<your help request> on this template to request help from an experienced user. Please include details about your problem, to help other editors.