我在理解delay宏在Clojure中的工作方式时遇到了一些问题。它似乎没有完成预期的功能(即:延迟评估)。正如您在此代码示例中所看到的:
; 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似乎也会立即计算表达式:
user=> current-time
#<Delay@19b5217: 1276376485859>
user=> (force current-time)
1276376485859为什么直到第一次force调用时才对get-timestamp进行评估?
发布于 2010-06-13 05:35:23
出现在REPL上的各种对象的打印表示是名为print-method的多方法的产物。它驻留在Clojure源代码中的core_print.clj文件中,该文件构成了clojure.core名称空间的一部分。
这里的问题是,对于实现clojure.lang.IDeref的对象-- deref / @可以对其进行操作的Java接口-- print-method在打印表示中包含对象后面的值。为此,它需要deref对象,尽管为打印失败的代理和待定的期货做了特殊的准备,但延迟始终是强制的。
实际上,我倾向于认为这是一个bug,或者充其量是一个需要改进的情况。作为目前的一种解决办法,请格外注意不要打印非强制延迟。
https://stackoverflow.com/questions/3030095
复制相似问题