首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >期货永远不会解决和交付承诺

期货永远不会解决和交付承诺
EN

Stack Overflow用户
提问于 2017-01-16 17:06:38
回答 1查看 156关注 0票数 2

我正在读一本书来教自己,克洛尔称为“为勇敢与真实而关闭”( Clojure for the勇敢和True )。第9章介绍了基本的并发编程,包括延迟、期货和承诺。本章末尾的第一次练习指出:

编写一个函数,该函数以字符串为参数,并使用slurp函数在Bing和Google上搜索。您的函数应该返回搜索返回的第一页的HTML

我的解决办法如下:

代码语言:javascript
复制
(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))

可以称为:

代码语言:javascript
复制
(search-bing-google "clojure")

第二项工作说明如下:

“更新您的函数,以便使用由搜索引擎组成的第二个参数。”

我试图编辑我的第一个解决方案,以满足新的参数要求,如下所示:

代码语言:javascript
复制
(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))

可以称为:

代码语言:javascript
复制
(search "clojure" :bing :google)

但是,这个实现挂起,不像它的前任。因为第二个实现中的"map“,所以没有调用slurp。当我在REPL中加载并执行它时,有人能帮我找出是什么原因导致它挂起吗?

编辑:

以下是乔希的答案,我想出了以下解决方案,不再使用doseq而不是dorunmap挂起

代码语言:javascript
复制
(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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-16 17:26:09

因为map导致了延迟评估,因此需要一些东西来实现它。在你的代码中,什么都不做,所以未来永远不会真正被创造出来。与其只使用map,不如做:

代码语言:javascript
复制
(dorun (map ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41681483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档