【问题标题】:Why is nil returned by Clojure functions that don't return a value?为什么不返回值的 Clojure 函数返回 nil?
【发布时间】:2017-11-25 01:33:15
【问题描述】:

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

以上示例:

(println "Hello Nil")
nil

为了达到“nil”需要进行什么类型的评估?

【问题讨论】:

  • 所有函数返回一个值。 Clojure 的 nothing 习语是 nil。所以,当没有什么可以返回时,返回nil。许多运营商默认设置为执行此操作:when、单面ifgetnext、...。 总是返回nil的函数,例如println,必须具有显着的副作用才能有用。

标签: clojure null functional-programming


【解决方案1】:

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

在这些情况下,nil 是一个占位符值,表示“无”或“不适用”。

【讨论】:

  • 这也是 Lisp 中的一个约定,即使有副作用也返回有用的值,我不明白为什么 Clojure 的 print 函数不能只返回它的参数;这是一个细节,但如果您只想检查中间表达式的值,它会有所帮助。话虽如此,+1
  • 对于println,它可以将字符串输出返回到屏幕,但对于其他函数,如doseqdotimes等,不清楚应该是什么好的返回值。跨度>
  • 我对 println 的工作原理特别感到困惑。在其他情况下,nil 是一个可接受的值,我认为我们同意。如果您让do... 宏接受结果表单并提供一个隐式块,您可以从该块中return 一个值(dotimes),使用另一种方法可能会有有意义的值。但这是一个不同的设计,我知道您不应该在 Clojure 中提前返回(惰性序列等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
相关资源
最近更新 更多