Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 与方括号匹配的Racket宏语法_Scheme_Racket - Fatal编程技术网

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”)
在传递给宏之前,从来不会对任何东西求值,而是直接传递给宏。
语法规则
模式匹配结构根本不关心
引号
的特殊含义,它只与列表和对的语法结构匹配,因此您可以得到您发现的行为

根据您实际想要做的事情,有几种方法可以让您获得想要的行为。如果要根据运行时值进行模式匹配,请使用
匹配
,而不是
语法规则
。如果您确实想要一个宏,但希望更具体地描述将匹配的内容,那么您可能希望使用
语法分析
,而不是
语法规则
。但是,如果没有更多的信息,就很难给出具体的建议