let tidak mengeksekusi ekspresi kedua di badan

Jika saya memahami dokumentasi dengan benar, saya dapat menulis ini:

(let [a 5 b 10]
  (print a)
  (print b))

Ini berfungsi seperti yang diharapkan dan mencetak 5 dan 10. Saya menggunakan mekanisme ini dalam cuplikan kode ini (Kode lengkapnya adalah di sini jika Anda memerlukan referensi lebih lanjut):

(defn create! [fields]
  (let [username (user/unique-user (:author fields))
        competition-id (:id (competition/latest))]
    (if-not (exists? (:ld_uid fields))
      (insert entries (values {
                               :ld_uid (:ld_uid fields)
                               :title (:title fields)
                               :description (:description fields)
                               :type (:type fields)
                               :user_id (:id username)
                               :competition_id competition-id})))
    (for [link (:links fields)]
      (source/create! (:id (by-ld-uid (:ld_uid fields))) (:url link) (:title link)))))

masalahnya adalah, ekspresi for tidak dieksekusi. Pernyataan berfungsi seperti yang diharapkan tetapi dalam kode ini di atas ekspresi insert dieksekusi tetapi for tidak. Apakah saya mengawasi sesuatu? Saya kehabisan ide apa yang salah di sini :(


person Fu86    schedule 27.01.2014    source sumber
comment
Ekspresi for malas. Bungkus dengan dorun atau ubah menjadi doseq.   -  person A. Webb    schedule 27.01.2014


Jawaban (1)


Masalahnya bukan pada apa yang Anda pikirkan: for Clojure menggunakan evaluasi malas -- yaitu, jika Anda tidak melakukan apa pun dengan apa yang dikembalikannya, loop tidak akan pernah berjalan.

Itu sangat berguna untuk perulangan jangka panjang pada rangkaian besar yang bahkan tidak Anda perlukan secara keseluruhan, tetapi ketika Anda benar-benar mencoba menjalankan efek samping, evaluasi malas adalah sesuatu yang harus Anda hindari.

Anda ingin menggunakan doseq sebagai gantinya (http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/doseq).

person Max Noel    schedule 27.01.2014
comment
Terima kasih, itu sangat membantu! - person Fu86; 28.01.2014