2012-07-27 2 views
6

, wenn ich so etwas wie dies (define s (hi,there)) wie kann ich dann in Übereinstimmung wie (match s [(,h , ,t)] ...) schreiben, aber es funktioniert nicht, weil match die , so wie benötigt, kann ich dies tun?Wie passt man, im Match in Racket?

+0

den unaufgeforderten Kommentar vergeben, aber es scheint mir, dass die Verwendung von Rackets "Match" zum Parsen von Eingaben, die Kommas enthalten, wahrscheinlich keine gute Idee ist; es sei denn, der Rest der Eingabe ist wirklich sehr nahe an Racket/LISP, dies klingt wie ein Fall für das Beißen der Kugel und die Verwendung eines tatsächlichen Parsers. Entschuldigung im Voraus, wenn ich Ihren Anwendungsfall missverstanden habe. –

+0

@JohnClements Ich denke, du hast Recht .. und die Geschichte ist, dass mein Hauptprogramm in Racket geschrieben ist und ich möchte nur die Datenstrukturen aus dem Parsing der Datei in Racket aufbauen. Die Datei sieht fast wie S-Exp aus, dann bis sehr spät, ich fand, es gab Kommas ... –

+0

Haben Sie irgendeine Art von Spezifikation für welche Formen in der Quelldatei auftreten können? Wird die Quelldatei in einer bekannten Sprache geschrieben? –

Antwort

7

Bitte beachten Sie, dass das Komma , ein spezielles Leserkürzel ist. Die (hi,there) ist ein Lesen als (hi (unquote there)). Dies ist schwer zu erkennen - da der Standarddrucker Listen druckt, deren erstes Element ist ein unquote in einer besonderen Art und Weise.

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

Daher ist das Muster, das Sie benötigen '(Liste h (Liste' unquote t)) '.

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

einen umgekehrten Schrägstrich verwenden, wenn Sie Komma als Symbol innerhalb eines zitierten Abschnitt verwenden möchten:

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

Und '|,| für das Standalone-Komma-Symbol verwenden.

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

In beiden Fällen sollten Sie Whitespace verwenden, um Dinge zu trennen und Listen zu verwenden.

(define s (hi,there)) ist ungültig Racket.

+0

Der Grund dafür ist, dass die Datei, die ich parsiere, es verwendet, um viele Dinge zu trennen, und ich möchte Racket-Match verwenden, um die Datei zu analysieren (eigentlich mehr interessiert, wenn ich gefunden habe Komma ist so speziell in Racket!) Aber danke für die Antworten von euch Jungs) –

1

Ich denke, Sie könnten verwirrt sein, wo Sie Kommas brauchen. In Racket verwenden Sie keine Kommas, um Elemente in einer Liste zu trennen. Stattdessen verwenden Sie nur Leerzeichen. Sag mir, wenn das falsch ist, aber was ich mir vorstelle, ist, dass du einen Ausdruck wie (define s '(hi there)) abgleichen willst. Um dies zu erreichen, würden Sie

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

verwenden Dann werden in dem Bereich, wo die Ellipsen sind, hat die Variable h den Wert 'hi und die Variable t den Wert 'there

+0

Ich möchte nur "Match" in Racket nutzen, um das s-Ausdruck-ähnliche Format mit COMMA in Klammern zu parsen. –