在 Common Lisp 中我定义了这个宏:
(defmacro gen-update-func (func-name table id keyparam)
`(defun ,func-name (db ,id)
(let ((data))
(keyparams ,keyparam)
(clsql:update-records ',table
:database db
:where [= ',id id]
:av-pairs data))))
我这样称呼它:
(gen-update-func add-sp spender spenderid (vorname name))
macroexpand-1 返回以下内容:
(defun add-sp (db spenderid)
(let ((data))
;(keyparams (vorname name))
(clsql-sys:update-records 'spender :database db :where [= 'spenderid id]
:av-pairs data)))
这是预料之中的。
当我调用它时,它将行“:where [=',id id]”解析为:
:WHERE SPENDENDB::[= 'SPENDENDB::SPENDERID SPENDENDB::ID]
这是错误的。我想插入 [= 字面意思,而不使用 SPENDENDB::。这是有意为之:
:WHERE [= 'SPENDENDB::SPENDERID SPENDENDB::ID]
我怎样才能实现这个目标?
语法 [= ... ] 是来自 clsql 的特殊 SQL 语法。
在定义宏的文件中,您使用了
[= ...]
语法,但可能不在适当的可读表中。这就是为什么[=
将其解析为符号,这就是为什么稍后会使用包前缀打印它的原因。根据CLSQL 文档 - 本地启用 sql 阅读器语法,您应该能够在定义宏时启用该语法:
或者,您可以在文件内部启用它:
当尝试使用这种语法时,我写道:
因此,您可以直接使用相等运算符,
(clsql-sys:sql-= ...)
而无需依赖辅助语法。查看文档,显然按如下方式执行操作更具可移植性: