首页 > 解决方案 > clojure 中的 def 是保存函数的返回值还是每次都会对函数进行评估?

问题描述

假设我定义了一个函数

(defn func [a] a)

然后我定义

(def funcUsage (func 5))

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

(println funcUsage)
(println funcUsage)

那是否相当于

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

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

标签: clojure

解决方案


当你评估时(def funcUsage (func 5))func被调用一次并且 value5被绑定到 symbol 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).


推荐阅读