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 这本书。
假设我定义了一个函数
(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 这本书。