2010-12-21 64 views
1

位背景,我是一個總Lisp noob,幾個星期前纔開始,但我一直在開發其他langs多年。邏輯沒有問題,lisp,問題。lisp defclass宏問題

我想寫一個宏,它將定義兩個clsql類爲我解決庫問題。我希望這些類被命名爲x和`x-insert``,因此在宏中我希望宏來計算x-insert的符號名稱,但是我很難做到這一點。我的嘗試在下面,但我對兩件事感到困惑。

如何獲取它來創建類名稱。如果我刪除了,class -insert中的空格,那麼我不會理解,所以我認爲我錯過了一些簡單的方法來告訴它忽略空格,並將名稱創建爲單個單詞,第二個問題是獲取它創建兩個類,而不是一個,因爲它只能擴展宏的最後部分,而不是使用宏擴展所能看到的。

也許我會完全錯誤地解決這個問題,所以請隨意將我踢向正確的方向。

(defmacro gen-pair (class base-slots pkey-slot base-table) 
    `(clsql:def-view-class ,class -insert() 
    (
     ,base-slots 
    ) 
    (:base-table ,base-table) 
    ) 

    `(clsql:def-view-class ,class (,class -insert) 
    (
     ,pkey-slot 
    ) 
    (:base-table ,base-table) 
    ) 
) 
+4

你可能想看看這個lisp風格指南,而你在它:http://mumble.net/~campbell/scheme/style。txt – Shaun 2010-12-22 11:47:04

+3

非常同意看着Lisp風格指南的建議。關於PCL的這一章可能有助於澄清您對宏如何工作的一些誤解。 http://www.gigamonkeys.com/book/macros-defining-your-own.html – asm 2010-12-22 12:31:33

回答

7

這是很難在這裏開始的解釋,因爲你似乎有誤解的 整個堆棧。

第一個問題(如何編寫符號名):Lisp的宏不 上文字代碼操作。以反引號形式,,class 評估爲傳遞給宏的參數class的代碼,在這種情況下很可能是類名。在 之後寫入另一個不會奇蹟般地合併符號名稱的符號;爲什麼要這樣呢?如果您 要組成一個新的符號名稱,就可以構建它:

,(intern (string-upcase (concatenate 'string 
            (symbol-name class) 
            "-insert"))) 

第二個問題(爲什麼它似乎僅擴展第二部分):一個defmacro形式的 內容在一個隱含的評估progn (這就是爲什麼它不抱怨在這裏有一個無效的參數 )。最後一種形式的返回值是整個defmacro表格的返回值。在這種情況下,返回值是由反引用表單生成的代碼 。宏定義了一個函數,該函數將表單展開爲一個新窗體;您無法將其擴展爲兩個不相關的表格。您必須生成一個progn表單,其中包含您想擁有的兩種表格 。

第三個問題(爲什麼你的代碼看起來和Lispers 的寫法有很大的不同):不要像釘子剪報那樣亂扔括號。有 是在網上飛來飛去的幾個Lisp風格指南。閱讀它們。 Wer die Form beherrscht,kann mit ihr spielen(粗略地說:當你知道正確的方法時,你可以玩它)。

第四個問題(如何解決clsql的感知限制 clsql):您可以直接提問,否? 你的意思是什麼限制?