2011-11-18 18 views
5

Comencé a jugar con el sistema de coincidencia de patrón de Raqueta recientemente y me metí en un problema que no puedo entender.Coincidencia de patrón con estrella Kleene en el tipo de estructura en Raqueta

si lo hago:

(match (list 1 2 3 4 5 6 7 8 9 10 11 12) 
    [(list _ x y z ...) (list y ': x)]) 

en REPL me sale

'(3 : 2) 

como mi resultado deseado.

si lo hago:

(match (current-date) 
    [(date* _ x y z ...) (list y ': x)]) 

o

(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time") 
    [(date* _ x y z ...) (list y ': x)]) 

me sale este error:

match: wrong number for fields for structure date*: expected 12 but got 5 in: (_ x y z ...) 

Sospecho que la estrella de Kleene ... no funciona con el tipo de estructura para algunos razón. ¿Por que es esto entonces?

Respuesta

10

Parece que lo que realmente quiere hacer es hacer coincidir un subconjunto de los campos en una estructura, en lugar de vincular el resto de los campos en la estructura a (z ...). En este caso, puede intentar usar el patrón de coincidencia struct* en su lugar.

He aquí un ejemplo:

(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time") 
    [(struct* date ([minute x] [hour y])) (list y ': x)]) 
+0

+1 Su respuesta es mucho más útil que la mía. :-) – ruakh

+0

@ruakh su respuesta describe * por qué * no funciona. Esta respuesta describe * cómo * para que funcione. Ambos son bastante útiles. –

+0

Sí, ambos son útiles. Gracias. – mentus

8

i suspect that the Kleene star ... does not work with struct type for some reason.

Correcto. La notación ... y las anotaciones relacionadas ..k y ___ y __k, no son realmente una característica general de la coincidencia, sino más bien una característica específica de list -matching y hash-table -matching y así sucesivamente. Si se examina la producción formal en the documentation, verá que algunos tipos de sub-patrones aceptan lvp (que se define como sea pat, o pat seguido por ... o uno de sus amigos) en varios lugares, mientras que otros sólo aceptan pat.

Why is it so?

supongo que es simplemente que ... se utiliza para traducir parte de una lista o vector o tabla hash o lo que sea en su propia lista, y no hay manera sensata de hacer eso por una estructura de longitud fija. Puede valer la pena señalar que ... se comporta de manera diferente para los diferentes tipos —, por ejemplo, se puede usar para extraer una lista de las claves en una tabla hash —, por lo que la única razón para respaldar las estructuras sería si hubiera un operación análoga que tendría sentido para las estructuras. No creo que haya uno.

Cuestiones relacionadas