【发布时间】:2011-10-27 01:17:06
【问题描述】:
我正在尝试使用 Racket 的“匹配”表单,并希望匹配列表中的项目序列。每个项目都有特定的属性。例如,如果我想匹配(大致)对应于正则表达式的数字和字符串的交替序列:
#rx"([0-9]+ \"[a-zA-Z0-9]+\")+"
下面的代码似乎可以完成这项工作:
(define (match-sequence L)
(let ([n-lst '()] ; Used to collect numbers found.
[s-lst '()]) ; Used to collect strings found.
(define (m-test L)
(match L
[(list-rest (? number? n) (? string? s) ... (? m-test))
(set! n-lst `(,@n-lst ,n))
(set! s-lst `(,@s-lst ,(car s)))
(list (reverse n-lst) (reverse s-lst))]
['()
#t]
[else
#f]))
(m-test L)))
我意识到#rx 和上面的代码并不完全匹配相同的序列,但这只是一个类比。
这是在 Racket 中最简洁的写法吗?
我试过这样的模式:
(list ((? number? n) (? string? s)) ...)
Racket 不接受这个。
如下模式: (list (?number?n) (?string?s) ...) 要求匹配列表的第一项为数字,所有其他项为字符串。
我尝试了多种方式进行准引用和拼接,但均未成功。
一定有更优雅的阵型,但我似乎找不到。任何帮助,将不胜感激。谢谢。
【问题讨论】: