指令(:require)用在(ns)之中,下面是實踐中總結的幾種用法(下文中省略ns宏,只是給出:require的代碼):java
1、導入完整名稱空間。json
1,最簡單的形式:函數
(:require clojure.data.json)
2,同時導入同一名稱空間的多個子名稱空間:ui
(:require (clj-time core format ))
以上這兩種形式,導入了完整的名稱空間,使用起來就比較麻煩了,好比調用clojure.data.json的read-str函數:spa
(clojure.data.json/read-str "{\"a\":1}")
2、使用":as"關鍵字,給導入的名稱空間起一個別名。code
(:require [clojure.data.json :as json])
這樣,調用其中函數時就能夠使用這個別名而不是全路徑了:orm
(json/read-str "{\"a\":1}")
同時導入多個包的語法:blog
(:require [clj-time.core :as time] [clj-time.format :as timef] [clojure.data.json :as json] )
對於上面clj-time這種狀況,導入多個子名稱空間,能夠這樣:it
(:require (clj-time [core :as time][format :as timef]) )
3、使用":refer"關鍵字,直接導入要使用的符號名稱(這種語法通常適用於僅須要使用的名稱空間中有限幾個符號的狀況)。io
例如只導入一個:
(:require [clojure.data.json :refer read-str])
此時,「read-str」直接位於當前的名稱空間,能夠直接使用:
(read-str "{\"a\":1}")
同時導入多個符號名稱:
(:require [clojure.data.json :refer [read-str write-str] ])
還能夠使用":all"關鍵字,這樣就和(use)宏的效果同樣了,把名稱空間下的全部符號直接導入到當前名稱空間,這是不推薦的,很容易引發衝突!例如:
user=> (:require [clojure.data.json :refer :all])
IllegalStateException pprint already refers to: #'clojure.pprint/pprint in namespace: user clojure.lang.Namespace.warnOrFailOnReplace (Namespace.java:88)