Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 为什么不匹配_Scheme - Fatal编程技术网

Scheme 为什么不匹配

Scheme 为什么不匹配,scheme,Scheme,我对计划的宏观模式感到困惑 (define-syntax test (syntax-rules () ((_ (head ... (x y) . tail)) (syntax-error 'tail "tail is")) ((_ any ...) (syntax-error "fallback")))) 为什么测试1 7 2 4 34与第一条规则不匹配列表是一对,其cdr为,因此您的输入被认为是这样的: 1 7 2

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

(define-syntax test

  (syntax-rules ()

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

     (syntax-error

      'tail

      "tail is"))

    ((_ any ...)

     (syntax-error "fallback"))))
为什么测试1 7 2 4 34与第一条规则不匹配

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

1 7 2 4 34 .
因此,2 4被头部消耗,34与x y不匹配。

语法规则模式匹配器是贪婪的,不会在同一模式上回溯。头匹配1724,但34与xy不匹配,因此失败。如果在执行此操作后只需要一个元素:

(define-syntax test
  (syntax-rules ()
    ((_ (head ... (x y) last-element))
     (syntax-error
      'last-element
      "last element is"))
    ((_ any ...)
     (syntax-error "fallback"))))
如果您试图在最后两个元素列表之后获取零个或多个元素,那么您需要稍微调整一下,因为您仍然希望使用语法规则:

patytern中的符号与任何内容都匹配。这就是为什么xy的模式需要先执行,因为任何模式都与24匹配。对于测试1 7 2 4 34 3 4 5,柱子将为34 3 4 5,因为这两个元素都不匹配x y,但都匹配任何元素


请注意,语法错误不是方案的一部分

但是等等,你错过什么了吗?列表应该是cdr为的一对或另一个列表,对吗?因此,输入可以是:1 7 2 4。34对吧?简短的回答,第1、7、2、4题。34结束与上述相同的输入。你可能想观察一下CONS1'2的结果。我不明白你的意思。你能详细解释一下吗?那为什么尾巴不能匹配34
(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"))))