是这样的:
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 的 [] 读取器宏的行为与 sql 表达式不同。我宁愿在宏中使用sql表达式,因为读取器宏在那里的行为可能很奇怪。我尝试了 macroexpand-1,但我猜它没有足够早地抓住扩展。如何探索阅读器宏的工作原理?
编辑:找到了我的clsql问题的解决方案:
(sql-expression :table 'books :attribute 'bookid)
我仍然想知道阅读宏的事情。
宏是在读取时处理的,而不是在宏扩展时处理的,所以是的:对于您尝试做的事情来说为时已晚。但你可以引用这个表达。例如,使用一个简单的中缀读取器宏,因为我没有安装 clsql:
FOO> [1 + 2]
3
FOO> '[1 + 2]
(+ 1 2)
我想这会在您的情况下产生sql-expression
调用(或类似的东西)。
另请参阅:引用读取器宏调用。
要查看读取器宏的扩展,您需要read
一些内容:
? (read-from-string "[books.bookid]")
由于 REPL 中的 R 代表 READ
,正常的 REPL(读取评估打印循环)已经读取输入,因此确实运行了读取器宏。为了防止评估,您需要引用它:
? '[books.bookid]