all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: pjb@informatimago.com (Pascal J. Bourguignon)
To: help-gnu-emacs@gnu.org
Subject: Re: Is it possible for a macro to expand to nothing?
Date: Sat, 28 Nov 2009 01:06:10 +0100	[thread overview]
Message-ID: <87d4335x8t.fsf@galatea.local> (raw)
In-Reply-To: 87r5rjwoag.fsf@lion.rapttech.com.au

Tim X <timx@nospam.dev.null> writes:

> On the other hand, Alan's arguments also have merit. If a macro can be
> useful in generating something other than a form that can be evaluated,
> such as a data structure and can do so in a way that is cleaner/simpler
> or just easier to understand than doing the same using functions, then
> it would make sense. His examples from the C modes seem to be a case in
> point. 


Perhaps Alan's problem with functions comes from the confusion between
backquote and macros.  Since backquote (and , and ,@) are often used
in macros, some people believe they can be used only in macros, and
that they ARE what macros are.


Far from it!  I don't know any language more orthogonal than lisp.


Backquote can be used in a function to build a s-exp (including part
of a form) as it can be used anywhere.

Therefore it is really not easier to use macros to generate parts of a
form than function.



You should never write or use a macro to generate data.  To generate
data, always use functions:

(defun generate-cond-clause (var predicate body)
   `((,predicate ,var) ,@body))


So then you can write a macro using this functio:

(defmacro pcase (expr &rest clauses)
  (let ((var (gensym)))
    `(let ((,var ,expr))
        (cond
          ,@(mapcar (lambda (clause)
                       (generate-cond-clause var (first clause) (rest clause)))
                    clauses)))))

(macroexpand '
 (pcase 42
   (oddp     (print 'odd)      1)
   (zerop    (print 'zero)     0)
   (integerp (print 'even)     2)
   (identity (print 'anything) 3)
   (null     (print 'null)     nil)))
-->
(let ((G62061 42))
   (cond ((oddp G62061) (print (quote odd)) 1)
         ((zerop G62061) (print (quote zero)) 0)
         ((integerp G62061) (print (quote even)) 2)
         ((identity G62061) (print (quote anything)) 3)
         ((null G62061) (print (quote null)) nil)))



If you wanted to use macros, in addition to the complexity of having
to use macroexpand to use it, you would have the difficulty of passing
the parameters, since a macro gets it's parameters from the source
form.  In the case of a function, you have the choice to quote or not
to quote the parameters, with macros they're always quoted for you.


-- 
__Pascal Bourguignon__


  reply	other threads:[~2009-11-28  0:06 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-23 14:56 Is it possible for a macro to expand to nothing? Alan Mackenzie
2009-11-23 16:03 ` Drew Adams
     [not found] ` <mailman.11344.1258992201.2239.help-gnu-emacs@gnu.org>
2009-11-23 16:31   ` Alan Mackenzie
2009-11-23 17:29     ` Drew Adams
2009-11-23 18:33     ` Pascal J. Bourguignon
2009-11-23 18:51       ` Drew Adams
     [not found]       ` <mailman.11354.1259004470.2239.help-gnu-emacs@gnu.org>
2009-11-23 20:08         ` Pascal J. Bourguignon
2009-11-23 20:24           ` Alan Mackenzie
2009-11-23 22:09           ` Drew Adams
     [not found]           ` <mailman.11367.1259014174.2239.help-gnu-emacs@gnu.org>
2009-11-23 23:55             ` Pascal J. Bourguignon
2009-11-24  0:55               ` Alan Mackenzie
2009-11-24  9:42                 ` Pascal J. Bourguignon
2009-11-24 10:45                   ` Alan Mackenzie
2009-11-24 11:14                     ` Pascal J. Bourguignon
2009-11-24 16:39                       ` Alan Mackenzie
2009-11-24 19:17                         ` Pascal J. Bourguignon
2009-11-25 14:13                         ` Jeff Clough
     [not found]                         ` <mailman.11467.1259158369.2239.help-gnu-emacs@gnu.org>
2009-11-26  6:53                           ` Alan Mackenzie
2009-11-26 11:11                             ` Pascal J. Bourguignon
2009-11-26 11:52                               ` Lennart Borgman
     [not found]                               ` <mailman.11564.1259236392.2239.help-gnu-emacs@gnu.org>
2009-11-26 12:16                                 ` Pascal J. Bourguignon
2009-11-26 12:43                                   ` Lennart Borgman
2009-11-27  8:32                         ` Kevin Rodgers
     [not found]                         ` <mailman.11626.1259310779.2239.help-gnu-emacs@gnu.org>
2009-11-27 13:15                           ` Alan Mackenzie
2009-11-27 13:52                             ` Pascal J. Bourguignon
2009-11-27 16:57                               ` Alan Mackenzie
2009-11-27 17:09                                 ` Pascal J. Bourguignon
2009-11-27 17:19                               ` Helmut Eller
2009-11-27 17:45                                 ` Pascal J. Bourguignon
2009-11-27 23:17                             ` Tim X
2009-11-28  0:06                               ` Pascal J. Bourguignon [this message]
2009-11-28  8:29                                 ` Alan Mackenzie
2009-11-28 10:25                                   ` Pascal J. Bourguignon
2009-11-28 12:57                                     ` Thierry Volpiatto
     [not found]                                     ` <mailman.11699.1259413441.2239.help-gnu-emacs@gnu.org>
2009-11-29  0:54                                       ` Pascal J. Bourguignon
2009-11-24 11:56                     ` Pascal J. Bourguignon
     [not found]     ` <mailman.11352.1258997403.2239.help-gnu-emacs@gnu.org>
2009-11-23 18:42       ` Pascal J. Bourguignon
2009-11-23 20:12         ` Drew Adams
     [not found]         ` <mailman.11356.1259007263.2239.help-gnu-emacs@gnu.org>
2009-11-23 20:21           ` Pascal J. Bourguignon
2009-11-23 22:09             ` Drew Adams
     [not found]             ` <mailman.11368.1259014177.2239.help-gnu-emacs@gnu.org>
2009-11-24  0:03               ` Pascal J. Bourguignon
2009-11-23 20:09       ` Alan Mackenzie
2009-11-23 16:49 ` Jeff Clough

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87d4335x8t.fsf@galatea.local \
    --to=pjb@informatimago.com \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.