tutorial online example clojure

clojure - online - diferencia entre uso y requiere



clojure vs scala (4)

¿Alguien puede explicar la diferencia entre el use y el require , tanto cuando se usa directamente como como :use y :require en la macro ns ?


Como se ha mencionado, la gran diferencia es que con (require ''foo) , luego se refieren a los nombres en el espacio de nombres de lib como sigue: (foo/bar ...) si lo hace (use ''foo) entonces están ahora en su el espacio de nombres actual (cualquiera que sea y siempre que no haya conflictos) y puede llamarlos como (bar ...) .


El uso seguro lo hace más fácil al no requerir que deletree el espacio de nombres cada vez que quiera llamar a una función, aunque también puede hacer un lío de cosas creando conflictos de espacio de nombres. Un buen punto medio entre "usar" y "requerir" es solo "usar" las funciones de un espacio de nombres que realmente usa.

por ejemplo:

(use ''[clojure-contrib.duck-streams :only (writer reader)]) o incluso mejor, especifíquelo en la parte superior del archivo en la definición del espacio de nombres:

(ns com.me.project (:use [clojure.contrib.test-is :only (deftest is run-tests)]))


Es idiomático incluir funciones externas con require y refer . Evita conflictos de espacios de nombres, solo incluye funciones que realmente usa / necesita, y declara explícitamente la ubicación de cada función.

(ns project.core (:require [ring.middleware.reload :refer [wrap-reload]]))

No tengo que invocar esta función precediéndola con su espacio de nombres.

(wrap-reload) ; works

Si no usas refer necesitarás proceder con el espacio de nombres.

(ring.middleware.reload/wrap-reload) ; works if you don''t use refer in your require

Si elige use en use lugar, (más o menos) siempre use only .

(ns project.core (:use [ring.middleware.reload :only [wrap-reload]]))

De lo contrario, está incluyendo todo, lo que lo convierte en una operación innecesariamente grande y muy confuso para otros programadores para encontrar dónde viven las funciones.

Además, recomiendo este blog como recurso para aprender más sobre los espacios de nombres de Clojure.


require cargas libs (que no están ya cargadas), use hace lo mismo y se refiere a sus espacios de nombres con clojure.core/refer (para que también tenga la posibilidad de usar :exclude etc como con clojure.core/refer ). Ambos se recomiendan para su uso en ns en lugar de directamente.