读取器宏调试


情况

是这样的:

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]

相关内容

  • 没有找到相关文章

最新更新