هل تستطيع أن تعطيني بعض الأمثلة من واقع الحياة ل-> ماكرو؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

ويبدو أن ماكرو قوية، ولكن أنا عدم تطبيقه على أي شيء ولكن أمثلة سخيفة. هل تستطيع أن تريني بعض الاستخدام الحقيقي لذلك؟

وشكرا!

هل كانت مفيدة؟

المحلول

وقارن:

user> (:baz (:bar (:foo {:foo {:bar {:baz 123}}})))
123
user> (java.io.BufferedReader. (java.io.FileReader. "foo.txt"))
#<BufferedReader java.io.BufferedReader@6e1f8f>
user> (vec (reverse (.split (.replaceAll (.toLowerCase "FOO,BAR,BAZ") "b" "x") ",")))
["xaz" "xar" "foo"]

إلى:

user> (-> {:foo {:bar {:baz 123}}} :foo :bar :baz)
123
user> (-> "foo.txt" java.io.FileReader. java.io.BufferedReader.)
#<BufferedReader java.io.BufferedReader@7a6c34>
user> (-> "FOO,BAR,BAZ" .toLowerCase (.replaceAll "b" "x") (.split ",") reverse vec)
["xaz" "xar" "foo"]

ويستخدم -> عندما كنت تريد طريقة مختصرة لدعوات العش. فإنه يتيح لك قائمة المكالمات بالترتيب أنها سوف تكون دعا بدلا من الداخل إلى الخارج، والتي يمكن أن تكون أكثر قابلية للقراءة. في المثال الثالث، لاحظ كم هي المسافة بين بعض الحجج وظيفة أنهم ينتمون إلى؛ -> يتيح لك الحجج مجموعة وتدعو ظيفة قليلا أكثر نظافة. لأنه ماكرو كما أنها تعمل ليدعو جافا، التي هي لطيفة.

و-> ليست قوية، وأنها مجرد يوفر لك بعض أقواس بين الحين والآخر. استخدامه أم لا هي مسألة الأسلوب وسهولة القراءة.

ونظرة على الجزء السفلي من clojure.zip للحصول على أمثلة القصوى لكيفية هذا مفيد.

(-> dz next next next next next next next next next remove up (append-child 'e) root)

نصائح أخرى

يكي لقد وجدت دائما هذا المثال إعجاب:

user=> (import '(java.net URL) '(java.util.zip ZipInputStream))
user=> (-> "http://clojure.googlecode.com/files/clojure_20081217.zip"
           URL. .openStream ZipInputStream. .getNextEntry bean :name)

وكما قال بريان - أنها ليست "مفيدة" بقدر ما هو "نمط مختلف. أجد لجميع جافا إمكانية التشغيل المتداخل هذا النوع من "تبدأ X 'ثم القيام Y و Z ... أكثر قابلية للقراءة من القيام Z إلى Y من X.

وأساسا لديك 4 خيارات:

; imperative style named steps:
(let [X something
      b (Y X)
      c (Z b)] c)

; nested calls
(Z (Y X))

; threaded calls
(-> X Y Z)

; functional composition
((comp Z Y) X)

وأجد -> يضيء حقا للجافا إمكانية التشغيل المتداخل لكن تجنب ذلك في أماكن أخرى

.
(defn search-tickets-for [term]
  (-> term search zip-soup first :content
    ((partial filter #(= :body (:tag %)))) first :content
    ((partial filter #(= :div (:tag %))))
    ((partial filter #(= "content" ((comp :id :attrs) %))))
    ((partial map :content)) first ((partial map :content))
    ((partial map first)) ((partial filter #(= :ul (:tag %)))) first :content
    ((partial map :content))
    ((partial map first))
    ((partial mapcat :content))
    ((partial filter #(= :h4 (:tag %))))
    ((partial mapcat :content))
    ((partial filter #(= :a (:tag %))))
    ((partial mapcat :content))))

وclojurebot من #clojure يستخدم هذا للبحث تذاكر assembla

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