我想知道为什么有一个" nil"在clojure的输出结束时。这是我的代码:
(defn foo [x &argu]
(print x &argu))
另一个问题是"& argu"这意味着什么一个可变参数或其他什么?非常感谢你!
答案 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
。