在Racket / Scheme中以这种形式使用syntax-case有什么用处

时间:2011-03-08 05:03:43

标签: scheme pattern-matching racket

我对使用语法案例的文档感到困惑,但f可能意味着什么?

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

1 个答案:

答案 0 :(得分:1)

此代码以相当微妙的方式被破坏。

首先,

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

(check (3 4))

产生错误:检查:语法错误:检查

但问题是扩展中出现的'f'的 use 。要看到这一点,请尝试将其取出:

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

(check (3 4))

这评估罚款,产生'(第二名:1234 3 4)

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

(check (3 4))

扩展为

(list 'second check 3 4)

但问题在于,扩展中的“检查”是“检查”宏的另一种用途,因此必须进一步扩展,并且第二次扩展不具备正确的形状。

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

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

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

(check (3 4))

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