From: pjb@informatimago.com (Pascal J. Bourguignon)
To: help-gnu-emacs@gnu.org
Subject: Re: Need help with macros
Date: Wed, 06 Jan 2010 20:00:19 +0100 [thread overview]
Message-ID: <87r5q3rrcs.fsf@hubble.informatimago.com> (raw)
In-Reply-To: 874omzi6n9.fsf@Traian.DecebalComp
Cecil Westerhof <Cecil@decebal.nl> writes:
> I am trying to make some useful functionality for Gnus. I think that I
> should use a macro for that. I made the following macro (the two message
> statements are just for debugging):
> (defmacro gnus-group-jump-bind (key-binding group-to-jump-to)
> (message "#%s#%s#" key-binding (type-of key-binding))
I would avoid using the character # in lisp output, since it is
meaningful (readable).
(let ((print-circle t))
(let* ((a "hello")
(b (list a a)))
(print b)))
prints:
(#1="hello" #1#)
(read-from-string "(#1=\"hello\" #1#)")
--> ((#1="hello" #1#) . 16)
In a preceding message, I used "%S" instead. You should try it!
> (message "#%s#%s#" group-to-jump-to (type-of group-to-jump-to))
> (define-key gnus-group-mode-map key-binding
> (lambda ()
> (interactive)
> (gnus-group-jump-to-group group-to-jump-to))))
gnus-group-jump-bind has no need to be a macro. As a macro it is
wrong. Use defun!
> When calling this with:
> (gnus-group-jump-bind "vjd" "nndraft:drafts")
>
> In the message buffer it gives:
> #vjd#string#
> #nndraft:drafts#string#
>
> And the return value is:
> (lambda nil (interactive) (gnus-group-jump-to-group group-to-jump-to))
>
> This is the first problem. Outside the macro group-to-jump-to is not
> existing, I need the value of group-to-jump-to not the name itself. How
> do I do this? I tried eval, but that did not work.
By using a function instead of macro.
> But of course I do not want to set the key bindings manually but data
> driven. So I wrote the following function:
> (defun gnus-group-do-jump-bind ()
> (dolist (this-jump gnus-group-jump-list)
> (let ((this-group (second this-jump))
> (this-key (concat "vj" (first this-jump))))
> (gnus-group-jump-bind this-key this-group))))
>
> I defined the used value:
> (setq gnus-group-jump-list
> (list
> '("d" "nndraft:drafts")
> ))
>
> And call the function:
> (gnus-group-do-jump-bind)
>
> This gives in the message buffer:
> #this-key#symbol#
> #this-group#symbol#
> Entering debugger...
>
> And the debug output starts with:
> Debugger entered--Lisp error: (wrong-type-argument arrayp this-key)
>
> I tried to work with symbol-value, but that did not work.
>
> What do I need to do to get this working?
Make it a function.
--
__Pascal Bourguignon__ http://www.informatimago.com/
next prev parent reply other threads:[~2010-01-06 19:00 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-06 15:40 Need help with macros Cecil Westerhof
2010-01-06 17:18 ` Cecil Westerhof
2010-01-06 19:00 ` Pascal J. Bourguignon [this message]
2010-01-06 19:25 ` Cecil Westerhof
2010-01-06 19:48 ` Cecil Westerhof
2010-01-06 20:29 ` Pascal J. Bourguignon
2010-01-07 10:35 ` Cecil Westerhof
2010-01-06 20:23 ` Pascal J. Bourguignon
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=87r5q3rrcs.fsf@hubble.informatimago.com \
--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.