diferencia entre uso y requiere

¿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 ?

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.

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 progtwigdores 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.

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 (escritor lector)])

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)]))

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 ...) .