gpt4 book ai didi

loops - clojure 中的顽固循环,让不被评估

转载 作者:行者123 更新时间:2023-12-02 07:35:10 26 4
gpt4 key购买 nike

我有以下代码:

(do
(prn "sleeping for 60 seconds")
(Thread/sleep 6000)
(prn "kicking off calendar downloads @ " (new java.util.Date))
(let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
(map download links))

我注意到 let 评估必须在最后,否则它不会被评估。这让我很困惑。尽管如此,当我在循环中实现它时,let 永远不会被评估,因为我认为 recur 最终被推断出来。

(while
(do
(prn "sleeping for 60 seconds")
(Thread/sleep 60000)
(prn "kicking off calendar downloads @ " (new java.util.Date))
(let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
(map download links))
))

我更希望 sleep 也位于此 do 部分的末尾,但这确实没有实际意义。

如何让 let 进行评估?跟我用map有关系吗?我在这里误解了什么?

下载是一个函数:

(defn download [[calname ics]]
(prn "attempting cal download: " calname)
(try (spit (str dest calname ".csv") (slurp ics))
(catch Exception e (str "caught exception: " (.getMessage e)))))

最佳答案

你被懒虫咬了:

  • 我注意到 let 求值必须放在最后,否则它不会被求值。
    这是因为调用 map 的结果是惰性的,所以只有在某些东西读取结果时才会对其进行评估。如果你把它放在最后,那么它就会成为 do 的返回值,由 repl 打印,这会导致它实际运行。

  • 当我在循环中实现它时,let 永远不会被计算:
    while 将一直运行直到表达式的返回值为 false。在这种情况下,表达式的返回值是一个惰性序列,如果有人查看它,将导致下载某些页面。在这种情况下,没有任何内容会查看结果,因此不会下载任何内容,并且因为它不是假的,所以它一直在运行。

  • 如何让我评估?:
    将对 map 的调用包装在 (doall (map ... ....)) 中以导致计算惰性序列。

关于loops - clojure 中的顽固循环,让不被评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17307267/

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