这会被认为是惯用的ClojureScript吗?

use*_*621 10 d3.js clojurescript

我正在试验/学习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)
)
Run Code Online (Sandbox Code Playgroud)

谢谢

Kev*_* L. 12

要初始化您可以编写的比例(.linear (.-scale js/d3)),这更简洁一些.此外,在此代码段中,没有理由使用Atom作为数据.如果要更新可视化,可以将新数据作为参数传递,update而不是改变原子并调用no-arg update fn.

用于链接的线程宏是惯用的,所以你在那里很好.

再说一遍,你不能比使用直接的Clojure库更习惯; 查看C2,D3的Clojure(脚本)实现.(当然,作为主要作者,我对那个有点偏颇.)

如果您需要使用D3本身,您可能还想浏览现已弃用的cljs-d3包装器的源代码.

宏是获得更简洁的接口的一种方式(例如,将地图文字扩展为多个(.attr "key" value)调用),但链接宏的语义允许您将任何fn注入链中,这与JavaScript情况非常不同.例如,您可以编写一个简单的fn,它接受d3选择和属性映射,并用于doseq调用(.attr d3 k v)每个映射键/值.

实际上,去年Clojure Conj就这个确切的主题(使用D3作为例子)进行了40分钟的谈话.