2015-12-06 17 views
5

當我使用一些長函數名,我用的是use形式,像這樣:爲什麼在「使用」(clojure)中使用單引號在矢量中?

(use '[clojure.string :as str]) 

但我不知道爲什麼單引號'添加到載體,所以我試圖找出它的類型:

(type '[clojure.string :as str]) 
;=> clojure.lang.PersistentVector 

簡單的例子:

(type ["hello"]) 
;=> clojure.lang.PersistentVector 

(type '["hello"]) 
;=> clojure.lang.PersistentVector 

似乎單引號不會改變任何東西,任何人都可以在use表單中解釋它的用法嗎?

回答

10

意圖是引用符號。這樣他們將被視爲符號,並且use可以將這些符號命名爲命名空間來加載並拉入當前。您希望避免對符號進行默認處理,即將其解析爲Var的名稱並使用該Var的值。你也可以這樣做

(use ['clojure.string :as 'str]) 

但這涉及到一些不必要的輸入;引用整個向量使你不太可能忘記任何事情。特別是如果你正在做任何與:only:refer或類似的關鍵字參數。

旁白:ns並不需要這個,因爲作爲一個宏它可以控制它的參數評價 - 像requireuse功能都它們的參數讀取和他們自己運行之前進行評估。這是ns通常比這些功能更受歡迎的原因的一部分。

3

use是一個函數,因此評估者在它們傳遞之前評估其參數(應用性訂單評估)。

您不希望[clojure.string :as str]被評估,因爲評估者會嘗試在應用use之前嘗試解析其中的符號,但沒有成功。

因此quote(讀者速記')是否有防止其評估。

相關問題