2010-07-30 15 views
5

Je souhaite activer les scripts Clojure définis par l'utilisateur pour interagir avec mon application Java. Le problème est, je ne sais pas à l'avance où les scripts Clojure seront situés, donc je ne peux pas les inclure dans mon classpath lors de l'exécution de l'application.Comment charger dynamiquement un script Clojure depuis l'extérieur de mon chemin de classe à partir de Java?

Comment charger dynamiquement un script Clojure depuis l'extérieur de mon chemin de classe?

J'ai essayé l'exemple simple:

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

avec un test.clj qui ressemble à:

(ns user) 

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

Mais pas de chance.

Je pense qu'il a quelque chose à voir avec RT.makeClassLoader() ou RT.baseLoader() et en utilisant le chargeur retourné pour charger le fichier clojure, mais je n'arrive pas à le faire fonctionner. (Je continue à obtenir ClassNotFound) Je pourrais probablement embrouiller le javadoc pour le clojure.lang.RT, mais je ne pouvais tout simplement pas les trouver.

+0

Ouais ... où est le javadoc! #:/ – progo

Répondre

6

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

+0

C'est tout. Merci Stuart! – brice

+0

Serait-il approprié pour moi d'ajouter ceci au wiki de clojure? – brice

1

Tant qu'ils dépendent de la substance dans votre classpath ce que vous pouvez faire est de lire le fichier en tant que chaîne et l'évaluer,

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

-chaîne lue lu un objet à partir du flux de sorte que vous devez Enveloppez tout dans une liste pour en faire un objet.

+0

Merci Hamza, mais je l'appelle de ** Java **. J'aimerais pouvoir faire un test. Mais sans docs je ne sais tout simplement pas où est la méthode 'eval'. (Ce n'est pas dans clojure.lang.RT - J'ai vérifié) – brice

+0

[Edit:] Attendez, je pense que je vous reçois. Voulez-vous dire écrire un fichier clojure dans un emplacement connu, et lui transmettre le contenu du fichier clojure que je veux interpréter comme un argument, de sorte qu'il renvoie ce que je veux. N'y a-t-il pas un moyen plus simple? – brice