2012-05-25 8 views
10

Eksperymentuję/uczę się ClojureScript. Poniższy fragment kodu łączy się z doskonałą biblioteką d3.js, aby wyświetlić niektóre kręgi. Znajdź, że jest trochę gadatliwy, bez uciekania się do makr, czy istnieje sposób na zoptymalizowanie/zminimalizowanie tego?Czy to byłoby uznane za idiomatyczny ClojureScript?

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

Dzięki

Odpowiedz

12

Aby zainicjować łuski można napisać (.linear (.-scale js/d3)), który jest nieco bardziej zwięzłe. Również w tym fragmencie kodu nie ma powodu, aby używać Atomu do danych. Jeśli chcesz zaktualizować wizualizację, możesz przekazać nowe dane jako argument do update zamiast mutować atom i wywoływać aktualizację bez-fn fn.

Makra wątku idiomatycznego do łączenia, więc jesteś tam dobry.

Z drugiej strony nie można uzyskać bardziej idiomatycznego efektu niż użycie prostej biblioteki Clojure; sprawdź C2, implementację Clojure (skryptu) D3. (Oczywiście, jako główny autor jestem trochę stronniczy na jednym.)

Jeśli trzeba użyć samego D3, możesz również przejrzeć źródło teraz już nieaktualnych cljs-d3 owijki.

Makra to jeden ze sposobów na uzyskanie bardziej zwięzłego interfejsu (np. Rozszerzenie literałów mapy na wiele wywołań (.attr "key" value)), ale semantyka makra łączenia pozwala wprowadzić dowolne fn do łańcucha, który jest bardzo różny od przypadku JavaScript . Można na przykład napisać zwykły plik fn, który pobiera zaznaczenie d3 i mapę atrybutów i używa doseq do wywoływania (.attr d3 k v) dla każdego klucza/wartości mapy.

Właściwie, istnieje 40 minute talk na ten temat (z wykorzystaniem D3 jako przykładu) z Clojure Conj w zeszłym roku.

+1

Dzięki Kevinowi za informację zwrotną i udział w C2 i d3-cljs. C2 wygląda interesująco, szukam czysto implementacji po stronie klienta, czy można to zrobić z C2/ClojureScript? – user922621

+0

Jeśli chodzi o Atom dla danych, chcesz ewoluować kod do deski rozdzielczej z danymi przekazywanymi do klienta stopniowo ... nie wiesz, czy Atom jest właściwym podejściem? – user922621

+0

Atom to świetne podejście do obsługi stanu. Próbowałbym go jednak wyizolować: zdefiniuj poziom atomu, ale usuń go w jak najmniejszym stopniu - wolisz przekazywać dane w sposób jawny za pomocą argumentów fn. –

Powiązane problemy