0

情况如下:

CL-USER> [bookid]
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE BOOKID>
CL-USER> (sql-expression :attribute 'bookid)
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE BOOKID>
CL-USER> [books.bookid]
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE BOOKS.BOOKID>
CL-USER> (sql-expression :attribute 'books.bookid)
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE "books.bookid">

Clsql 的 [] reader 宏的行为与 sql-expression 不同。我宁愿在宏中使用 sql-expression,因为 reader 宏可能会在那里表现得很奇怪。我尝试了macroexpand-1,但我猜它没有足够早地捕捉到扩展。如何探索阅读器宏的工作原理?

编辑:为我的 clsql 问题找到了解决方案:

(sql-expression :table 'books :attribute 'bookid)

我仍然想知道读取宏的事情。

4

2 回答 2

1

要查看阅读器宏的扩展,您需要执行以下操作read

? (read-from-string "[books.bookid]")

由于 REPL 中的R代表,因此普通的REPL(读取评估打印循环)已经读取了输入,因此确实运行了读取器宏。为了防止评估,您需要引用它:READ

? '[books.bookid]
于 2012-12-01T08:50:45.317 回答
1

阅读器宏是在读取时处理的,而不是在宏扩展时处理的,所以是的:对于你想要做的事情来说为时已晚。但是你可以只引用表达式。例如,使用简单的中缀阅读器宏,因为我没有安装 clsql:

FOO> [1 + 2]
3
FOO> '[1 + 2]
(+ 1 2)

我想这会sql-expression在你的情况下产生调用(或类似的东西)。

另请参阅:引用阅读器宏调用

于 2012-12-01T04:45:23.113 回答