我正在读一本书来教自己,克洛尔称为“为勇敢与真实而关闭”( Clojure for the勇敢和True )。第9章介绍了基本的并发编程,包括延迟、期货和承诺。本章末尾的第一次练习指出:
编写一个函数,该函数以字符串为参数,并使用slurp函数在Bing和Google上搜索。您的函数应该返回搜索返回的第一页的HTML
我的解决办法如下:
(defn search-bing-google
[search-term]
(let [search-results (promise)]
(future (deliver search-results
(slurp (str "https://www.bing.com/search?q%3D" search-term))))
(future (deliver search-results
(slurp (str "https://www.google.com/search?q%3D" search-term))))
@search-results))可以称为:
(search-bing-google "clojure")第二项工作说明如下:
“更新您的函数,以便使用由搜索引擎组成的第二个参数。”
我试图编辑我的第一个解决方案,以满足新的参数要求,如下所示:
(def search-engines
{:bing "https://www.bing.com/"
:google "https://www.google.com/"})
(defn search
[search-term & engines]
(let [results (promise)]
(map #(future (deliver results
(slurp (str (% search-engines)
"search?q%3D"
search-term)))) engines)
@results))可以称为:
(search "clojure" :bing :google)但是,这个实现挂起,不像它的前任。因为第二个实现中的"map“,所以没有调用slurp。当我在REPL中加载并执行它时,有人能帮我找出是什么原因导致它挂起吗?
编辑:
以下是乔希的答案,我想出了以下解决方案,不再使用doseq而不是dorun和map挂起
(def search-engines
{:bing "https://www.bing.com/"
:google "https://www.google.com/"})
(defn search
[search-term & engines]
(let [results (promise)]
(doseq [engine engines]
(future (deliver results
(slurp (str (engine search-engines)
"search?q%3D"
search-term)))))
@results))发布于 2017-01-16 17:26:09
因为map导致了延迟评估,因此需要一些东西来实现它。在你的代码中,什么都不做,所以未来永远不会真正被创造出来。与其只使用map,不如做:
(dorun (map ...https://stackoverflow.com/questions/41681483
复制相似问题