Hacker News new | ask | show | jobs
by Johnny_Brahms 3335 days ago
Defmacro is convenient. Debugging when the lack of hygiene leads to weird errors is not.

It happens once ever blue moon, but every time I would kill for a proper syntax-case for CL. Racket's is fine, but I'd be happy with a one like the plain R6RS as well

2 comments

Side effects are no issue if every local variable name in a defmacro is generated with (gensym).
And if you're tired of doing that by hand, you can... write a macro that'll do that for you. In fact, those were already written, and are available in many libraries as well as featured in many books.

See e.g. Alexandria[0] for with-gensyms (automatically binding your variables to gensyms) and once-only (similar, but ensures the value will be evaluated only once).

Also note that lack of hygiene is actually a useful feature - it allows macros to capture variables from code passed to it as well as the environment they expand it. Some cool stuff can be done that way (some uncool foot-shooting too, though).

--

[0] - https://common-lisp.net/project/alexandria/draft/alexandria....

> Also note that lack of hygiene is actually a useful feature - it allows macros to capture variables from code passed to it as well as the environment they expand it. Some cool stuff can be done that way (some uncool foot-shooting too, though).

Doug Hoyte's excellent book _Let Over Lambda_ has a lot of examples.

Oh yes. This book is very fun, in the "what on Earth did he just do here" kind of way.
Syntax-case allows you to introduce bindings into the lexical context (breaking hygiene in a very controlled manner). It does not work with lists, but with syntax objects.
Exactly, you have to specify what you want. Evaluating an expression argument multiple times is probably a mistake, as is not having a new gensym for local variables ... until it is not, e.g. for anaphoric macros (binding some value to "it", https://en.wikipedia.org/wiki/Anaphoric_macro, you can still argue that that's bad style of course).
This is an age old (in lisp circles, anyway) argument that has never been resolved, and probably never will. Hygiene has pros and cons, after all.