2016-02-05 40 views
2

我想知道为什么在clojure输出结束时会出现“nil”。这里是我的代码:为什么clojure在输出结束时会出现“nil”

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

而另一个问题是,什么是“&申辩”这里的意思?一个可变参数或什么?非常感谢!

+0

当我运行(foo 3“hello”)时,它出来3hellonil –

+0

'print'在最后没有'换行',这就是为什么输出只是在之前输出的东西之后进行的原因。只有在特殊情况下才需要“打印”。使用'println'的做法更为常见,它有一些不错的格式。 –

回答

9

REPL(或您正在使用的任何执行环境)可让您知道代码评估的输出。正如你写的那样,你的函数不会返回任何东西。在这种情况下,按照惯例返回nilnil是Clojure的标记nothing/null。你所有的代码都在印刷 - 这是一种“副作用”。

重要的是要注意,nil在Clojure中是一个合适的值。这与一些甚至不允许您将undefined/unknown值与另一个值相比的语言进行比较 - 这样做会产生异常。

通常有一个空间,所以[x & argu]。它很重要 - 所以请在代码中放置空格,然后重试。这意味着该函数需要一个或多个参数。你说这是'可变的',是非常正确的。

大多数语言都有'无'和'可变参数'的概念。由于Clojure是一种功能性语言,因此从功能中“回归”的整个思想变得非常重要。在代码中优先考虑没有副作用可以使得推理更容易。

这是你的函数改变一点点:

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

而且这是在REPL用法示例:

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

如何看功能argu里面已经成为一个list

+1

*你的函数不返回任何东西*更好地说,一个空的函数体评估为['nil'](https://clojure.org/reference/data_structures#nil),这是Clojure中的一个合适的值,通常返回在没有任何其他价值的情况下。如果它的意思是* undefined *,那么测试它的平等性将会是可疑的。 – Thumbnail

相关问题