gpt4 book ai didi

macros - lisp defclass宏问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:16 24 4
gpt4 key购买 nike

一些背景知识,我是一个彻头彻尾的 lisp 菜鸟,几周前才开始,但多年来我一直在使用其他语言进行开发。逻辑没问题,口齿不清,有问题。

我正在尝试编写一个宏,为我定义两个 clsql 类,以解决库中的问题。我希望这些类被命名为 x 和 `x-insert`` ,所以在宏中我希望宏计算 x-insert 的符号名称,但我有做这件事的难度。我的尝试在下面,但我对两件事感到困惑。

如何获取它来创建类名。如果我删除 ,class -insert 中的空格,它不会 eval,据我所知,所以我想我缺少一些直接的方法来告诉它忽略空格,并将名称创建为一个词,第二个问题是让它创建两个类,而不是一个,因为它只扩展了宏的最后一部分,从我使用宏扩展看到的内容来看。

也许我完全以错误的方式来解决这个问题,所以请随意将我踢向正确的方向。

(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)
)
)

最佳答案

这里很难开始解释,因为你似乎有一个一大堆误解。

第一个问题(如何组合符号名):Lisp宏不在文本上操作,但在代码上操作。在反引号形式中,,class评估传递给宏的 class 参数的代码,在这种情况下很可能是一个类名。在后面写另一个符号这不会神奇地合并符号名称;为什么要呢?如果你想要组成一个新的符号名称,你必须构造它:

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

第二个问题(为什么好像只展开第二部分):defmacro 形式的内容在隐式 progn 中计算(这就是为什么它不提示参数数量无效这里)。最后一个形式的返回值是整个 defmacro 形式。在这种情况下,返回值是代码由该反引号形式产生。宏定义了一个函数将表格扩展为新表格;你不能把它扩展成两个不相关的形式。您必须生成一个 progn 表单,其中包含您想要的两种形式。

第三个问题(为什么你的代码看起来和Lispers写的那么不一样write): 不要像剪指甲一样在括号里乱扔。那里网上流传着一些 Lisp 风格指南。阅读它们。Wer die Form beherrscht, kann mit ihr spielen(大致:当你知道正确的方法,你可以玩它)。

第四个问题(如何解决感知到的局限性clsql):你可以直接问那个问题,不是吗?做什么限制你是说?

关于macros - lisp defclass宏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com