代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

Clojure中的延迟评估

  •  12
  • StackedCrooked  · 技术社区  · 15 年前

    我很难理解 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 直到第一次 打电话?

    1 回复  |  直到 13 年前
        1
  •  13
  •   Michał Marczyk    15 年前

    出现在repl中的各种对象的打印表示是名为 print-method . 它驻留在文件中 core_print.clj 在Clojure的资料中,这是 clojure.core 命名空间。

    这里的问题是,对于实现 clojure.lang.IDeref ——Java的事物接口 deref / @ 可以操作-- 打印方法 包括打印表示中对象后面的值。为此,它需要 德雷夫 这个目标,尽管为印刷失败的代理商和未决的期货制定了特别的规定,但总是被迫延迟。

    实际上,我倾向于认为这是一个bug,或者最好是一个需要改进的情况。作为目前的一个解决方法,要格外小心不要打印非强制延迟。