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 に答える