我想知道为什么在 clojure 的输出末尾有一个"nil"。这是我的代码:
(defn foo [x &argu]
(print x &argu))
另一个问题是"&argu"在这里是什么意思?一个可变参数还是什么?非常感谢!
REPL(或您正在使用的任何执行环境(让您知道代码评估的输出。正如你写的一样,你的函数不会返回任何内容。在这种情况下,nil
按照惯例返回。 nil
是Clojure的nothing/null
标记。你的代码所做的只是打印 - 这是一个"副作用"。
需要注意的是,nil
是Clojure中的适当值。这与某些语言形成鲜明对比,某些语言甚至不允许您将undefined/unknown
值与另一个适当的值进行比较 - 这样做会生成异常。
通常有一个空间,所以[x & argu]
.这很重要 - 所以请在代码中放置空格,然后重试。这意味着该函数采用一个或多个参数。你说它是"瓦拉迪的"是很正确的。
大多数语言都有"nil"和"varadic arguments"的概念。因为Clojure是一种函数式语言,所以围绕"只从函数中返回"的整个思考变得非常重要。优先考虑代码中没有副作用可以更轻松地进行推理。
这是您的函数稍有更改:
(defn foo [x & argu]
(println x argu))
这是 REPL 中的示例用法:
=> (foo 3 "Hello" "how" "are" "you?")
3 (Hello how are you?)
nil
看看功能内部如何argu
成为list
。