2011-05-12 40 views
3

感謝以前的回答common lisp: how can a macro define other methods/macros with programmatically generated names?我有一個宏,它定義了輔助函數(實際上我有一個宏小程序,我最喜歡的lisp-newbie-hammer)。但是在這個宏裏面,有些東西決定了幫助函數是否需要引入特定的參數。所以我有一個if語句,它具有幾乎相同的分支 - 向下一個分支,我將var放置在生成的函數的lambda列表中。在另一個分支下,我忽略了var。 (我正在爲非程序員編寫DSL,所以我不想讓他們看到像&可選的東西)裏面的宏,我可以有,var評估空白/什麼都沒有?

有沒有辦法避免在這裏有基本重複的代碼?如果我將var設置爲「」,那麼「」會出現在我生成的defuns的lambda列表中。如果我將var設置爲零,則會出現NIL。

是否有我可以使用的價值,這樣,var就完全沒有任何評價,閃爍不存在? (和哲學興趣,不應該有一個?)

回答

5

一個選項是使用,@var並且如果它應該使用您的值是一個列表,nil,如果它不應該。例如:

(let ((used `((frob 1 2 3))) 
     (unused nil)) 
    `(progn ,@unused ,@used)) 
=> (PROGN (FROB 1 2 3)) 

unused值已經消失。

+0

謝謝! 4:1的代碼減少和邏輯現在都在一個地方(我實際上有不止一個分支) – nil