2016-02-29 158 views
0

讓我們假設我得到了下面的宏:如何在LISP函數中調用宏?

(defmacro my-check (number) 
    `(> 3 ,(apply #'+ number))) 

我如何可以調用一個函數這個宏?

我試過了,例如,下面的功能:

(defun do-test (my-object) 
    (my-check my-object))) 

但在編譯時,我得到了以下錯誤:

during macroexpansion of (MY-CHECK MY-OBJECT). Use *BREAK-ON-SIGNALS* to 
intercept. 
The value MY-OBJECT is not of type LIST. 

回答

3

在宏逗號是放錯了地方。它試圖在宏展開期間評估整個(apply ...),這當然因爲number是符號而不是列表而失敗。請記住,宏在編譯期間擴展,而不是在運行時擴展。

正確的版本是:

(defmacro my-check (number) 
    `(> 3 (apply #'+ ,number))) 
+0

謝謝。假設我無法修改宏。我怎麼能做一個函數調用而不是重新工作宏? – Xaving

+2

你可以使用原始宏的唯一方法是給它一個文字列表作爲參數,例如'(my-check(1 1))'。它不能與變量一起使用。 – jkiiski

+0

坦克你。你能否詳細說明你是如何得出這個結論的? – Xaving