我正在尝试理解调用use来加载库的语法:
(use 'clojure.contrib.duck-streams)
对我有意义,因为它将引用读取器宏应用于clojure.contrib.duck-streams,以便读者不会尝试评估该字符串。
现在,如果我想使用:only标签只加载阅读器,为什么这是正确的:
(use '[clojure.contrib.duck-streams :only (reader)])
而不是:
(use '[clojure.contrib.duck-streams :only reader])
我读到这意味着传递这个使用的参数向量但是REPL抱怨不知道如何从Symbol创建ISeq。为什么围绕读者的parens?
这也等同于第一行并且有效:
(use '[clojure.contrib.duck-streams])
所以似乎'string are'[string]是等价的参数,我也不明白。
答案 0 :(得分: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
能够的。空集合也seq
能够。seq
能够。 seq
放入列表本身也是有意义的。将单项案例作为特例会很尴尬。当您将单项视为一种退化情况并将其放入列表时,它更加一致且更容易编程。
请注意,所有use
关心的是:only
参数是否是可选的符号集合。这意味着列表,向量和集合都可以工作。
(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
单Symbol
但seq
不能{{1}}这就是你得到例外的原因。
查看core.clj是否要了解这是如何实现的。
答案 1 :(得分:1)
这些不仅仅是“parens” - parens是创建列表的语法。它会出现在:only标签之后的项目应该是它适用的事物列表。