2012-11-02 60 views
4

有沒有辦法引用讀者宏的調用?更具體地說,我想創建一個曾經評估過的宏,它將生成一個defclass語句和一個相應的XML文件。這可能嗎?引用讀者宏調用

我曾考慮過使用#.(...)閱讀器宏,但我假設宏參數沒有綁定在閱讀器宏內部使用。它是否正確?

因此,我的第二個想法是嘗試生成一個包含讀者宏的語句,但我不確定是否有辦法做到這一點。

擴展宏調用時生成XML文件的任何建議?

在此先感謝您的任何想法。

回答

1

東西線沿線的:

(defmacro def-wsdl-class (name (&rest supers) 
          (&rest slots) 
          &rest options) 
    `(progn 
    (eval-when (:compile-toplevel :execute) 
     (with-open-file (xml-file (make-pathname :name (string-capitalize name) 
               :type "wsdl" 
               :defaults (or *compile-pathname* 
                   *load-pathname*)) 
           :direction :output 
           :if-exists ,(getf options :if-wsdl-exists :error)) 
     (when xml-file 
      (spit-xml xml-file ',name ',supers ',slots ,@options)))) 
    `(defclass ,name (,@supers) 
     (,@slots) 
     ,@(chew options))))) 

編輯:要回答你原來的問題,你不能籠統地(回)報價讀者宏。它們在讀取語法的地方執行,我們稱它爲讀取時間。 Reader宏不參與正常的宏擴展,它們在宏擴展之前執行。

你也許可以創建一個知道它被稱爲反引號讀者宏中發揮它的讀取宏,但它需要反引號讀者宏觀的瞭解或改變實施相關的行爲。

但是,您可以返回從讀者宏反引號形式。

+0

謝謝!這正是我需要的!但有一個問題,通過傳遞:執行到eval-when時,它是否也會在執行時重新生成XML文件?我花了一天時間研究ASDF,我想這可能是可能的子類的編譯運算,以生成XML文件,但在分析搜索「DEF-WSDL級」的來源不會是很容易的,感覺有點不舒服。再次感謝您的答案! –

+0

@JanitoVaqueiroFerreiraFilho,這就是主意。 ':compile-toplevel'告訴編譯器這個頂層表單也要在編譯時執行。缺少':load-toplevel'會告訴編譯器它可能會跳過它的處理(例如編譯)和它不能執行的加載器。 ':execute'告訴任何正在執行的代碼,它也將被執行。所以,一個'def-wsdl-class'可能會出現在文件的頂層表單或REPL中,並且XML文件將被創建。加載時,它不會重新創建該文件。 – acelent

+0

@JanitoVaqueiroFerreiraFilho,另一種選擇可能是使用依賴實現的'compiler-let',例如。 '(編譯器讓((*力* XML(EVAL-時(:編譯頂層:執行):優先於)))(與開放文件...:如果-存在*力* XML))' 。這樣,文件隨時都會生成,但是在加載時它只會在不存在的情況下生成它。 – acelent

4

「讀者宏」和「宏」是完全不同的野獸,用來做非常不同的事情。

「讀取器宏」通常是一個函數,開始。它們綁定到一個(或兩個特定的序列)字符並更改源代碼的讀取方式。它們不是關於代碼,而是關於對象創建。

對於「讀者宏」,沒有明確定義「宏參數」是什麼(除了可能來自導致讀者宏被首先調用的字符序列之外,作爲一個例子,當你閱讀一個列表時,()匹配很有用)。

+0

+1感謝澄清=) –