【问题标题】:What 's usage of syntax-case in this form in Racket/Scheme在 Racket/Scheme 中这种形式的语法大小写的用法是什么
【发布时间】: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


    【解决方案1】:

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

    首先,

    (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)),则代码在语法上是正确的,但最终会导致无限递归。谢谢。
    • 约翰:你应该提到宏步进器!
    猜你喜欢
    • 2019-10-24
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2017-08-18
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多