2010-06-16 3 views
6

Ich möchte Clojure-Code in Java einbetten. This Website war hilfreich in den Grundlagen der Einrichtung dieser, aber das einzige Argument, das es jemals passiert ist vom Typ String. Ich habe versucht, auch Ints zu verwenden, und diese funktionieren auch.Übergabe von Args an Clojure aus Java

Meine Frage ist, ob es eine formatierte Möglichkeit gibt, strukturierte Daten an Clojure weiterzuleiten. Insbesondere habe ich eine Liste von Punkten, würde Ich mag zu Clojure passieren und biegen in einen Vektor, der in etwa so aussehen würde:

[[1 2] [3 4] [5 6]] 

Was ist der einfachste Weg, um dies zu tun gehen? Gibt es eine Vorverarbeitung, die ich am Ende von Java machen kann, oder sollte ich am Ende von Clojure nachbearbeiten, oder gibt es etwas in Clojure, das damit umgehen kann? Ich vermute, dass es eine Zeichenfolge von Zahlen und die Länge jedes Tupels an Clojure weiterleitet und es die Zeichenfolge in einen Vektor verarbeiten lässt. Allerdings hat dieser Aspekt von Clojure nicht viele Beispiele, und ich bin neugierig, wenn ich etwas Offensichtliches vermisse.

EDIT: Bitte schauen Sie sich die Antwort von mikera an, wenn Sie an der Weitergabe von Java-Objekten interessiert sind. Bitte schauen Sie sich meine Antwort unten an, wenn Sie Ihre Daten im Voraus nur in einem Clojure-Format für ein Set/Map/etc formatieren möchten.

Antwort

2

Es hängt ein wenig davon ab, in welchem ​​Format Ihre Daten beginnen, aber Sie finden es am einfachsten, das Java-Objekt, das die Daten darstellt, direkt zu übergeben und es mit Clojures Java-Interoperabilitätsfunktionen zu lesen.

z.B. Sie können direkt eine Java-Array von Punkten passieren und wie etwas tun:

(let [point (aget some-array index)] 
    (do-stuff-with-point point)) 
+0

Nun, ich bin mir nicht ganz sicher, welches Format ich am Ende haben will - es ist meistens nur explorativ. Ihre Lösung wird definitiv am besten mit Objects funktionieren. –

1

Für die Fälle, wenn Sie in einer einfachen Datenstruktur übergeben möchten, die Sie bereits formatiert haben wie Clojure in Java zu suchen, können Sie passieren in diesem arg als eine Schnur. Also für das Beispiel, das ich in meiner Frage gab, würde ich in

"[[1 2] [3 4] [5 6]]" 

als meine arg übergeben. Wenn Sie angerufen haben Clojure aufrufen mit (ARG), können Sie den ersten Schritt Ihrer Funktion machen auf Ihrem arg einen Anruf zu Readstring sein:

(defn foo [d] 
    (def data (read-string d))) 

Die oben einen Vektor erzeugen, wenn das Beispiel String übergeben wird in.