2012-07-27 12 views
6

se ho qualcosa di simile (define s (hi,there)) allora come posso scrivere in partita come (match s [(,h , ,t)] ...) Ma non funziona, perché ha bisogno della match, così come posso fare questo?Come abbinare, in partita in racchetta?

+0

perdonare il commento non richiesto, ma mi sembra che usare la "corrispondenza" della racchetta per analizzare un input contenente virgole non sia probabilmente una grande idea; a meno che il resto dell'input sia davvero molto molto vicino a racket/LISP, questo sembra un caso per mordere il proiettile e usare un parser reale. Mi scuso in anticipo se ho frainteso il tuo caso d'uso. –

+0

@JohnClements Penso che tu abbia ragione ... e la storia è che il mio programma principale è scritto in Racket e voglio solo ottenere le strutture dati dall'analisi del file in Racket. Il file sembra quasi S-Exp, quindi fino a molto tardi ho trovato delle virgole ... –

+0

Hai qualche tipo di specifica per quali moduli possono verificarsi nel file sorgente? Il file sorgente è scritto in una lingua ben conosciuta? –

risposta

7

Innanzitutto, la virgola , è un'abbreviazione speciale per il lettore. Il numero (hi,there) è una lettura come (hi (unquote there)). Questo è difficile da individuare - poiché la stampante predefinita stampa gli elenchi il cui primo elemento è uno unquote in un modo speciale.

Welcome to DrRacket, version 5.3.0.14--2012-07-24(f8f24ff2/d) [3m]. 
Language: racket. 
> (list 'hi (list 'unquote 'there)) 
'(hi ,there) 

Pertanto il motivo necessario è '(elenco h (elenco' unquote t)) '.

> (define s '(hi,there)) 
> (match s [(list h (list 'unquote t)) (list h t)]) 
(list 'hi 'there) 
2

utilizzare una barra rovesciata se si desidera utilizzare una virgola come simbolo all'interno di una sezione citata:

> (define s '(hi \, there)) 
> (match s [(list h c t) (symbol->string c)]) 
"," 

E utilizzare '|,| per il simbolo virgola standalone.

> (match s [(list h '|,| t) (list h t)]) 
'(hi there) 

In entrambi i casi, si dovrebbe utilizzare gli spazi per separare le cose, e utilizzare gli elenchi.

(define s (hi,there)) non valido Racchetta.

+0

Il motivo per cui è presente una virgola è che il file che sto analizzando lo usa per separare molte cose e voglio usare la corrispondenza Racket per analizzare il file (in realtà più interessato quando ho trovato virgola è così speciale in Racket!) Ma grazie per le risposte da voi ragazzi) –

1

Penso che potresti essere confuso su dove hai bisogno di virgole. In Racket, non usi le virgole per separare gli elementi in una lista. Invece, usi semplicemente gli spazi bianchi. Dimmi se questo è sbagliato, ma quello che immagino è che stai cercando di abbinare un'espressione come (define s '(hi there)). Per fare questo, è necessario utilizzare

(match s 
    [`(,h ,t) ...]) 

Poi, nella zona in cui le ellissi è, la variabile h ha il valore 'hi, e la variabile t ha il valore 'there

+0

Voglio solo approfittare di 'match' in Racket per analizzare il formato simile a s-expression WITH COMMA tra parentesi. –