首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么它不匹配?

为什么它不匹配?
EN

Stack Overflow用户
提问于 2019-05-31 12:32:39
回答 2查看 75关注 0票数 2

我对计划的宏观模式感到困惑

代码语言:javascript
复制
(define-syntax test

  (syntax-rules ()

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

     (syntax-error

      'tail

      "tail is"))

    ((_ any ...)

     (syntax-error "fallback"))))

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-02 00:39:07

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

代码语言:javascript
复制
(define-syntax test
  (syntax-rules ()
    ((_ (head ... (x y) last-element))
     (syntax-error
      'last-element
      "last element is"))
    ((_ any ...)
     (syntax-error "fallback"))))

如果您试图在最后一个两个元素列表之后获取零个或更多元素,那么您需要稍微修改一下,因为您仍然想要使用syntax-rules

代码语言:javascript
复制
(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"))))

模式中的符号可以匹配任何内容。这就是为什么需要首先使用(x y)的模式,因为any也与(2 4)匹配。例如:对于(test (1 7 (2 4) 34 (3 4 5))),post将为(34 (3 4 5)),因为这两个元素都不匹配(x y),但都匹配any

请注意,syntax-error不是方案的一部分。

票数 1
EN

Stack Overflow用户

发布于 2019-05-31 14:45:53

列表是一对cdr()的列表,因此您的输入被认为是这样的:

代码语言:javascript
复制
(1 7 (2 4) 34 . ())

因此(2 4)head使用,而34(x y)不匹配。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56388703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档