为什么不匹配

Jiacheng Wang

我对方案的宏观模式感到困惑

(define-syntax test

  (syntax-rules ()

    ((_ (head ... (x y) . tail))

     (syntax-error

      'tail

      "tail is"))

    ((_ any ...)

     (syntax-error "fallback"))))

为什么不(test (1 7 (2 4) 34))符合第一条规则

除夕夜

语法规则模式匹配器是贪婪的,不会在同一模式上回溯。head ...匹配(1 7 (2 4)),但34不匹配(x y),因此失败。如果您只希望一个元素可以执行以下操作:

(define-syntax test
  (syntax-rules ()
    ((_ (head ... (x y) last-element))
     (syntax-error
      'last-element
      "last element is"))
    ((_ any ...)
     (syntax-error "fallback"))))

如果您试图在最后两个列表之后获取零个或多个元素,那么您还需要对它进行一些说明,因为您仍要使用syntax-rules

(define-syntax test
  (syntax-rules (build)
    ((_ build m post (x y) . tail)
     (test build #t () . tail))
    ((_ build m (post ...) any . tail)
     (test build m (post ... any) . tail))
    ((_ build #t post)
     (syntax-error
      'post
      "tail is"))
    ((_ (head ...))
     (test build #f () head ...))
    ((_ any ...)
     (syntax-error "fallback"))))

patytern中的符号可以匹配任何内容。这就是为什么模式(x y)也要any匹配的原因,所以需要首先使用(2 4)例如。对于(test (1 7 (2 4) 34 (3 4 5)))这个帖子将会(34 (3 4 5))因为无论这些元素的比赛(x y),但两场比赛any

请注意,这syntax-error不属于Scheme。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章