require
загружает библиотеки (которые еще не загружены), use
делает то же самое плюс ссылается на их пространства имен с помощью ] clojure.core / refer
(так что вы также получаете возможность использовать : exclude
и т. д., как с clojure.core / refer
). Оба рекомендуются для использования в нс
, а не напрямую.
Как уже упоминалось, большая разница в том, что с (require 'foo)
вы затем ссылаетесь на имена в пространстве имен библиотеки следующим образом: (foo / bar ...)
если вы сделаете (используйте 'foo)
, то они теперь находятся в вашем текущем пространстве имен (каким бы оно ни было и при условии отсутствия конфликтов), и вы можете называть их как (бар ...)
.
Использование уверенности облегчает задачу, поскольку не требует указывать пространство имен каждый раз, когда вы хотите вызвать функцию, хотя это также может испортить ситуацию, создавая конфликты пространств имен. Хорошая золотая середина между «использовать» и «требовать» - это «использовать» только функции из того пространства имен, которое вы действительно используете.
например:
(use '[clojure-contrib.duck-streams :only (writer reader)])или, что еще лучше, укажите его в верхней части файла в определении пространства имен:
(ns com.me.project (:use [clojure.contrib.test-is :only (deftest is run-tests)]))