0

我尝试编写将数据集作为参数的宏,并在单个 xy 绘图上查看数据集中的所有数据。例如,我创建数据集

(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#))))
          ~@(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 惯用的方式,在某些情况下这不起作用。我尝试了各种疯狂的技巧来获取数据集的列名作为评估参数,但这不起作用。

是否存在在宏中的宏扩展时间评估表达式的方法?

4

1 回答 1

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)))))
于 2013-02-12T13:25:54.603 回答