【发布时间】:2011-07-10 20:33:28
【问题描述】:
我对有关用法语法案例的文档感到困惑,但f 可能意味着什么?
(define-syntax (check stx)
(syntax-case stx ()
[(f (x y))
#'(list 'second: f x y)]))
【问题讨论】:
标签: scheme pattern-matching racket
我对有关用法语法案例的文档感到困惑,但f 可能意味着什么?
(define-syntax (check stx)
(syntax-case stx ()
[(f (x y))
#'(list 'second: f x y)]))
【问题讨论】:
标签: scheme pattern-matching racket
这段代码以相当微妙的方式被破坏。
首先,
(define-syntax (check stx)
(syntax-case stx ()
[(f (x y))
#'(list 'second: f x y)]))
(check (3 4))
产生错误:check: bad syntax in: check
不过,问题在于展开式中出现的“f”的使用。要查看此内容,请尝试将其取出:
(define-syntax (check stx)
(syntax-case stx ()
[(f (x y))
#'(list 'second: 1234 x y)]))
(check (3 4))
这可以很好地评估,产生 '(second: 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))
出于好奇:这段代码来自哪里?
【讨论】:
f 替换为(f (x y)),则代码在语法上是正确的,但最终会导致无限递归。谢谢。