2016-04-07 29 views
6

Ho una lista Racket con alcuni valori (list 'foo 'bar 2 #t 42 9 2 'some). In realtà questi valori seguono uno schema più specifico ma per la questione questo è irrilevante. Voglio testare se ci sono due valori identici nella lista, in questo caso il numero 2, e ottenere l'elemento e gli altri elementi. Questo è il mio tentativo:Corrisponde se due valori in una lista non ordinata sono uguali

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

Il modello è (list-no-order a a rest ...). Ma l'interpretazione del programma non riesce con:

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

A me sembra un errore quando si trasforma la macro. Se si modifica list-no-order a list, il modello funziona ma, naturalmente, solo se gli elementi si trovano all'inizio della lista.

Il mio schema è errato, in tal caso come correggerlo o il modello previsto non è possibile e qual è il modo migliore per aggirare il problema?

+2

Ecco un risultato dopo macro espansione del '(partita (elenco 2 2 #t) [(lista-no-ordine asd asd dsa) "Fai qualcosa"]) ': http://pastebin.com/K3PG44kY. Possiamo vedere che esiste un ID non associato 'asd8'. Forse la macro è bacata? –

+0

Quanto sei sicuro che questo sia un bug? Devo segnalarlo agli sviluppatori di Racket? – Pyfisch

+1

Segnalato in [Github] (https://github.com/racket/racket/issues/1304). – Pyfisch

risposta

0

Mi chiedo perché stai provando a modellare qualcosa. Non è chiaro per me tramite la tua domanda e il codice. Vorrei affrontare il problema attraverso l'elaborazione lista puro (almeno per quanto mi pare di capire)

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