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: 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/


      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.