【问题标题】:Reader macro debugging阅读器宏调试
【发布时间】:2012-12-01 02:26:47
【问题描述】:

情况如下:

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

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

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

我还是想知道读宏的事情。

【问题讨论】:

    标签: debugging lisp reader-macro


    【解决方案1】:

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

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

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

    另请参阅:Quote a reader macro invocation

    【讨论】:

      【解决方案2】:

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

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

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

      ? '[books.bookid]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        相关资源
        最近更新 更多