2017-06-22 189 views
1

我是Clojure的新学员,不明白为什么当我调用不返回值的函数时,在REPL中返回“nil”。为什么没有返回值的Clojure函数返回nil?

上面的例子:

(println "Hello Nil") 
nil 

什么类型的评估过程都是为了达到“无”?

+2

*所有*函数都返回一个值。 Clojure的* nothing *的成语是'nil'。所以,当没有什么可返回时,返回'nil'。许多运营商默认设置为:“when”,单侧“if”,“get”,“next”......。一个* always *返回'nil'的函数,比如'println',必须有明显的副作用。 – Thumbnail

回答

10

这是Clojure等函数式语言的约定,每个函数都需要返回一个值。对于像println这些旨在执行副作用(如打印到屏幕)的函数,并不总是清楚返回值可以或应该是什么。

在这些情况下,nil是占位符值,意思是“无”或“不适用”。

+1

即使存在副作用,Lisp也会返回有用的值,我不明白为什么Clojure的打印函数不能返回它的参数;这是一个细节,但如果你只是想检查中间表达式的值,它会有所帮助。也就是说,+1 – coredump

+0

对于'println',它可以将字符串输出返回到屏幕上,但对于其他函数,如'doseq','dotimes'等,不清楚什么是好的返回值应该是什么。 –

+0

我对println的工作原理感到困惑。在其他情况下,无是可接受的价值,我想我们同意。如果你让'do ...'宏接受一个结果表单并提供一个隐式块,你可以从中返回一个值(['dotimes']](http:// clhs。 lisp.se/Body/m_dotime.htm))。但这是一个不同的设计,我明白你不应该在Clojure(懒惰序列等)中早期返回。 – coredump