首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure中的延迟求值

Clojure中的延迟求值
EN

Stack Overflow用户
提问于 2010-06-13 05:08:55
回答 1查看 2.4K关注 0票数 12

我在理解delay宏在Clojure中的工作方式时遇到了一些问题。它似乎没有完成预期的功能(即:延迟评估)。正如您在此代码示例中所看到的:

代码语言:javascript
复制
; returns the current time
(defn get-timestamp [] (System/currentTimeMillis))

; var should contain the current timestamp after calling "force"
(def current-time (delay (get-timestamp)))

但是,即使没有使用force宏,在REPL中调用current-time似乎也会立即计算表达式:

代码语言:javascript
复制
user=> current-time
#<Delay@19b5217: 1276376485859>
user=> (force current-time)
1276376485859

为什么直到第一次force调用时才对get-timestamp进行评估?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-13 05:35:23

出现在REPL上的各种对象的打印表示是名为print-method的多方法的产物。它驻留在Clojure源代码中的core_print.clj文件中,该文件构成了clojure.core名称空间的一部分。

这里的问题是,对于实现clojure.lang.IDeref的对象-- deref / @可以对其进行操作的Java接口-- print-method在打印表示中包含对象后面的值。为此,它需要deref对象,尽管为打印失败的代理和待定的期货做了特殊的准备,但延迟始终是强制的。

实际上,我倾向于认为这是一个bug,或者充其量是一个需要改进的情况。作为目前的一种解决办法,请格外注意不要打印非强制延迟。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3030095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档