gpt4 book ai didi

Clojure 函数参数语法

转载 作者:行者123 更新时间:2023-12-03 00:26:46 24 4
gpt4 key购买 nike

我试图理解调用 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 提示不知道如何从符号创建 ISeq。为什么读者周围有括号?

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

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

所以看来“string are”[string]是等价的参数,我也不明白。

最佳答案

: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,这就是为什么你会得到异常。

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

关于Clojure 函数参数语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1615055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com