質問
それは強力なマクロのようですが、愚かな例以外には適用できません。本当の使い方を見せていただけますか?
ありがとう!
解決
比較:
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"]
to:
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"]
-&gt;
は、呼び出しを簡潔にネストする方法が必要な場合に使用されます。これにより、呼び出しをインサイドアウトではなく、呼び出される順にリストすることができ、読みやすくなります。 3番目の例では、いくつかの引数とそれらが属する関数の間の距離に注意してください。 -&gt;
を使用すると、引数と関数呼び出しをよりきれいにグループ化できます。マクロであるため、Java呼び出しでも機能します。これは素晴らしいことです。
-&gt;
はそれほど強力ではありません。数個の括弧を時々節約するだけです。使用するかどうかは、スタイルと読みやすさの問題です。
clojure.zip の下部をご覧くださいa>これがどのように役立つかの極端な例。
(-> dz next next next next next next next next next remove up (append-child 'e) root)
他のヒント
wiki から取得この印象的な例:
user=> (import '(java.net URL) '(java.util.zip ZipInputStream))
user=> (-> "http://clojure.googlecode.com/files/clojure_20081217.zip"
URL. .openStream ZipInputStream. .getNextEntry bean :name)
ブライアンが言ったように、「異なるスタイル」ほど「有用」ではありません。すべてのJava相互運用で、この形式の「Xで開始」を見つけてからYとZを実行します。XのZからYを実行するよりも読みやすくなります。
基本的に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)
見つかった-&gt; Javaの相互運用性には本当に優れていますが、他の場所では避けてください。
(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))))
#clojureのClojurebotは、これを使用してassemblaチケットを検索します
所属していません StackOverflow