2010-08-06 9 views
10

Ich erstelle ein Komfort-Makro. Ein Teil der Bequemlichkeit ist, dass ein regulärer Ausdruck nur mit einem String angegeben werden kann, und nicht mit der Schreibweise "re".Wie schreibe ich ein Clojure-Makro, um einen regulären Ausdruck aus einem String zu erstellen?

Der eine Teil, den ich nicht herausfinden kann, ist, wie man den Makro dazu bringt, den String zu nehmen und ihn als Clojure-Regex umzuschreiben (z. B. die # "re" -Notation). Ich denke, es ist ein Syntax/Escape-Problem.

Mein erster naiver Versuch (vorgibt, ich nur den String-to-regex Teil will):

(defmacro mymac [mystr] `#~mystr) 

Ist es überhaupt möglich zu tun, was ich versuche zu tun? Oder gibt es eine tatsächliche Funktion, um eine Zeichenfolge zu nehmen und eine Regex zu erzeugen, anstatt das # Leser-Makro zu verwenden?

Oder sollte ich nur in Java fallen und java.util.regex.Pattern verwenden?

Antwort

28

Es gibt eine Funktion für sie: re-pattern

user=> (re-pattern "\\d+") 
#"\d+" 
0

Ich mag die Frage falsch verstehen, aber tut das nicht, was Sie wollen?

user=> (. java.util.regex.Pattern compile "mystr") 
#"mystr" 
+0

ja tut es genau was ich will. aber du musst zugeben, nicht so schön wie j-g-faustus (re-pattern "mystr") – dirtyvagabond

+0

Nein, in der Tat nicht. – Sean

7

ein bisschen mehr zu erklären:

#"" ist ein Leser Makro. Es wird zur Lesezeit vom Leser aufgelöst. Es gibt also keine Möglichkeit, ein Makro zu erstellen, das sich zu einem Lesemakro erweitert, weil die Lesephase längst vorbei ist. Ein Makro gibt die tatsächliche Datenstruktur zurück, die den erweiterten Code darstellt, und nicht eine Zeichenfolge, die wie z. #define arbeitet in C.

j-g-faustus' Antwort der richtige Weg (tm) zu gehen.

+0

Danke Kotarak. Ich hätte verstehen müssen, warum der Lebenszyklus des Lesers mich daran hindert, das zu tun, was ich versucht habe. Vielen Dank! – dirtyvagabond

0

eine Zeichenfolge wörtlich übereinstimmen, Sonderzeichen ignorieren:

nur
(defn to-regex [some-string] 
    (re-pattern (java.util.regex.Pattern/quote some-string))) 

Dann ... wird ... entsprechen, nicht aaa oder andere Drei-Buchstaben-Kombination.

Verwandte Themen