Talk:Hygienic macro

From Wikipedia, the free encyclopedia
Jump to: navigation, search
WikiProject Computing (Rated C-class, Low-importance)
WikiProject icon This article is within the scope of WikiProject Computing, a collaborative effort to improve the coverage of computers, computing, and information technology on Wikipedia. If you would like to participate, please visit the project page, where you can join the discussion and see a list of open tasks.
C-Class article C  This article has been rated as C-Class on the project's quality scale.
 Low  This article has been rated as Low-importance on the project's importance scale.

Call by reference[edit]

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 Many compilers (like OpenMCL above, or SBCL) will signal an error. 14:36, 21 October 2007 (UTC) Strike-through text

Why the hygiene problem is a problem[edit]


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)

Too Lisp-oriented?[edit]

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.

Could Sweet.js macros be referenced in this? They are heavily influenced by Lisp macros, and are hygienic by default. Sweet.js macros aren't native JavaScript, but they are a single, completely independent extension to the language.

It also happens to enable literal syntactical extensions of the language itself, including support for infix macros.

Sweet.js macros have been used to poly-fill E4X support, poly-fill some ECMAScript Harmony syntax, and implement a browser-targeted JavaScript derivative created to work with React.js, JSX. impinball (talk) 02:41, 1 September 2014 (UTC)

Scheme not really hygienic?[edit]

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!")

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)

External links modified[edit]

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:

When you have finished reviewing my changes, you may follow the instructions on the template below to fix any issues with the URLs.

You may set the |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 have discovered URLs which were erroneously considered dead by the bot, you can report them with this tool.
  • If you found an error with any archives or the URLs themselves, you can fix them with this tool.

If you are unable to use these tools, you may set |needhelp=<your help request> on this template to request help from an experienced user. Please include details about your problem, to help other editors.

Cheers.—InternetArchiveBot (Report bug) 07:25, 7 April 2017 (UTC)