私は自分自身を教えるために本を読んでいます。Clojure for the Brave and True第9章では、遅延、先物、約束などの基本的な並行プログラミングについて説明します。この章の最初の練習では、次のように述べています。先物は決して解決して約束することはありません
"文字列を引数として取り、関数slingを使用して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")
第二運動はSTATです
"使用する検索エンジンからなる第2引数を取得するように関数を更新してください。"
は、私は次のように新しい引数の要件を満たすために私の最初のソリューションを編集しよう:
(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)
しかし、この実装は、それの前身とは異なり、ハングアップします。その2番目の実装では "地図"のためにslurpが呼び出されることはありません。私がREPLにロードして実行するときに、何が原因でこの問題が発生しているのか理解できますか?
EDIT:遅延評価で
(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))
私はマップで 'dorun'を使用しませんでした。代わりに私は 'doseq'を使って私のキーワードリストを繰り返しました。しかし、「ドーラン」、「ドール」、「ドーズ・グッド」などの評価を見て、私に道を譲らせてくれてありがとう。 – webermaster