10

私はClojureScriptを実験/学習しています。次のコードスニペットは、優れたd3.js libとインターフェイスして、いくつかの円を表示します。マクロに頼らずに、少し冗長であることがわかります。それを最適化/最小化する方法はありますか?

(def rdata (atom (array 3 10 12 16 19)))

(defn update []
(let [em (.selectAll (.select js/d3 "svg") "circle")
     data (.data em @rdata d3/String)
     enter (.append (.enter data) "circle")
     yscale (.linear (. js/d3 -scale))
     xscale (.linear (. js/d3 -scale))
     rscale (.linear (. js/d3 -scale))
     ]
(-> yscale 
  (.domain (array 0 20))
  (.range (array 100 200)))
(-> xscale
  (.domain (array 0 20))
  (.range (array 100 800)))
(-> rscale
  (.domain (array 0 20))
  (.range (array 50 100)))
(-> enter
  (.attr "cx" xscale)
  (.attr "cy" yscale)
  (.attr "r" rscale)
  (.style "fill" "steelblue")
  (.style "stroke" "black")
  (.style "stroke-width" "2")
  )
)
(.info js/console "rdata: " @rdata)
)

ありがとう

4

1 に答える 1

12

(.linear (.-scale js/d3))スケールを初期化するために、もう少し簡潔に書くことができます。また、このコードスニペットでは、データにAtomを使用する理由はありません。updateビジュアライゼーションを更新する場合は、アトムを変更して引数なしの更新fnを呼び出すのではなく、引数として新しいデータを渡すことができます。

連鎖に慣用的なスレッドマクロなので、問題ありません。

繰り返しになりますが、まっすぐなClojureライブラリを使用するよりも慣用的なものにすることはできません。D3のClojure(Script)実装であるC2をチェックしてください。(もちろん、筆頭著者として、私はそれに少し偏っています。)

D3自体を使用する必要がある場合は、非推奨になったcljs-d3ラッパーのソースをスキミングすることもできます。

マクロは、より簡潔なインターフェイスを取得する1つの方法です(たとえば、マップリテラルを複数の(.attr "key" value)呼び出しに拡張する)が、チェーンマクロのセマンティクスにより、JavaScriptの場合とは大きく異なり、任意のfnをチェーンに挿入できます。たとえば、d3の選択と属性マップを取得し、各マップのキー/値doseqを呼び出すために使用するプレーンなfnを作成できます。(.attr d3 k v)

実際、昨年のClojure Conjから、この正確な主題(例としてD3を使用)について40分の講演があります。

于 2012-05-26T04:04:56.497 に答える