clojure 中的 def 是保存函数的 return 值还是每次都会对函数求值?

Does def in clojure save the return value of a function or will the function get evaluated each time?

假设我定义了一个函数

(defn func [a] a)

那我定义

(def funcUsage (func 5))

如果我现在使用 funcUsage 两次,函数 func 会被调用两次还是 return 值存储到 funcUsage 中? 即

(println funcUsage)
(println funcUsage)

是否等同于

(println (func 5))
(println (func 5))

? 在我的程序中似乎是这样。 def 是否存储计算函数的值?

当您计算 (def funcUsage (func 5)) 时,func 被调用一次并且值 5 绑定到符号 funcUsage.

当你评估

(println funcUsage)
(println funcUsage)

你只打印符号的值,func不会再次调用。所以,这些调用:

(println funcUsage)
(println funcUsage)

func不调用)和

(println (func 5))
(println (func 5))

func 被调用两次)不等价。

您也可以测试它,如果您像这样为 func 添加一些副作用:(defn func [a] (println "I am called...") a)(defn func [a] (Thread/sleep 1000) a).

def 表单创建了一个 Clojure Var。每个 Var 就像一个指向一个值的全局变量。在您的情况下,(func 5) 将被调用一次,结果保存在 Var funcUsage.

您可以在此 list of documentation 中找到更多信息。请务必查看 Clojure CheatSheet 以及 Brave Clojure 和 Getting Clojure 这本书。