From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: pjb@informatimago.com (Pascal J. Bourguignon) Newsgroups: gmane.emacs.help Subject: Re: Need help with macros Date: Wed, 06 Jan 2010 21:23:17 +0100 Organization: Informatimago Message-ID: <87bph7rnii.fsf@hubble.informatimago.com> References: <874omzi6n9.fsf@Traian.DecebalComp> <87r5q3rrcs.fsf@hubble.informatimago.com> <871vi3ghnq.fsf@Traian.DecebalComp> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1262810847 32496 80.91.229.12 (6 Jan 2010 20:47:27 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 6 Jan 2010 20:47:27 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Wed Jan 06 21:47:20 2010 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NScmj-0006ne-4E for geh-help-gnu-emacs@m.gmane.org; Wed, 06 Jan 2010 21:47:17 +0100 Original-Received: from localhost ([127.0.0.1]:36603 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NScmj-0001gk-Nk for geh-help-gnu-emacs@m.gmane.org; Wed, 06 Jan 2010 15:47:17 -0500 Original-Path: news.stanford.edu!usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 126 Original-X-Trace: individual.net XV6S5dwEgrJygmDzAyMP8AQQQ88elCzcSRQkkuATOr5r89OpBP Cancel-Lock: sha1:ZTM0NTU2Mjk0MDgwY2VjODEyNGQzY2M1NjlmYTgwMTNkYjM4ZDkyOA== sha1:C+gB5uSXmXcvrHukQ7tCDLmBpGc= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en X-Disabled: X-No-Archive: no User-Agent: Gnus/5.101 (Gnus v5.10.10) Emacs/22.3 (gnu/linux) Original-Xref: news.stanford.edu gnu.emacs.help:176006 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:71093 Archived-At: Cecil Westerhof 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/