كيف أقوم بأداء وظيفة ذات آثار جانبية على ناقل؟
-
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