2010-07-30 8 views
5

Desidero abilitare gli script Clojure definiti dall'utente per interagire con la mia app Java. Il problema è che non so in anticipo dove saranno posizionati gli script Clojure, quindi non posso includerli nel mio classpath durante l'esecuzione dell'app.Come caricare dinamicamente uno script Clojure dall'esterno del mio classpath da java?

Come caricare dinamicamente uno script Clojure dall'esterno del classpath?

Ho provato il semplice esempio:

RT.loadResourceScript("test.clj"); 
Var foo = RT.var("user", "foo"); 
Object result = foo.invoke("Hi", "there"); 
System.out.println(result); 

con un test.clj che assomiglia:

(ns user) 

(defn foo [a b] 
    (str a " " b)) 

ma senza fortuna.

Penso che abbia qualcosa a che fare con RT.makeClassLoader() o RT.baseLoader() e utilizzare il caricatore restituito per caricare il file clojure, ma non riesco a farlo funzionare. (Continuo a ricevere ClassNotFound) Potrei probabilmente confondermi con la javadoc per lo clojure.lang.RT, ma semplicemente non sono riuscito a trovarli.

+0

Sì ... dov'è il javadoc! #:/ – progo

risposta

6

Prova clojure.lang.Compiler.loadFile(String file)

+0

Ecco fatto. Grazie Stuart! – brice

+0

Sarebbe appropriato per me aggiungerlo al wiki di clojure? – brice

1

Fintanto che dipendono dalla roba nel classpath che cosa si può fare è leggere il file come una stringa e valutarlo,

(def content "(ns user) (defn foo [a b] (str a \" \" b))") 
(map eval (read-string (str \(content \)))) 

lettura stringa di leggere un oggetto dal flusso quindi è necessario avvolgere tutto in una lista per renderlo un oggetto.

+0

Grazie Hamza, ma lo chiamo da ** Java **. Mi piacerebbe essere in grado di fare una valutazione. Ma senza documenti semplicemente non so dove sia il metodo 'eval'. (non è in clojure.lang.RT - Ho controllato) – brice

+0

[Modifica:] Aspetta, penso di averti. Vuoi dire scrivere un file clojure in una posizione nota e passargli il contenuto del file clojure che voglio interpretato come arg, in modo che restituisca ciò che voglio. Non c'è un modo più semplice? – brice

Problemi correlati