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

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

Re: Need help with macros


From: Pascal J. Bourguignon
Subject: Re: Need help with macros
Date: Wed, 06 Jan 2010 21:23:17 +0100
User-agent: Gnus/5.101 (Gnus v5.10.10) Emacs/22.3 (gnu/linux)

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/


reply via email to

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