Clojure函数参数语法

Ped*_*ada 6 clojure

我试图理解调用use来加载库的语法:

(use 'clojure.contrib.duck-streams)
Run Code Online (Sandbox Code Playgroud)

对我有意义,因为它将引用读取器宏应用于clojure.contrib.duck-streams,以便读者不会尝试评估该字符串.

现在,如果我想使用:only标签只加载阅读器,为什么这是正确的:

(use '[clojure.contrib.duck-streams :only (reader)])
Run Code Online (Sandbox Code Playgroud)

代替:

(use '[clojure.contrib.duck-streams :only reader])
Run Code Online (Sandbox Code Playgroud)

我读到这意味着传递这个使用的参数向量,但REPL抱怨不知道如何从Symbol创建ISeq.为什么围绕读者的parens?

这也相当于第一行并且有效:

(use '[clojure.contrib.duck-streams])
Run Code Online (Sandbox Code Playgroud)

所以似乎'string are'[string]是等价的参数,我也不明白.

Bri*_*per 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
Run Code Online (Sandbox Code Playgroud)

它以这种方式编写,以便您可以根据需要指定多个符号.

(use '[clojure.contrib.duck-streams :only (reader writer)])
Run Code Online (Sandbox Code Playgroud)

正如在最近的帖子中所讨论的那样,如果你正在编写一个接受或返回可变数量参数的函数,那么让它总是接受/返回一个列表或向量或集合是一个好主意,即使它正在接受/返回一个项目.因为:

  • nil,通常用于表示"零项目",是seq能够的.空集也seq可以.
  • 列表中的两个或多个项目是seq可以的.
  • 只有将一个项目seq放入列表本身才有意义.

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

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

(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
Run Code Online (Sandbox Code Playgroud)

Symbol但是,单一的seq能力不足,这就是你得到例外的原因.

如果你想看看这是如何全部实现的,请查看core.clj.