كيف أقوم بأداء وظيفة ذات آثار جانبية على ناقل؟

StackOverflow https://stackoverflow.com//questions/21069188

  •  02-01-2020
  •  | 
  •  

سؤال

إن إلقاء التحية بضمير المتكلم يعمل بشكل جيد، لماذا لا يقول مرحبًا للجميع؟

(defpartial greeting [name]
  [:p.alert "Hello " name ", how are you?"])

(defn say-hello [name]
  (append $content (greeting name)))

(defn say-hello-to-first-person [names]
  (say-hello (first names)))

(defn say-hello-to-everyone [names]
  (map say-hello names))

(say-hello-to-first-person ["Chris" "Tom" "Jim" "Rocky"])
(say-hello-to-everyone ["Chris" "Tom" "Jim" "Rocky"])
هل كانت مفيدة؟

المحلول

انت تريد doseq, ، "foreach" لكلوجر:

(doseq [name names]
  (say-hello name))

map لا يعمل لأنه ينتج تسلسلًا كسولًا:وإلى أن تتمكن فعليًا من الوصول إلى العناصر الموجودة في التسلسل (وهو ما لا يمكنك الوصول إليه هنا)، لن يتم تقييم أي منها، ولن تحدث آثار جانبية.

خيار آخر هو فرض التقييم عن طريق الالتفاف dorun حول ال map.إن التفكير في سبب نجاح ذلك قد يساعدك على فهمك (على الرغم من ذلك). doseq هو النهج الاصطلاحي هنا).

نصائح أخرى

كما يقول @ @ تعليق في تعليقه، لا تقيم خريطة FN حتى اللحظة الضرورية لأن خريطة FN إرجاع SEQ كسول.

هذا هو وثيقة خريطة FN إرجاع تسلسل كسول يتكون من نتيجة تطبيق F إلى مجموعة من العناصر الأولى لكل كول، تليها تطبيق F إلى المجموعة العناصر الثانية في كل شركة، حتى أي واحد من cols هو مرهق.يتم تجاهل أي العناصر المتبقية في Clss الأخرى.دور يجب أن تقبل F عدد الحجج.

إذا كنت بحاجة إلى التأكد من أن القيم تقيم في جزء محدد من التعليمات البرمجية التي يمكنك استخدامها Doall أو Dorun

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top