2009-10-23 64 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标签预计是它适用的事物列表。