Clojure lazy seq在函数体中的不同位置的消耗

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]

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]
  (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中运行代码。我还没有将此脚本设置为从命令行运行,但一旦设置好,我一定会测试它。非常感谢。