help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Is it possible for a macro to expand to nothing?


From: Pascal J. Bourguignon
Subject: Re: Is it possible for a macro to expand to nothing?
Date: Thu, 26 Nov 2009 12:11:10 +0100
User-agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/22.3 (darwin)

Alan Mackenzie <acm@muc.de> writes:

> Jeff Clough <jeff@chaosphere.com> wrote:
>> From: Alan Mackenzie <acm@muc.de>
>> Date: Tue, 24 Nov 2009 16:39:20 +0000 (UTC)
>
>>>> It comes directly from the definition of defmacro,
>
>>>>    defmacro is a special form in `src/eval.c'.
>>>>    (defmacro name arglist [docstring] [decl] body...)
>
>>>>    Define name as a macro.  The actual definition looks like
>>>>     (macro lambda arglist [docstring] [decl] body...).
>>>>    When the macro is called, as in (name ARGS...), the function
>>>>    (lambda arglist body...) is applied to the list ARGS... as it
>>>>    appears in the expression, and the result should be a form to be
>>>>    evaluated instead of the original.
>
>>> Oh, come on!  That last sentence is a tutorial, motivating one,
>>> expressed in the slightly loose, colloquial language of the hacker.
>>> "a form to be evaluated" is here shorthand for something like "some
>>> sort of atom or list structure which fits into the slot where the
>>> invocation is housed"
>
>> This is incorrect.  The term "form" has a very specific definition in
>> Lisp.  It is a sexp that can be evaluated.  While I'm new to Lisp, I
>> have been knee deep in books and documents for the last couple of weeks
>> and everything (including the GNU Emacs Lisp Manual) presents macros as
>> a way to generate *forms*, not just sexps.
>
> You've missed my point.  The guy who wrote that definition of macro was,
> in using the word "form", being somewhat, er, informal.  It was just
> easier and more concise to say "form" than "form or (sometimes) other
> appropriate list structure".

He was informal only as much as the "emacs lisp reference manual"
doesn't contain a glossary entry for "form".  The reason why is that
because at the time emacs was invented, it was a well known technical
term established for 30 years meaning "an executable sexp".

Only a few years later did Common Lisp get formalized with a
normalizing glossary, where you can find the formal definition for
form which I cited.  Notice that it is justified to retrofit most
definitions of the Common Lisp glossary to the older lisps, since
Common Lisp is after all not much more than the GCD of the lisps that
existed at the time.



>> If you have a macro that expands to (1 2 3), it's not going to break
>> the world, but that macro isn't doing what every hacker is going to
>> expect.  I'd call that a style problem.
>
> Just like somebody occasionally using a goto in C.  Pascal was unable to
> identify any specific problem a non-form macro expansion causes.

I cited several times the reason why it's bad: because the macro form
cannot be used stand alone without signaling an error.  Jeff says the
same.  You could ask on comp.lang.lisp where I'd bet you'd get even
more gurus answering.  (Real lisp gurus intervene sometimes on cll).


>> If, for some reason, you absolutely have to use a macro to generate
>> something like that above, at least have it expand to (list 1 2 3),
>> that way the macro can still be evaluated and no one gets shafted.
>
> And waste run time evaluating that list every time the defun runs?

That depends on what you're doing.  But indeed, by advice is to use a
_function_ to return (1 2 3) and avoid rebuilding the list several
time.


>> You get the behavior you want and the macro is still expanding to a
>> valid form.
>
> Nobody has yet given a valid reason why I should care about a macro
> expansion being a "valid form" when the invoker is not going to evaluate
> it.  cc-langs.el is chock full of such "invalid forms", yet they make the
> maintenance of 7 complicated language modes tractable.

It is a _style_ reason.  A question of good taste.   The same reason
why you don't poop in your living room.   It would be bad style.


To make an analogy, there is a room where you can defecate, there's a
room where you watch TV.  Technically, there's no reason why you
shouldn't be able to defecate in your living room, but for style
reasons (and because you don't have to paper over it later), it's
better if you keep defecating in your water closed room.


-- 
__Pascal Bourguignon__


reply via email to

[Prev in Thread] Current Thread [Next in Thread]