Reader宏调试

时间:2012-12-01 02:26:48

标签: debugging lisp reader-macro

情况如下:

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)

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

2 个答案:

答案 0 :(得分:1)

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

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

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

另请参阅:Quote a reader macro invocation

答案 1 :(得分:1)

要查看阅读器宏的扩展,您需要read某些内容:

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

由于 REPL 中的 R 代表READ,因此正常的REPL(读取eval打印循环)已经读取输入,因此会运行读取器宏。要阻止评估,您需要引用它:

? '[books.bookid]
相关问题