Jump to content

Talk:Hygienic macro

Page contents not supported in other languages.
From Wikipedia, the free encyclopedia

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)[reply]

Examples

[edit]

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)[reply]

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)[reply]


The CL examples are not valid Common Lisp code. The standard prohibits rebinding of symbols external to the COMMON-LISP package, see Section 11.1.2.1.2. Many compilers (like OpenMCL above, or SBCL) will signal an error.

82.75.4.249 14:36, 21 October 2007 (UTC) michaelw@foldr.org Strike-through text[reply]

Why the hygiene problem is a problem

[edit]

Brian,

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)[reply]

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)[reply]

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!")
   (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)[reply]

Yes, that is a misunderstanding of what is happening. "not" is typically defined in the top-level environment. By using set!, you change what "not" means globally. Therefore, it will also be changed for the expansion of the macro.
For clarity: set! is not a definition, but a re-binding.
If you use let, you effectively create a local "variable" that has the value (lambda (x) x) only for the body of the let. So when you use let, there is the global "not", and the local "not". The expanded macro will continue to use the global "not", as intended. 2001:638:807:212:3ECA:3373:5B46:5E83 (talk) 09:25, 4 December 2024 (UTC)[reply]
[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.

This message was posted before February 2018. After February 2018, "External links modified" talk page sections are no longer generated or monitored by InternetArchiveBot. No special action is required regarding these talk page notices, other than regular verification using the archive tool instructions below. Editors have permission to delete these "External links modified" talk page sections if they want to de-clutter talk pages, but see the RfC before doing mass systematic removals. This message is updated dynamically through the template {{source check}} (last update: 5 June 2024).

  • 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.

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

Is this article "too technical?"

[edit]

@Thumperward: Which concepts in this article are "too technical" for readers to understand? Jarble (talk) 22:19, 30 January 2024 (UTC)[reply]

A second-year CS undergraduate would struggle to comprehend it. That's massively beyond what we expect of any article. This was a generous tag as an alternative to proposing it be deleted or merged as esoteric programming trivia. Chris Cunningham (user:thumperward) (talk) 23:12, 30 January 2024 (UTC)[reply]