هل هناك وظيفة مماثلة ل"andmap" في كلوجر؟
-
06-07-2019 - |
سؤال
وأريد أن تطبيق سلسلة من الاختبارات على قائمتي وتأكد من أن يتم تمرير كافة الاختبارات. هل هناك وظيفة مماثلة ل"andmap" في كلوجر؟
المحلول
نصائح أخرى
وكلوجر 1.3 سيضيف كل سابق التحديد (وتتعلق بعض-الجبهة الوطنية ل"أو" إصدار).
وclojure.core / كل-سابق التحديد ([ص] [P1 P2] [P1 P2 P3] [P1 P2 P3 & PS])
وتحيط مجموعة من المسندات وإرجاع و دالة ترجع صحيح إذا كان كل من فيها المسندات يؤلف بإرجاع قيمة حقيقية منطقية ضد كل من حججها، وإلا فإنها ترجع خاطئة. لاحظ أن f غير قصيرة في الدائرة في أنه سيكون وقف التنفيذ على أول حجة أن يتسبب في نتيجة منطقية كاذبة ضد المسندات الأصلية.
قد يكون تنفيذ السذاجة:
و(defn كل-سابق التحديد [& preds] (FN [وسائط] (كل؟ # (كل؟٪ سائط) preds)))
ولكن التنفيذ الفعلي سيكون الأداء أفضل.
وكتبت andmap
كما ماكرو الذي يأخذ المسندات كوسائط ويبني وظيفة أن "يلتف على and
حول المسندات"، أي بمعنى.
(andmap integer? odd?)
==>
(fn [x] (and (integer? x)
(odd? x)))
و(لا تتسع ل<م> بالضبط م> هذا، ولكنه يتسع لشيء يعادل ذلك)
وهذا له ميزة أنه shortcuircuts على المسندات حتى تتمكن من كتابة
(every? (andmap integer? odd?) [1 3 "a string"])
ودون الحصول على استثناء وقت التشغيل كما ستحصل مع <لأ href = "https://stackoverflow.com/questions/1209824/is-there-a-function-similar-to-andmap-in-clojure/1209990# 1209990 "> ارثرز الإجابة .
وهنا هو تعريف andmap
:
(defmacro andmap ([] `(fn [& x#] true)) ([p & ps] `(fn [& x#] (and (apply ~p x#) (apply (andmap ~@ps) x#)))))
ومن الممكن أيضا لتحديد andmap
باعتبارها وظيفة والتي أيضا قصيرة الدوائر على المسندات انها بسبب lazyness:
(defn andmap [& ps] (fn [& x] (every? true? (map (fn [p] (apply p x)) ps))))
ووالمسندات إلى andmap يمكن اتخاذ عدد التعسفي من الحجج، ولذلك فمن الممكن أن يكتب
(map (andmap #(and (integer? %1)
(integer? %2))
#(and (odd? %1)
(even? %2))
<)
[1 3 9]
[2 6 "string"])
والذي يقيم إلى (true true false)
.
وسوف every?
يسأل "هل هذه وظيفة واحدة العودة الحقيقية لكل عضو من بعدها"، التي هي قريبة من ما أعتقد كنت طالبا. ومن شأن تحسن على every?
تأخذ قائمة من الوظائف ويسأل "هل كل هذه المسندات الحقيقية لكل عضو في هذا يليها".
وهنا هو المحاولة الأولى:
(defn andmap? [data tests]
(every? true? (for [d data, f tests]
(f d))))
user> (andmap? '(2 4 8) [even? pos?])
true
user> (andmap? '(2 4 8) [even? odd?])
false