2012-05-02 8 views
12

Sono ancora abbastanza nuovo in Clojure, quindi mi scuso se questa è una domanda completamente nuova, ma non sono riuscito a trovare una risposta sufficiente online.Come faccio a fare riferimento a funzioni in altri file con leiningen?

In sostanza, il mio problema è che ogni volta che si tenta di eseguire il mio progetto, ottengo un errore come:

Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate greeter__init.class or greeter.clj on classpath: 

In questo caso, greeter.clj è in progetto nella stessa directory del file contenente la mia funzione principale.

Per scopi illustrativi, ho creato un progetto che ha un albero di directory simile a questo:

enter image description here

Il mio codice per core.clj è la seguente:

(ns omg.core 
(require [greeter])) 

(defn -main[] (greet)) 

Il mio codice per greeter.clj è:

(ns greeter) 

(defn greet [] println("Hello world")) 

Ogni volta che digito lein run -m omg.core Ricevo l'eccezione sopra menzionata. Che cosa sto facendo di sbagliato?

risposta

16

greeter namespace al livello sbagliato

(ns omg.greeter) 

I nomi nel namespace corrispondono alle cartelle nel percorso in modo da utilizzare il file in /src/omg/greeter.clj quel file deve contenere il omg.greeter spazio dei nomi. se si desidera avere appena chiamato greeter quindi spostarlo verso il basso una cartella

Quando si utilizza require è necessario precisare lo spazio dei nomi della funzione che si sta chiamando, in questo caso, che sarebbe (omg.greeter/greet). poiché questo è un problema, la funzione use richiede uno spazio dei nomi e aggiunge tutte le sue funzioni allo spazio dei nomi corrente. Un'altra opzione che è più selettiva è quello di utilizzare richiedere con un: fare riferimento un'opzione nella definizione dello spazio dei nomi

(ns omg.core 
    (require [omg.greeter :refer :all])) 

o

(ns omg.core 
    (require [omg.greeter :refer [greet]])) 

La maggior parte delle persone mettere le esigenze di spazio dei nomi nella chiamata ns nella parte superiore del file .

una rapida lettura di http://clojure.org/namespaces si spera aiuterà

+1

Arthur, grazie mille per la risposta e la tua spiegazione. Lo apprezzo molto. Ho funzionato eliminando la richiesta e aggiungendo (usa omg.greeter) al suo posto. –