2

次のコードがあります。

(do
  (prn "sleeping for 60 seconds")
  (Thread/sleep 6000)
  (prn "kicking off calendar downloads @ " (new java.util.Date))
  (let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
   (map download links))

let評価は最後でなければならず、そうでなければ評価されないことに気付きました。これは私を混乱させます。それにもかかわらず、これをループで実装すると、letrecur が推論されると思うので評価されません。

(while
(do
  (prn "sleeping for 60 seconds")
  (Thread/sleep 60000)
  (prn "kicking off calendar downloads @ " (new java.util.Date))
  (let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
   (map download links))
  )) 

sleep私もこのセクションの最後にいたいと思いdoますが、それは本当に議論の余地があります。

評価するにはどうすればよいletですか?それは私の使用と関係がありmapますか? ここで何を誤解していますか?

ダウンロードは機能です:

(defn download [[calname ics]]
  (prn "attempting cal download: " calname)
  (try (spit (str dest calname ".csv") (slurp ics))
  (catch Exception e (str "caught exception: " (.getMessage e)))))
4

2 に答える 2

1

何が起こっているかについての私の推測:

mapは遅延関数であるため、 の最後のアイテムであるdo場合、それが によって返されるため、評価されdoます。の最後のものでない場合do、その戻り値は使用されていないため、評価されていません。

私も似たようなことに出くわしました。

doseqの代わりに使ってみてくださいmap

于 2013-06-25T21:04:35.890 に答える