2016-03-23 5 views
0

Ich schrieb eine Funktion, die jede Art annehmen kann, eine beliebige Anzahl von Argumenten und damit es den Namen und den Wert der Argumente drucken kann. Die Funktion funktioniert wie erwartet. Aber ich mag es nicht, die Funktion Anruf erfordert, dass ich ein Zitat von Wert wie diese (my-message 'emacs-version 'emacs-copyright) übergeben. Ich möchte zu (my-message emacs-version emacs-copyright) vereinfacht werden. Daher benutze ich Makro, um die Funktion neu zu schreiben.Nachricht im Makro zweimal gedruckt

(defmacro my-message (&rest args) 
    (if args 
     (progn 
     (message "This is the start of debug message.\n") 
     (dolist (arg args) 
      (cond 
      ((stringp arg) 
      (message arg)) 
      ((numberp arg) 
      (message (number-to-string arg))) 
      ((boundp arg) 
      (pp arg) 
      (message "") 
      (pp (symbol-value arg))) 
      ((not (boundp arg)) 
      (pp arg) 
      (message "Undefined"))) 
      (message "\n")) 
     (message "This is the end of debug message.")) 
    (message "This is a debug message ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"))) 

Allerdings werden einige der Nachrichten zweimal gedruckt.

(my-message emacs-version emacs-copyright 12345 "HelloWorld" foobar) 

This is the start of debug message. 

emacs-version 
"24.5.1" 
[2 times] 
emacs-copyright 
"Copyright (C) 2015 Free Software Foundation, Inc." 
[2 times] 
12345 
[2 times] 
HelloWorld 
[2 times] 
foobar 
Undefined 
[2 times] 
This is the end of debug message. 

Was ist das Problem?

Antwort

0

Ich denke, die Nachricht [2 times] in Ihrer Ausgabe bezieht sich auf eine zusätzliche Newline-Zeichen.

Dieses Verhalten kann * durch Auswertung

(progn 
    (message "HelloWorld") 
    (message "\n")) 

in * Kratzer reproduziert werden. Die Ausgabe in * Nachrichten * ist

Ich frage mich, ob dieses Verhalten beabsichtigt ist.

Vielleicht habe ich Ihre Frage falsch verstanden, da meine Antwort nichts mit Makros zu tun hat.

+0

Dies ist der wahre Grund warum "[2 mal]" produziert wurde. – tom

2

Sie verwenden Makros aus einem falschen Grund.

Ein Makro ist nicht nur ein Gimmick, um ein zusätzliches Zeichen in Ihrem Code zu vermeiden.

Makros arbeiten mit Code. IOW, der Code, den Sie geschrieben haben, wird zur Kompilierzeit (oder Makroexpansionszeit, wenn nicht kompiliert) ausgeführt und das Ergebnis wird dann anstelle der Makroform verwendet.

So wird das Symbol (und, allgemeiner, sexp) Abschnitt des Makros sollte wie folgt aussehen

`(message "symbol: %s, value: %s" ',arg ,arg) 

Informieren Sie sich über backquote, wenn Sie nicht die oben verstehen.

Aber lassen Sie mich wiederholen: Makros sind "fortgeschrittenes Material" und Sie könnten es vorziehen, sie zu vermeiden, bis Sie sich mit Lisp wohler fühlen.

+0

Ich habe immer mit Makros verwechselt. Ich habe versucht, den Code zu erfüllen und es gab das erwartete Ergebnis. Was ist der Nachteil der Verwendung eines Makros, um das Ergebnis zu generieren? Obwohl dies die Frage nicht direkt beantwortet, weist es auf ein anderes Problem hin. Du hast also einen Bonus von mir bekommen. – tom