2016-04-07 82 views
6

我有一个球拍列表,其中有些值为(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,则该模式将起作用,但当然只有当元素位于列表的开头时才适用。

我的模式是错误的,如果是的话如何纠正它,或者是不可能的预期模式,什么是解决它的最佳方式?

+2

这里是'(匹配宏展开(表2 2#T)(列表无秩序ASD ASD后的结果dsa)“做一些事情”])':http://pastebin.com/K3PG44kY。我们可以看到有一个未绑定的id asd8。也许这个宏是越野车? –

+0

你有多确定这是一个错误?我应该向球拍开发者报告吗? – Pyfisch

+1

报告在[Github](https://github.com/racket/racket/issues/1304)。 – Pyfisch

回答

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)))) 
相关问题