2016-04-07 45 views
6

Mam listę rakiet z pewnymi wartościami (list 'foo 'bar 2 #t 42 9 2 'some). W rzeczywistości wartości te są zgodne z bardziej konkretnym schematem, ale na pytanie to nie ma znaczenia. Chcę przetestować test, jeśli na liście znajdują się dwie identyczne wartości, w tym przypadku liczba 2, i uzyskać element i inne elementy. To jest moja próba:Dopasuj, jeśli dwie wartości na niezameldowanej liście są takie same

#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"]) 

Wzór ma postać (list-no-order a a rest ...). Ale interpretacja programu kończy się niepowodzeniem z:

a11: unbound identifier; 
also, no #%top syntax transformer is bound in: a11 

Dla mnie wygląda na błąd podczas transformacji makra. Jeśli zmieni się list-no-order na list, wzór działa, ale oczywiście tylko wtedy, gdy elementy znajdują się na początku listy.

Czy mój wzorzec jest błędny, jeśli tak, jak go poprawić, czy też zamierzony wzór nie jest możliwy i jaki jest najlepszy sposób obejścia go?

+2

Oto wynik po makro ekspansji '(mecz (lista 2 2 #ti) [(lista-no-order asd asd dsa) "Zrób trochę rzeczy"]) ': http://pastebin.com/K3PG44kY. Widzimy, że istnieje niezwiązany identyfikator 'asd8'. Być może makro jest błędne? –

+0

Na ile jesteś pewien, że to błąd? Czy powinienem zgłosić to deweloperom rakiety? – Pyfisch

+1

Zgłoszono w [Github] (https://github.com/racket/racket/issues/1304). – Pyfisch

Odpowiedz

0

Zastanawiam się, dlaczego próbujesz dopasować wzór do czegoś. Nie jest dla mnie jasne przez twoje pytanie i kod. Chciałbym podejść do problemu za pomocą czystego przetwarzania listy (przynajmniej o ile mi zrozumieć)

(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))))