clojure - 为什么clojure输出末尾有 "nil"

标签 clojure

我想知道为什么 clojure 的输出末尾有一个“nil”。这是我的代码:

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

另一个问题是“&argu”在这里是什么意思?可变参数或其他什么?非常感谢!

最佳答案

REPL(或您正在使用的任何执行环境)可以让您知道代码评估的输出。正如您所写的,您的函数不会返回任何内容。在这种情况下,按照惯例返回 nil。 nil 是 Clojure 的 nothing/null 标记。您的所有代码所做的就是打印 - 这是一个“副作用”。

需要注意的是,nil 是 Clojure 中的正确值。这与某些语言形成鲜明对比,某些语言甚至不允许您将未定义/未知值与另一个正确值进行比较 - 这样做会生成异常。

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

大多数语言都有“nil”和“varadic argument”的概念。因为 Clojure 是一种函数式语言,所以围绕“仅从函数返回”的整个思考变得非常重要。优先考虑代码中不产生副作用可以使推理变得更容易。

这是你的函数,只做了一点改变:

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

这是 REPL 中的示例用法:

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

看看函数内部 argu 是如何变成列表的。

关于clojure - 为什么clojure输出末尾有 "nil",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231147/

相关文章:

concurrency - 在 Clojure 中处理同时发生的重复事件

java - 带有需要枚举参数的注释的 clojure gen-class

clojure - 为什么我在没有显式递归的函数上收到 StackoverflowError

clojure - 在 Clojure 中,如何从网络下载图像并将其保存到文件系统?

clojure - 如何在 uberjar 进程中添加钩子(Hook)(使用 lein 构建)

作为向量的 Clojure 惰性序列

clojure - 使用clojure.string会导致警告

clojure - 获取leiningen项目根目录

Clojure defprotocol 作为表达式问题的解决方案

clojure - 提供可设置的全局变量