2012-05-25 3 views
10

Ich experimentiere/lerne ClojureScript. Das folgende Code-Snippet ist mit der ausgezeichneten d3.js-Lib verbunden, um einige Kreise anzuzeigen. Finden Sie es etwas verbal, ohne auf Makros zurückgreifen zu müssen, gibt es eine Möglichkeit, es zu optimieren/zu minimieren?Würde dies als idiomatisches ClojureScript betrachtet?

(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) 
) 

Dank

Antwort

12

die Waage initialisieren Sie (.linear (.-scale js/d3)) schreiben kann, was etwas knapper ist. Außerdem gibt es in diesem Code-Snippet keinen Grund, ein Atom für die Daten zu verwenden. Wenn Sie die Visualisierung aktualisieren möchten, könnten Sie neue Daten als Argument an update übergeben, anstatt das Atom zu mutieren und ein no-arg-Update fn aufzurufen.

Das Threading Makro idiomatische zum Verketten, so dass Sie gut dort sind.

Dann wieder, Sie können nicht mehr idiomatische als mit einer geraden Clojure-Bibliothek; Auschecken C2, eine Clojure (Script) Implementierung von D3. (Natürlich, wie der Hauptautor bin ich ein bisschen auf, dass man voreingenommen.)

Wenn Sie D3 selbst verwenden, könnten Sie auch die Quelle des nun veralteten cljs-d3 Wrapper abschöpfen wollen.

Makros sind eine Möglichkeit, eine übersichtlichere Oberfläche zu erhalten (z. B. das Erweitern von Kartenliteralen in mehrere (.attr "key" value) Aufrufe), aber die Semantik des Verkettungsmakros lässt Sie beliebige Fn in die Kette injizieren, was sich sehr vom JavaScript-Fall unterscheidet . Sie könnten zum Beispiel ein einfaches Fn schreiben, das die d3-Auswahl und eine Attributzuordnung verwendet und doseq verwendet, um (.attr d3 k v) für jeden Kartenschlüssel/-wert aufzurufen.

Eigentlich gibt es eine 40 minute talk zu diesem genauen Thema (mit D3 als Beispiel) von Clojure Conj letztes Jahr.

+1

Danke Kevin für das Feedback und geht auf C2 und d3-cljs. C2 sieht interessant aus, ich suche eine rein clientseitige Implementierung, ist das mit C2/ClojureScript möglich? – user922621

+0

In Bezug auf den Atom für Daten, möchten Sie den Code zu einem Dashboard mit den Daten schrittweise auf den Client verschoben werden ... weiß nicht, ob Atom der richtige Ansatz ist? – user922621

+0

Atom ist ein großartiger Ansatz für den Umgang mit Staat. Ich würde versuchen, es zu isolieren: Definieren Sie das Atom-Toplevel, aber deneferenzieren Sie es so wenig wie möglich - bevorzugen Sie, die Daten explizit über Fn-Argumente herumzugeben. –

Verwandte Themen