Scheme 与方括号匹配的Racket宏语法
出于某种原因,运行这行代码:Scheme 与方括号匹配的Racket宏语法,scheme,racket,Scheme,Racket,出于某种原因,运行这行代码: (TEST '("A")) 匹配语法定义: (define-syntax TEST (syntax-rules () [(TEST [<table> <name>]) (print "Should not be here")] ;This statement is executed [(TEST <table>) (print "Should be here
(TEST '("A"))
匹配语法定义:
(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
))
(定义语法测试)
(语法规则()
[(测试[])
(打印“不应在此”);执行此语句
[(测试)
(打印“应在此处”);应执行此操作,但不执行此操作
))
这怎么可能?这对我来说没有意义,因为测试后的文本只是一个参数。它如何匹配两个模式变量 读取器将'(“A”)
转换为(引号(“A”)
)。这意味着
(TEST'(“A”)
变为(TEST(TEST)(“A”))
这解释了模式
(TEST[])
匹配的原因。子模式
匹配quote
和
匹配(“A”)
请注意,'x
只是(quote x)
的读取器缩写。因此,当您编写(TEST'(“A”)
时,它与编写(TEST(引号(“A”))
完全相同。因此,它匹配第一个模式,其中
绑定到quote
,而
绑定到(“A”)
这可能有点混乱,但请记住,宏完全在编译时操作。由于这个原因,(“A”)
在传递给宏之前,从来不会对任何东西求值,而是直接传递给宏。语法规则
模式匹配结构根本不关心引号
的特殊含义,它只与列表和对的语法结构匹配,因此您可以得到您发现的行为
根据您实际想要做的事情,有几种方法可以让您获得想要的行为。如果要根据运行时值进行模式匹配,请使用匹配
,而不是语法规则
。如果您确实想要一个宏,但希望更具体地描述将匹配的内容,那么您可能希望使用语法分析
,而不是语法规则
。但是,如果没有更多的信息,就很难给出具体的建议