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