1
5
您不能将宏放入您想要的代码中。 在CLHS中读取构造的语法。 例如,您不能这样做:
defun需要arglist,而不是创建arglist的函数。 lisp扩展宏,其中需要lisp表单。如果需要其他列表(例如插槽列表),则lisp不会进行宏扩展。 类似的defclass需要一个槽列表,而不是创建槽列表的函数。 与插槽列表类似,defclass希望每个插槽都是描述插槽的名称或列表。 参见defclass的语法: http://www.lispworks.com/documentation/HyperSpec/Body/m_defcla.htm 你也不能把逗号放在你想要的地方。 一本基本的口齿不清书可能会有所帮助。阅读Lisp语法。
上面没有意义。 逗号运算符将项放入后引号列表。它不会将项目放入符号中。 如果要创建符号,需要调用intern或make-symbol。 解决方案 编写一个my-defclass宏,该宏允许使用较短的语法并扩展为defclass。已经有defclass*宏在库中执行类似的操作。 |
2
3
我通常用这种东西
然后
添加一些逻辑来处理对自定义插槽的需求非常简单(例如,当字段是列表而不是符号时,可以在扩展中逐字复制输入) |
3
2
正如雷纳所说,宏只在可以接受函数调用的地方进行扩展。 我所做的是限制我在定义插槽时实际需要键入的样板,即有两个编辑器宏,一个用于带读卡器的插槽,另一个用于带访问器的插槽(我很少有带单独编写器的插槽,但如果有,我必须手动编写)。 |
4
0
宏从上到下递归展开。在您的示例中,
正如其他人所建议的,读者错误是因为
|
lightning_missile · 词法范围和共享对象 6 年前 |
Alexandru Popa · SBCL中奇怪的宏扩展错误 6 年前 |
Jacky · 编辑列表中的每个偶数索引元素 6 年前 |
HappyFace · lisp典型缩进约定背后的规则是什么? 6 年前 |
Jorge · 在公共Lisp中初始化计数器变量 6 年前 |
Rorschach · cl循环破坏性修改cons单元 6 年前 |