gpt4 book ai didi

Clojure 函数体中不同位置的惰性 seq 消耗

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

这里是 Clojure 初学者,不确定问题中的术语是否正确。

我正在使用 clj-webdriver 出租车 API 构建网络抓取工具。它需要从多个站点抓取数据。以下实际上不是项目中的代码,但我已经对其进行了测试并验证它是否说明了我的问题:

(def gh-un "my-username")
(def gh-pw "my-password")

;; print the first five "starred" alerts from my github feed
(defn get-info [url]
(to url)
(click "a[href='/login']")
(input-text "input#login_field" gh-un)
(input-text "input#password" gh-pw)
(click "input.btn")
(pprint (map text (take 5 (find-elements {:css "div.alert.watch_started"}))))
(click "img.avatar")
(click "button.dropdown-signout"))

(defn github-wrapper []
(map get-info (repeat 3 "http://www.github.com"))
(quit))

如果我按原样调用 (github-wrapper) ,浏览器窗口将几乎立即关闭,因为 (quit) 调用。使用 doall 包装 map 调用,即 (doall (map get-info (repeat 3 "http://www.github.com"))) 解决了这个问题,这表明问题在于 map 生成了一个未被消耗的惰性序列,因此我没有看到调用 get-info 的副作用.

但是,如果我删除 get-info 末尾的 (quit) 调用,github-wrapper 就会执行我想要的操作到。

我的问题是,为什么惰性序列在后一种情况下会被消耗,而在前一种情况下不会被消耗?

最佳答案

这是因为当你调用github-wrapper时,你可能正在打印返回的 map 。打印惰性序列是使用它的一种方法(与doall一起)。当您将 quit 放在 github-wrapper 的末尾时,这就是返回的内容,并且 map 只是假设没有任何内容需要它的值。

如果你想让你的 map 立即实现,你也可以使用mapv代替map

关于Clojure 函数体中不同位置的惰性 seq 消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34966323/

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