我想知道为什么 clojure 的输出末尾有一个“nil”。这是我的代码:
(defn foo [x &argu]
(print x &argu))
另一个问题是“&argu”在这里是什么意思?可变参数或其他什么?非常感谢!
最佳答案
REPL(或您正在使用的任何执行环境)可以让您知道代码评估的输出。正如您所写的,您的函数不会返回任何内容。在这种情况下,按照惯例返回 nil。 nil
是 Clojure 的 nothing/null
标记。您的所有代码所做的就是打印 - 这是一个“副作用”。
需要注意的是,nil
是 Clojure 中的正确值。这与某些语言形成鲜明对比,某些语言甚至不允许您将未定义/未知值与另一个正确值进行比较 - 这样做会生成异常。
通常有一个空格,所以[x & argu]
。这很重要 - 所以请在代码中添加空格,然后重试。这意味着该函数需要一个或多个参数。你说它是“varadic”是非常正确的。
大多数语言都有“nil”和“varadic argument”的概念。因为 Clojure 是一种函数式语言,所以围绕“仅从函数返回”的整个思考变得非常重要。优先考虑代码中不产生副作用可以使推理变得更容易。
这是你的函数,只做了一点改变:
(defn foo [x & argu]
(println x argu))
这是 REPL 中的示例用法:
=> (foo 3 "Hello" "how" "are" "you?")
3 (Hello how are you?)
nil
看看函数内部 argu
是如何变成列表
的。
关于clojure - 为什么clojure输出末尾有 "nil",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231147/