Clojure lazy seq在函数体中的不同位置的消耗
Clojure初学者,不确定问题中的术语是否正确 我正在使用CLJWebDriver出租车api构建一个web刮板。有几个站点需要从中获取数据。下面的代码实际上不是项目中的代码,但我已经对其进行了测试,并验证了它说明了我的问题:Clojure lazy seq在函数体中的不同位置的消耗,clojure,read-eval-print-loop,lazy-sequences,Clojure,Read Eval Print Loop,Lazy Sequences,Clojure初学者,不确定问题中的术语是否正确 我正在使用CLJWebDriver出租车api构建一个web刮板。有几个站点需要从中获取数据。下面的代码实际上不是项目中的代码,但我已经对其进行了测试,并验证了它说明了我的问题: (def gh-un "my-username") (def gh-pw "my-password") ;; print the first five "starred" alerts from my github feed (defn get-info [url]
(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)
。将map
调用包装为doall
,即(doall(map-get-info)(重复3)http://www.github.com”)
,解决了这个问题,这表明问题在于map生成了一个没有被使用的惰性序列,因此我没有看到调用get info
的副作用
但是,如果我在get info
末尾删除(quit)
调用,github包装器
会执行我想要的操作
我的问题是,为什么在后一种情况下使用惰性序列,而在前一种情况下不使用惰性序列?这是因为在调用
github wrapper
时,您可能正在打印返回的映射。打印惰性序列是使用它的一种方法(与doall
)。当您将quit
放在github-wrapper
的末尾时,返回的就是这个值,而映射只是假设没有任何东西需要它的值
如果您希望立即实现映射,您也可以使用
mapv
而不是map
。可能是因为您在REPL中运行代码,所以您的惰性序列是从github包装器
返回的,然后由REPL计算和打印。我确实在REPL中运行代码。我还没有将此脚本设置为从命令行运行,但一旦设置好,我一定会测试它。非常感谢。