为什么在clojure的输出结尾有一个"nil"

Xiu*_* Xu 2 clojure

我想知道为什么在clojure的输出结尾有一个"nil".这是我的代码:

(defn foo [x &argu]
    (print x &argu))
Run Code Online (Sandbox Code Playgroud)

另一个问题是"和论证"在这里意味着什么?一个可变参数或其他什么?非常感谢!

Chr*_*phy 8

REPL(或您正在使用的任何执行环境)让您知道代码评估的输出.正如你所写,你的功能不会返回任何东西.在这种情况下nil按惯例归还.nil是Clojure的标志nothing/null.您的所有代码都在进行打印 - 这是一种"副作用".

重要的是要注意这nil是Clojure中的正确值.这与某些语言形成鲜明对比,这些语言甚至不允许您将该undefined/unknown值与另一个正确值进行比较 - 这样做会产生异常.

通常有一个空间,所以[x & argu].这很重要 - 所以请在代码中加上空格再试一次.这意味着该函数需要一个或多个参数.你说这是'varadic'是完全正确的.

大多数语言都有'nil'和'varadic arguments'的概念.因为Clojure是一种函数式语言,所以围绕"仅从函数返回"的思考变得非常重要.优先考虑在代码中没有副作用可以更容易推理.

这是你的功能改变了一点:

(defn foo [x & argu]
  (println x argu))
Run Code Online (Sandbox Code Playgroud)

这是REPL中的示例用法:

=> (foo 3 "Hello" "how" "are" "you?")
3 (Hello how are you?)
nil
Run Code Online (Sandbox Code Playgroud)

看看函数内部如何argu成为一个list.