球拍宏语法匹配用方括号
出于某种原因,运行此行代码:球拍宏语法匹配用方括号
(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
。尽管没有更多的信息,但很难给出具体的建议。
回答:
阅读器将'("A")
变成(quote ("A"))
。这意味着 (TEST '("A"))
变成(TEST (quote ("A")))
。
这解释了为什么模式(TEST [<table> <name>])
匹配。子模式<table>
匹配quote
和<name>
匹配("A")
。
以上是 球拍宏语法匹配用方括号 的全部内容, 来源链接: utcz.com/qa/259369.html