有沒有辦法引用讀者宏的調用?更具體地說,我想創建一個曾經評估過的宏,它將生成一個defclass語句和一個相應的XML文件。這可能嗎?引用讀者宏調用
我曾考慮過使用#.(...)
閱讀器宏,但我假設宏參數沒有綁定在閱讀器宏內部使用。它是否正確?
因此,我的第二個想法是嘗試生成一個包含讀者宏的語句,但我不確定是否有辦法做到這一點。
擴展宏調用時生成XML文件的任何建議?
在此先感謝您的任何想法。
有沒有辦法引用讀者宏的調用?更具體地說,我想創建一個曾經評估過的宏,它將生成一個defclass語句和一個相應的XML文件。這可能嗎?引用讀者宏調用
我曾考慮過使用#.(...)
閱讀器宏,但我假設宏參數沒有綁定在閱讀器宏內部使用。它是否正確?
因此,我的第二個想法是嘗試生成一個包含讀者宏的語句,但我不確定是否有辦法做到這一點。
擴展宏調用時生成XML文件的任何建議?
在此先感謝您的任何想法。
東西線沿線的:
(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宏不參與正常的宏擴展,它們在宏擴展之前執行。
你也許可以創建一個知道它被稱爲反引號讀者宏中發揮它的讀取宏,但它需要反引號讀者宏觀的瞭解或改變實施相關的行爲。
但是,您可以返回從讀者宏反引號形式。
「讀者宏」和「宏」是完全不同的野獸,用來做非常不同的事情。
「讀取器宏」通常是一個函數,開始。它們綁定到一個(或兩個特定的序列)字符並更改源代碼的讀取方式。它們不是關於代碼,而是關於對象創建。
對於「讀者宏」,沒有明確定義「宏參數」是什麼(除了可能來自導致讀者宏被首先調用的字符序列之外,作爲一個例子,當你閱讀一個列表時,(
與)
匹配很有用)。
+1感謝澄清=) –
謝謝!這正是我需要的!但有一個問題,通過傳遞:執行到eval-when時,它是否也會在執行時重新生成XML文件?我花了一天時間研究ASDF,我想這可能是可能的子類的編譯運算,以生成XML文件,但在分析搜索「DEF-WSDL級」的來源不會是很容易的,感覺有點不舒服。再次感謝您的答案! –
@JanitoVaqueiroFerreiraFilho,這就是主意。 ':compile-toplevel'告訴編譯器這個頂層表單也要在編譯時執行。缺少':load-toplevel'會告訴編譯器它可能會跳過它的處理(例如編譯)和它不能執行的加載器。 ':execute'告訴任何正在執行的代碼,它也將被執行。所以,一個'def-wsdl-class'可能會出現在文件的頂層表單或REPL中,並且XML文件將被創建。加載時,它不會重新創建該文件。 – acelent
@JanitoVaqueiroFerreiraFilho,另一種選擇可能是使用依賴實現的'compiler-let',例如。 '(編譯器讓((*力* XML(EVAL-時(:編譯頂層:執行):優先於)))(與開放文件...:如果-存在*力* XML))' 。這樣,文件隨時都會生成,但是在加載時它只會在不存在的情況下生成它。 – acelent