2013-02-09 3 views
0

Я пытаюсь написать макрос, который принимает данные в качестве аргумента и рассматривает все данные из набора данных на одном xy-plot. Например, я создать DataSetКак использовать макрос в clojure для просмотра xy-plot со многими строками?

(def test-data 
[["RECALL" "CAFE" "CLIPPERS"] 
[0 0 0] 
[14 15 13] 
[160 146 155]]) 

и написать этот

(defmacro figure 
    [datas] 
    (let [x `(range 0 (nrow ~datas)) y `(rest (:column-names ~datas))] 
    `(let [datas# ~datas] 
     (with-data datas# 
     (doto 
      (xy-plot ~x ($ (first (:column-names datas#)))) 
      [email protected](map (fn [arg] `(add-lines ~x ($ ~arg))) (eval y));;this line, wheh rest of columns have added to xy plot, get me a trouble 
      view))))) 
(figure test-data) 

Но есть проблема с Eval в коде. Я думаю, что это не Clojure идиоматический путь, и это не работает в некоторых случаях. Я пробовал всевозможные дикие трюки, чтобы получить имена столбцов набора данных в качестве оцененного аргумента, но это не сработало.

Существует ли метод для выражения выражения при макрораспределении времени в макросе?

+0

Почему вы хотите использовать макрос здесь? Я думаю, что функция будет выполнять эту работу. –

ответ

0

Вам не нужно использовать макрос здесь. Обычная функция сделает эту работу:

(defn figure [data] 
    (let [x (range (nrow data)) 
     [h & t] (:column-names data)] 
    (with-data data 
     (let [plot (xy-plot x ($ h))] 
     (doseq [col-name t] 
      (add-lines plot x ($ col-name))) 
     (view plot))))) 
+0

Это довольно работа, Никита, спасибо много от России! – user2055205