4

Common Lisp のマクロシステムを学んでいて、いきなり問題を発見しました

(defun hello () (format t "hello ~%")) 
(defun world () (format t "world ~%"))
(defmacro call-2-func (func1 func2)
  `(,func1)
  `(,func2))

(macroexpand-1 '(call-2-func hello world)) 
(WORLD) 
T

良い。1 つのマクロから 2 つの LoC を生成できないのはなぜですか? どうすれば回避できますか? (progn は、より複雑な状況では機能しません...)

4

2 に答える 2

9

マクロは、両方の関数を呼び出すフォームを1 つだけ返す必要があります。
代わりに、2 つのフォームを生成しています (最後のフォームのみが使用されます)。

試す:

(defmacro call-2-func (func1 func2)
  `(progn (,func1) (,func2)))

または、2 つの機能だけに限定したくない場合は、次のようにします。

(defmacro call-funcs (&rest funcs)
  `(progn ,@(mapcar #'list funcs)))
于 2013-02-18T05:58:05.133 に答える