Alguém pode explicar a diferença entre usee require, quando usado diretamente e como :usee :requirena nsmacro?
Alguém pode explicar a diferença entre usee require, quando usado diretamente e como :usee :requirena nsmacro?
Respostas:
requirecarrega libs (que ainda não foram carregadas), usefaz o mesmo e se refere aos seus namespaces com clojure.core/refer(para que você também tenha a possibilidade de usar :excludeetc como em clojure.core/refer). Ambos são recomendados para uso em nsvez de diretamente.
É idiomático incluir funções externas com requiree refer. Você evita conflitos de espaço para nome, inclui apenas funções que realmente usa / precisa e declara explicitamente o local de cada função:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
Não preciso chamar essa função prefixando-a com seu espaço para nome:
(wrap-reload) ; works
Se você não usar, referprecisará prefixar o espaço para nome:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
Se você escolher use, (praticamente) sempre use only:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
Caso contrário, você está incluindo tudo, tornando-a uma operação desnecessariamente grande e muito confusa para outros programadores descobrirem onde estão as funções.
Além disso, eu recomendo este blog como um recurso para aprender mais sobre os namespaces do Clojure.
(:use foo :only [bar])e (:require foo :refer [bar])? Parece estranho ter duas maneiras de fazer isso.
(:require .. :refer ..)é uma nova maneira de fazer a mesma coisa que permite que você efetue a depreciação :use, o que tem algumas desvantagens.
Certifique-se de tornar mais fácil, não exigindo que você soletre o espaço para nome toda vez que quiser chamar uma função, mas também pode causar uma confusão, criando conflitos no espaço para nome. Um bom meio termo entre "use" e "require" é apenas 'usar' as funções de um espaço para nome que você realmente usa.
por exemplo:
(use '[clojure-contrib.duck-streams: only (escritor escritor)])ou melhor ainda, especifique-o na parte superior do arquivo na definição de namespace:
(ns com.me.project (: use [clojure.contrib.test-is: only (deftest é executar testes)]))
(ns ...)sintaxe; Eu estava procurando por isso, mas todos os exemplos que encontrei foram claros (use ...).
(require '[namepase :refer [var-name1 var-name2]])
Como já foi mencionado, a grande diferença é que (require 'foo), com , você se refere a nomes no espaço de nomes da biblioteca da seguinte forma: (foo/bar ...)se o fizer (use 'foo), eles estarão agora no seu espaço de nomes atual (o que quer que seja e desde que não haja conflitos) e você pode chamar eles gostam (bar ...).