2012-02-01 26 views
2

我知道在LISP宏參數中解構是一件好事,我想知道是否是必不可少的。作爲一個例子,是「真正需要」宏觀參數的解構?

(defmacro m1 (a) (car a)) 

(defmacro m2 ((a1 a2)) a1) 

似乎是(大約)等效 - 除了用於檢查的參數(一個或多個)的適當形式。

我的猜測是解構使得代碼更容易編寫/理解,但是使用它的任何代碼都可能被翻譯成沒有的代碼。我是對的還是這是一個愚蠢的初學者的錯誤?

回答

4

這不是必需的。你可以讓宏調用被Lisp系統解構,或者你爲宏內部編寫自己的代碼。

如果您要編寫自己的解構代碼,則通常需要將其與&休息或&身體參數列表結合使用。一個常見的原因是,宏lambda列表的語法可能性對於某種目的而言不夠靈活。一個例子就是Common Lisp LOOP宏。

使用宏Lambda列表是很好的風格。它提供了一個帶參數和一些結構信息的接口。這也允許Lisp系統提供宏調用的簡單形式的句法錯誤檢查。有人必須手寫。

+0

謝謝,這正是我的預期 - 只是想確保。 – mbork 2012-02-01 10:07:46