2016-03-23 9 views
0

どのような種類の引数も受け入れることができる関数を記述し、引数の名前と値を出力できるようにしました。この関数は期待どおりに機能します。しかし、私は関数呼び出しがこのような値の引用符を渡す必要が好きではない(my-message 'emacs-version 'emacs-copyright)(my-message emacs-version emacs-copyright)に簡略化したいと思います。したがって、マクロを使用して関数を書き換えます。メッセージが2回印刷されました

(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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"))) 

ただし、一部のメッセージは2回印刷されます。

(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. 

何が問題ですか?

答えて

0

あなたの出力にメッセージ [2 times] は、余分な改行文字を参照していると思います。

この動作は、* *スクラッチで

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

を評価することにより、再生することができます。 *メッセージ*での出力は、この動作が意図されている場合、私は疑問に思う

HelloWorld 
[2 times] 
" 
" 

です。

私の答えはマクロとは関係がないので、多分私はあなたの質問を誤解していました。

+0

これがなぜ[2倍]が作られたのかの本当の理由です。 – tom

2

マクロを間違った理由で使用しています。

マクロは、コード内の余分な文字を避けるための単なるギミックではありません。

マクロはコードで動作します。 IOW、コンパイル時に(またはコンパイルされていない場合はマクロ展開時間に)記述したコードが実行され、結果がマクロ形式の代わりに使用されます。

だから、あなたのマクロのシンボル(および、より一般的には、S式)セクションでは、上記を理解していない場合backquote上に読む

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

のようになります。

しかし、私に言わせれば、マクロは「高度なマテリアル」であり、あなたがLispをより快適にするまで、マクロを避けたいかもしれません。

+0

私はいつもマクロと混同しています。私はコードを遵守しようとしました。マクロを使用して結果を生成することの欠点は何ですか?これは直接質問に答えるものではありませんが、別の問題を指摘しています。あなたは私から+1のボーナスを得ました。 – tom

関連する問題