From: pjb@informatimago.com (Pascal J. Bourguignon)
To: help-gnu-emacs@gnu.org
Subject: Re: Need help with macros
Date: Wed, 06 Jan 2010 21:23:17 +0100 [thread overview]
Message-ID: <87bph7rnii.fsf@hubble.informatimago.com> (raw)
In-Reply-To: 871vi3ghnq.fsf@Traian.DecebalComp
Cecil Westerhof <Cecil@decebal.nl> writes:
> pjb@informatimago.com (Pascal J. Bourguignon) 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)
>
> I do not really understand what happens here -but I am a newbie with
> lisp, so that is not that strange-, but I will not use the '#' anymore.
Most output written by print is readable by read.
The strings produced by prin1-to-string are redable by read-from-string.
This is gratis serialization/deserialization provided by lisp.
(prin1-to-string '(42 "abc" def [1 2 3]))
--> "(42 \"abc\" def [1 2 3])"
(car (read-from-string (prin1-to-string '(42 "abc" def [1 2 3]))))
--> (42 "abc" def [1 2 3])
(setf print-circle nil)
(let* ((s "abc")
(l (list s s)))
(prin1-to-string l))
--> "(\"abc\" \"abc\")"
(car (read-from-string (let* ((s "abc")
(l (list s s)))
(prin1-to-string l))))
--> ("abc" "abc")
Here, we get two different strings containing the same characters.
(let ((l2 (car (read-from-string (let* ((s "abc")
(l (list s s)))
(prin1-to-string l))))))
(eql (first l2) (second l2)))
--> nil
But the original list, l, had twice the same string in it. By setting
print-circle to t, prin1 and print will use the #= ## notation to make
reference to previously printed objects. (The number is used to
identify the object referenced, when there are several different
objects occuring in various places).
(setf print-circle t)
(let* ((s "abc")
(l (list s s)))
(prin1-to-string l))
--> "(#1=\"abc\" #1#)"
When reading these #= and ##, the object is not duplicated anymore.
(car (read-from-string (let* ((s "abc")
(l (list s s)))
(prin1-to-string l))))
--> (#1="abc" #1#)
(let ((l2 (car (read-from-string (let* ((s "abc")
(l (list s s)))
(prin1-to-string l))))))
(eql (first l2) (second l2)))
--> t
>> In a preceding message, I used "%S" instead. You should try it!
>
> I find the '#' termination more clear, but I can get used to this.
> Better safe as sorry.
Well, there's nothing wrong in your usage of #, but it is better in
general to print lisp data that is readable, so that you can easily
read it back if need be.
>>> (message "#%s#%s#" group-to-jump-to (type-of group-to-jump-to))
(let ((group-to-jump-to "example"))
(message "%S" (list group-to-jump-to (type-of group-to-jump-to))))
prints: ("example" string)
So you can copy-and-paste it and write:
(set group-to-jump-to (first '("example" string)))
or whatever later.
>>> (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!
>
> I could not get the defun working, that is why I thought it had to be
> done with a macro. The macro first also did not work. The macro works
> now. I'll rewrite the macro to a defun.
>
> I do have a lot of questions. I am glad that you and others are so
> helpful. ;-)
define-key is itself a function so there should be no difficulty in
writing your gnus-group-jump-bind as a function.
--
__Pascal Bourguignon__ http://www.informatimago.com/
prev parent reply other threads:[~2010-01-06 20:23 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
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 [this message]
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=87bph7rnii.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.