我有一个带有一些值(list 'foo 'bar 2 #t 42 9 2 'some)
的球拍列表。实际上,这些值遵循一些更具体的模式,但对于这个问题,这是无关紧要的。我想测试测试列表中是否有两个相同的值,在这种情况下是数字2,并获取元素和其他元素。这是我的尝试:
#lang racket
(match (list 'foo 'bar 2 #t 42 9 2 'some)
[(list-no-order a a rest ...)
"Do some stuff"]
[_ "Do some other stuff"])
模式为(list-no-order a a rest ...)
。但该计划的解释失败了:
a11: unbound identifier;
also, no #%top syntax transformer is bound in: a11
对我来说,转换宏时看起来很错误。如果将list-no-order
更改为list
,则模式可以正常工作,但当然只有元素位于列表的开头时才会有效。
我的模式是错误的,如果是这样,如何纠正它或者预期的模式是不可能的,解决它的最佳方法是什么?
答案 0 :(得分:1)
目前,最好的解决方法是使用#:when
条件:
#lang racket
(match (list 'foo 'bar 2 #t 42 9 2 'some)
[(list-no-order a b rest ...)
#:when (equal? a b)
"Do some stuff"]
[_ "Do some other stuff"])
答案 1 :(得分:0)
我想知道你为什么试图模仿匹配的东西。通过你的问题和代码我不清楚。我会通过纯列表处理来处理你的问题(至少据我所知)
(filter
(lambda (x)
;;filter for the first element of the prev created tuple and
;;check if its larger than 1
(> (first x) 1))
(map
(lambda (x)
;;tuple of the length of the prevously created group and the group itself
(cons (length x) x))
(group-by
;;just the element it seld
(lambda (x)
x)
(list 'foo 'bar 2 #t 42 9 2 'some))))