为什么会有一个" nil"在clojure的输出结束时

时间:2016-02-05 18:34:32

标签: clojure

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

(defn foo [x &argu]
    (print x &argu))

另一个问题是"& argu"这意味着什么一个可变参数或其他什么?非常感谢你!

1 个答案:

答案 0 :(得分:9)

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

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

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

是完全正确的

大多数语言都有' nil'和' varadic争论'。因为Clojure是一种功能性语言,所以整个思考只会回归'从功能变得非常重要。优先考虑在代码中没有副作用可以更容易推理。

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

(defn foo [x & argu]
  (println x argu))

这是REPL中的示例用法:

=> (foo 3 "Hello" "how" "are" "you?")
3 (Hello how are you?)
nil

查看函数argu内部如何成为list