Intellij idea 克罗朱尔。Intellij。延迟同时发生的从地上爬起来

Intellij idea 克罗朱尔。Intellij。延迟同时发生的从地上爬起来,intellij-idea,clojure,java.util.concurrent,cursive,Intellij Idea,Clojure,Java.util.concurrent,Cursive,我试图从头开始解决Clojure第6章末尾的练习。 这是我遇到的第一个问题 (defn sum [start end] (delay (reduce + (range start end)))) ;; Define sum. => #'chapter6.core/sum (time (sum 0 1e7)) ;; Start sum but it delays, so almost no time elapses. "Elapsed time: 0.2808 msecs" =

我试图从头开始解决Clojure第6章末尾的练习。 这是我遇到的第一个问题

  (defn sum [start end] (delay (reduce + (range start end))))  ;; Define sum.
=> #'chapter6.core/sum

  (time (sum 0 1e7))  ;; Start sum but it delays, so almost no time elapses.
"Elapsed time: 0.2808 msecs"
=> #object[clojure.lang.Delay 0x2656db01 {:status :pending, :val nil}]

  (deref sum)  ;; Ask for the result. This should take some time. Only it doesn't. It errors right away.

Execution error (ClassCastException) at chapter6.core/eval1595 (form-init10872915734268438705.clj:1).
class chapter6.core$sum cannot be cast to class java.util.concurrent.Future (chapter6.core$sum is in unnamed module of loader cloju-re.lang.DynamicClassLoader @7c650722; java.util.concurrent.Future is in module java.base of loader 'bootstrap')
我是新来的。我对“引导”或“模块”或。。。 我做错了什么?先谢谢你。 顺便说一句,练习有“从头开始”的答案键吗?

让它:

(deref (sum 0 1e7))

函数仅在调用时返回延迟。在
(deref sum)
中,没有任何东西调用它(事实上,如果调用它,您从未提供参数值将是必须包含的)。相反,您尝试取消函数
sum
本身,这是非法的,因为函数不是延迟。

如果您创建了一个项目而不是在REPL中运行,则更容易查看详细信息。考虑将代码添加到:

结果:

-------------------------------
   Clojure 1.10.1    Java 13
-------------------------------

Testing tst.demo.core

"Elapsed time: 0.140221 msecs"      ; from first `time`
delay-val => <#clojure.lang.Delay #object[clojure.lang.Delay 0x455cd186 {:status :pending, :val nil}]>

"Elapsed time: 189.021064 msecs"    ; from 2nd `time`
(deref delay-val) => <#java.lang.Long 49999995000000>  
产生:

sum => <#tst.demo.core$sum #object[tst.demo.core$sum 0x539edd3 "tst.demo.core$sum@539edd3"]>
产生:

sum => <#tst.demo.core$sum #object[tst.demo.core$sum 0x539edd3 "tst.demo.core$sum@539edd3"]>

ERROR in (dotest-line-9) (core.clj:2298)
Uncaught exception, not in assertion.
expected: nil
  actual: java.lang.ClassCastException: class tst.demo.core$sum cannot be cast to class java.util.concurrent.Future (tst.demo.core$sum is in unnamed module of loader clojure.lang.DynamicClassLoader @67af3485; java.util.concurrent.Future is in module java.base of loader 'bootstrap')
 at clojure.core$deref_future.invokeStatic (core.clj:2298)
    clojure.core$deref.invokeStatic (core.clj:2320)
    clojure.core$deref.invoke (core.clj:2306)
    tst.demo.core$fn__21007.invokeStatic (core.clj:17) # ***** error line number *****
    tst.demo.core/fn (core.clj:9)
    clojure.test$test_var$fn__9737.invoke (test.clj:717)
    clojure.test$test_var.invokeStatic (test.clj:717)
    <...snip...>



请参阅以获取示例。

在我提交此问题之前尝试过此方法。以下是我在第6.core/eval1609章(form-init10872915734268438705.clj:1)中得到的:(deref(sum))执行错误(ArityException)。传递给:chapter6.core/sum的参数(0)数量错误。至于“非常明显”,对我来说,我不应该用相同的参数调用“sum”函数两次。如果我先用(sum01e7)调用它,然后用(deref(sum01e8))调用它呢?我想我会回到REPL,看看会发生什么。谢谢你的帮助。我真的很感激。你不需要先用
(sum 0 1e7)
来调用它。每次执行
(sum 0 1e7)
时,你都会得到一张新优惠券,你可以用
deref
兑换优惠券。通常,您会将优惠券放入一个变量中,例如,
(let[p(sum 0 1e7)]…)
,其中let主体可能不使用或多次使用
@p
。零使用的可能性是使用
延迟
的主要原因,以避免计算成本,除非需要结果。没有测试库。执行(ns tst.demo.core(:use tupelo.core tupelo.test)(:require[tupelo.misc:as misc])会在tst.demo.core/eval1623$loading(form-init10872915734268438705.clj:1)处出现执行错误(FileNotFoundException)。在类路径上找不到tupelo/core\uuu init.class、tupelo/core.clj或tupelo/core.cljc。
(deref sum)   ; on line #17 of my file

ERROR in (dotest-line-9) (core.clj:2298)
Uncaught exception, not in assertion.
expected: nil
  actual: java.lang.ClassCastException: class tst.demo.core$sum cannot be cast to class java.util.concurrent.Future (tst.demo.core$sum is in unnamed module of loader clojure.lang.DynamicClassLoader @67af3485; java.util.concurrent.Future is in module java.base of loader 'bootstrap')
 at clojure.core$deref_future.invokeStatic (core.clj:2298)
    clojure.core$deref.invokeStatic (core.clj:2320)
    clojure.core$deref.invoke (core.clj:2306)
    tst.demo.core$fn__21007.invokeStatic (core.clj:17) # ***** error line number *****
    tst.demo.core/fn (core.clj:9)
    clojure.test$test_var$fn__9737.invoke (test.clj:717)
    clojure.test$test_var.invokeStatic (test.clj:717)
    <...snip...>


 [tupelo "0.9.198"]