gpt4 book ai didi

clojure - Clojure 中的延迟评估

转载 作者:行者123 更新时间:2023-12-04 00:59:24 24 4
gpt4 key购买 nike

我在理解 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)))

但是,调用 current-time在 REPL 中似乎立即计算表达式,即使没有使用 force宏:
user=> current-time
#<Delay@19b5217: 1276376485859>
user=> (force current-time)
1276376485859

为什么 get-timestamp的评价是直到第一个 force 才延迟称呼?

最佳答案

REPL 上出现的各种对象的打印表示是称为 print-method 的多方法的产物。 .它位于文件 core_print.clj 中在 Clojure 的来源中,它构成了 clojure.core 中的部分内容。命名空间。

这里的问题是对于实现 clojure.lang.IDeref 的对象-- 事物的Java接口(interface)deref/@可以操作 -- print-method在打印表示中包含对象后面的值。为此,需要deref对象,尽管为打印失败的代理和未决的 future 做出了特殊规定,但总是强制延迟。

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

关于clojure - Clojure 中的延迟评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3030095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com