• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

球拍宏语法匹配用方括号

scheme 来源:Sam 6次浏览

出于某种原因,运行此行代码:球拍宏语法匹配用方括号

(define-syntax TEST 
    (syntax-rules() 
     [(TEST [<table> <name>]) 
     (print "Should not be here")] ;This statement is executed 
     [(TEST <table>) 
     (print "Should be here")] ;This should be executed but is not 
    )) 

这怎么可能:

(TEST '("A")) 

的语法定义相匹配?它对我来说没有意义,因为TEST之后的文字只是一个参数。它如何匹配两个模式变量?

===========解决方案如下:

请注意,'x只是(quote x)的读者缩写。因此,当您编写(TEST '("A"))时,与编写(TEST (quote ("A")))完全相同。因此,它匹配<table>绑定到quote<name>绑定到("A")的第一个模式。

这可能有点令人困惑,但请记住,宏在编译时完全运行。因此,在传递给宏之前,'("A")从不被评估为任何东西,它只是直接切换。 syntax-rules模式匹配构造完全不关心quote的特殊含义,它只是匹配列表和对的语法结构,因此您可以获得您发现的行为。

根据你实际尝试做什么,有几种方法可以获得你想要的行为。如果您希望与运行时值进行模式匹配,请使用match,而不是syntax-rules。如果您确实需要一个宏,但您希望更具体地了解将匹配的事物种类,则可能需要使用syntax-parse而不是syntax-rules。尽管没有更多的信息,但很难给出具体的建议。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)