2009-10-23 38 views
6

我試圖來理解語法調用使用加載庫:因爲它適用報價讀者宏clojure.contrib.duck流這麼Clojure的函數參數語法

(use 'clojure.contrib.duck-streams) 

對我來說很有意義讀者不會嘗試評估該字符串。現在

,如果我想使用:唯一標記只加載讀者,爲什麼這是正確的:

(use '[clojure.contrib.duck-streams :only (reader)]) 

代替:

(use '[clojure.contrib.duck-streams :only reader]) 

我讀到這意味着通過在本要使用的參數向量,但REPL抱怨不知道如何從Symbol創建ISeq。爲什麼讀者身邊有這樣的人?

這也等同於第一行和有效:

(use '[clojure.contrib.duck-streams]) 

如此看來,「字符串是」 [字符串]是,我也不能理解等同參數。

回答

14

:only希望的符號列表。這就是函數的寫法。需要注意的文檔字符串爲refer,這use使用。

refers to all public vars of ns, subject to filters. 
filters can include at most one each of: 

:exclude list-of-symbols 
:only list-of-symbols 
:rename map-of-fromsymbol-tosymbol 

它是這樣寫的,所以你可以指定多個符號。

(use '[clojure.contrib.duck-streams :only (reader writer)]) 

正如this recent post討論的,如果你正在寫一個函數,或返回一個可變數量的參數,這是一個好主意,有它始終以/返回一個列表或向量或設置,即使它是取回/返回一件物品。因爲:

  • nil,經常用來表示「零項」,是seq able。空集合也是seq能夠。在列表中
  • 兩個或兩個以上項目seq能。
  • 它纔有意義,也有一個項目是seq能夠通過將其加入列表本身。

將單個項目的案例作爲一個特殊案例會很尷尬。當你把一個項目當作一種退化的案例並把它放入一個列表中時,編程更加一致和容易。

注意,所有use在乎的是:only參數是否是一個符號seqable集合。這意味着列表,向量和設置所有的工作。

(use '[clojure.contrib.duck-streams :only [reader writer]]) 
(use '[clojure.contrib.duck-streams :only #{reader writer}]) 

Symbol然而,這不是seq能這就是爲什麼你會得到你做的例外。

如果你想看看這是如何實現的,請看core.clj

1

這些都是不只是「括號」 - 括號是創建列表的語法。它會出現在以下項目之後的項目:only標籤預計是它適用的事物列表。