Clojure函数参数语法

时间:2009-10-23 18:08:09

标签: clojure

我正在尝试理解调用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]是等价的参数,我也不明白。

2 个答案:

答案 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中所讨论的,如果你正在编写一个接受或返回可变数量参数的函数,那么最好让它总是接受/返回一个列表或向量或集合,即使它是取/退一件物品。这是因为:

    通常用于表示“零项目”的
  • nilseq能够的。空集合也seq能够。
  • 列表中的两个或多个项目seq能够。
  • 将一个项目seq放入列表本身也是有意义的。

将单项案例作为特例会很尴尬。当您将单项视为一种退化情况并将其放入列表时,它更加一致且更容易编程。

请注意,所有use关心的是:only参数是否是可选的符号集合。这意味着列表,向量和集合都可以工作。

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

Symbolseq不能{{1}}这就是你得到例外的原因。

查看core.clj是否要了解这是如何实现的。

答案 1 :(得分:1)

这些不仅仅是“parens” - parens是创建列表的语法。它会出现在:only标签之后的项目应该是它适用的事物列表。