球拍宏语法匹配用方括号

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

(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

回到顶部