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"))))