什么时候会出现副作用?

When do side effects happen?

我正在构建一个阻止 HTTP 调用的应用程序。我想在阻塞之前打印一些东西,然后在阻塞调用完成后继续打印一些东西。我的第一个想法是这样做

(print "Processing " item-hash "...")
(query-item item-hash)
(Thread/sleep 10000)
(println "Done")))

睡眠只是为了进一步减慢它的速度,以 100% 确定它按照预期的方式工作。

以我的理解,它应该打印消息,开始query-item,然后休眠10秒,然后打印Done。但目前它会等到整个父 sexpr 完成并在之后打印(当所有阻塞调用完成时打印整行。

整个主要供参考

(defn -main [& echo]
  (map
    (fn [url]
      (let [item-hash (market-listing-url-to-hash-name url)]
        (print "Processing " item-hash "...")
        (query-item item-hash)
        (Thread/sleep 10000)
        (println "Done")))

    (collect-urls 1)))

谢谢

显然 print 不会自动将缓冲区刷新到屏幕。在第一个 print 之后添加 (flush) 修复它。 println 自行冲洗。

源代码:println calls prn function that has (flush) as one of the side effects prn