我对方案的宏观模式感到困惑
(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] 删除。
我来说两句