2010-12-21 87 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):您可以直接提问,否? 你的意思是什么限制?