我对计划的宏观模式感到困惑
(define-syntax test
(syntax-rules ()
((_ (head ... (x y) . tail))
(syntax-error
'tail
"tail is"))
((_ any ...)
(syntax-error "fallback"))))为什么(test (1 7 (2 4) 34))不符合第一条规则
发布于 2019-06-02 00:39:07
语法规则模式匹配器是贪婪的,并且不会在相同的模式上回溯。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"))))模式中的符号可以匹配任何内容。这就是为什么需要首先使用(x y)的模式,因为any也与(2 4)匹配。例如:对于(test (1 7 (2 4) 34 (3 4 5))),post将为(34 (3 4 5)),因为这两个元素都不匹配(x y),但都匹配any。
请注意,syntax-error不是方案的一部分。
发布于 2019-05-31 14:45:53
列表是一对cdr为()的列表,因此您的输入被认为是这样的:
(1 7 (2 4) 34 . ())因此(2 4)由head使用,而34与(x y)不匹配。
https://stackoverflow.com/questions/56388703
复制相似问题