2012-05-02 10 views
12

Todavía soy bastante nuevo en Clojure, por lo que me disculpo si esta es una pregunta completamente nueva, pero no pude encontrar una respuesta suficiente en línea.¿Cómo hago referencia a funciones en otros archivos con leiningen?

Básicamente, mi problema es que cada vez que trato de ejecutar mi proyecto, me sale un error como:

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

En este caso, greeter.clj está en el proyecto en el mismo directorio que el archivo que contiene mi función principal.

Con fines ilustrativos, he creado un proyecto que tiene un árbol de directorios como esto:

enter image description here

Mi código para core.clj es el siguiente:

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

(defn -main[] (greet)) 

Mi código para greeter.clj es:

(ns greeter) 

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

Siempre que escribo lein run -m omg.core Recibo la excepción mencionada anteriormente. ¿Qué estoy haciendo mal?

Respuesta

16

el interfaz de espacio de nombres que en el nivel equivocado

(ns omg.greeter) 

Los nombres de espacio de nombres se corresponden con las carpetas en la ruta de acceso para utilizar el archivo en /src/omg/greeter.clj ese archivo debe contener la omg.greeter espacio de nombres. si usted quiere tener que acaba de llamar greeter luego moverlo hacia abajo una carpeta

Al utilizar require que necesita para explicar el espacio de nombres de la función que llama, en este caso sería (omg.greeter/greet). ya que esto es un problema, la función use requiere un espacio de nombre y agrega todas sus funciones al espacio de nombre actual. Otra opción que es más selectivo es el uso de requerir con la opción: hacer referencia en la definición de espacio de nombres

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

o

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

La mayoría de la gente pone los requisitos de espacio de nombres en la llamada ns en la parte superior del archivo .

una lectura rápida de http://clojure.org/namespaces se espera ayude a

+1

Arthur, muchas gracias por su respuesta y su explicación. Realmente lo aprecio. Lo hice funcionar eliminando el requerimiento y agregando (use omg.greeter) en su lugar. –

Cuestiones relacionadas