gpt4 book ai didi

clojure - 为什么我的代码打印不出来?

转载 作者:行者123 更新时间:2023-12-04 10:11:10 27 4
gpt4 key购买 nike

我正在尝试在 Clojure 中创建一个 for。

我正在关注 the cheats sheet from the Clojure site .

例如:

(take 100 (for [x (range 100000000) y (range 1000000) :while (< y x)] [x y]))

我正在尝试创建自己的 for应该打印“Hello World”100 次。
(take 100 (for [a (range 100) 
:while (< a 100)]
(println "Hello World")
)
)

出于某种原因,它没有打印 Hello World 100 次。为什么不?

最佳答案

您需要注意的最重要的事情是 Clojure 中的序列是惰性的。这意味着序列中的项目仅在需要时才进行评估。这允许您使用无限序列。

大多数情况下,这是您想要的,但是当您对序列项的值不感兴趣,而对创建序列项的函数的副作用感兴趣时,这可能会令人困惑。在您的示例中,该序列由 println 的 100 个返回值组成。函数,即 100 次 nil - 不是很有趣。但是println函数具有将“Hello World”打印到标准输出的副作用。

问题是,如果你从来没有对序列中的项目做任何事情,println函数永远不会被评估,字符串也不会被打印出来。它有点适用于 REPL,因为 REPL 中的 P 代表打印 - 打印您输入的表达式的返回值。要打印整个序列,必须对其进行评估,因此您会看到一堆“Hello World”,还有一堆 nils .如果您在 REPL 之外运行代码(不使用返回值),您将看不到 Hello World。

如果您对项目生成函数的副作用感兴趣,可以使用 doalldoseq . doall强制评估整个序列并返回它:

(doall (for [a (range 100)] (println "Hello World")))
doseq不返回序列(它返回 nil )并且具有类似 for 的语法:
(doseq [a (range 100)] (println "Hello World"))

另请注意,您实际上只需要提供一次所需的计数 (100)。 range函数已经生成了一个包含 100 个项目的序列。 :while您代码中的子句是多余的, take 也是如此。函数(从具有 100 个项目的序列中取出前 100 个项目并没有多大作用)。

希望这可以帮助!

关于clojure - 为什么我的代码打印不出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7341156/

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