clojure - 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 是否存储评估函数的值?
解决方案
当你评估时(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)
.
推荐阅读
- java - 为什么 List.contains(Object) 的行为不同?
- r - 如何在同一个数据帧上做colsum和average
- powerbi - 使用 DAX 生成日期系列
- javascript - 仅在服务器上需要一个包
- java - Intellij IDEA 仅针对所有未提交的更改运行测试
- regex - 在换行符之前匹配字符,不包括空格?
- macos - MacOS - 使用带有launchd的脚本 - 启动,登录,注销,关闭?
- service-worker - Workbox 的服务人员在更改时未更新
- python - AllenNLP 共指分辨率的多 GPU 训练
- reactjs - 事件处理程序中带有 [name] 的 PrevState