在Racket/Scheme中,这种形式的语法大小写有什么用法

在Racket/Scheme中,这种形式的语法大小写有什么用法,scheme,pattern-matching,racket,Scheme,Pattern Matching,Racket,我被关于用法语法案例的文档弄糊涂了,但是f可能意味着什么呢 (define-syntax (check stx) (syntax-case stx () [(f (x y)) #'(list 'second: f x y)])) 这段代码以一种相当微妙的方式被破坏 首先, (define-syntax (check stx) (syntax-case stx () [(f (x y)) #'(list 'second: f

我被关于用法语法案例的文档弄糊涂了,但是f可能意味着什么呢

(define-syntax (check stx)
   (syntax-case stx ()
       [(f (x y))
        #'(list 'second: f x y)]))

这段代码以一种相当微妙的方式被破坏

首先,

(define-syntax (check stx)
   (syntax-case stx ()
       [(f (x y))
        #'(list 'second: f x y)]))

(check (3 4))
在:check中生成错误:check:错误语法

然而,问题在于扩展中出现的“f”的用法。要查看此信息,请尝试将其取出:

(define-syntax (check stx)
   (syntax-case stx ()
       [(f (x y))
        #'(list 'second: 1234 x y)]))

(check (3 4))
这很好,产生了“第二个:1234”

那么,为什么第一个失败了呢?问题是在你的第一个例子中

(check (3 4))
扩展到

(list 'second check 3 4)
但问题是,展开中的“check”是“check”宏的另一种用法,因此必须进一步展开,而第二次展开的形状不正确

要看到这一点,可以尝试使用宏步进器扩展程序。运行宏步进器,使用下拉菜单选择标准宏隐藏,单击结束->按钮,然后返回一步

通常的惯例是使用下划线u作为不关心符号,以与模式中宏的名称匹配,如下所示:

(define-syntax (check stx)
   (syntax-case stx ()
       [(_ (x y))
        #'(list 'second: 1234 x y)]))

(check (3 4))

出于好奇:这段代码来自哪里?

我正在racket学习语法,这段代码是用来测试的。因此,如果我在第一个例子中用fxy替换f,代码的语法是正确的,尽管最终是无限递归。约翰:你应该提到宏步进器!