【问题标题】:Clojure function argument syntaxClojure 函数参数语法
【发布时间】:2009-10-23 18:08:08
【问题描述】:

我正在尝试了解调用 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。为什么要在 reader 周围加上括号?

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

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

看来 'string are '[string] 是等价的参数,我也不明白。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    :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,常用于表示“零项”,为seqable。空集合也是seqable。
    • 列表中的两个或多个项目是seqable。
    • 只有通过将一个项目本身放入列表中才能将其设为seqable 才有意义。

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

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

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

    但是,单个 Symbol 不是 seqable,这就是为什么您会遇到异常。

    如果您想了解这一切是如何实现的,请查看core.clj

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多