2011-11-18 6 views
5

Ho iniziato a giocare con il sistema di abbinamento di modelli Racket di recente e mi sono imbattuto in un problema che non riesco a capire.Corrispondenza con la stella di Kleene sul tipo di struttura nella racchetta

se faccio:

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

in REPL ottengo

'(3 : 2) 

come il mio risultato desiderato.

se faccio:

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

ottengo questo errore:

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

Ho il sospetto che la stella di Kleene ... non funziona con il tipo di struct per un po ' ragionare. Perché è così?

risposta

10

Sembra che ciò che si vuole veramente fare è abbinare un sottoinsieme dei campi in una struttura, piuttosto che legare effettivamente il resto dei campi nella struttura a (z ...). In questo caso, potresti provare a utilizzare il modello di corrispondenza struct*.

Ecco un esempio:

(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 La tua risposta è in realtà molto più utile del mio. :-) – ruakh

+0

@ruakh la tua risposta descrive * perché * non funziona. Questa risposta descrive * come * per farlo funzionare. Entrambi sono abbastanza utili. –

+0

Sì, entrambi sono utili. Grazie. – mentus

8

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

Corretto. La notazione ... e le relative notazioni e ___ e , non sono in realtà una funzione generale di abbinamento, ma piuttosto una funzione specifica di list -matching e hash-table -matching e così via. Se si esamina la produzione formale in the documentation, si noterà che alcuni tipi di subpattern accettano lvp (che è definito come pat o pat seguito da ... o uno dei suoi amici) in vari punti, mentre altri accettano solo pat.

Why is it so?

Credo che sia semplicemente che ... viene utilizzato per tradurre parte di una lista o di un vettore o di hash-table o roba del genere nella propria lista, e non c'è modo sensato di farlo per una struttura di lunghezza fissa. Potrebbe essere utile sottolineare che ... si comporta in modo diverso per diversi tipi — ad esempio, può essere utilizzato per estrarre un elenco di chiavi in ​​una tabella hash —, quindi l'unico motivo per supportarlo per le strutture sarebbe se ci fosse uno specifico operazione analoga che avrebbe senso per le strutture. Non penso che ce ne sia uno.

Problemi correlati