clojure-csv から出力された一連のシーケンスがあります。
(def s1 [[:000-00-0000 "SMITH" "JOHN" 27][:000-00-0001 "FARMER" "FANNY" 28]])
各シーケンスからデータを抽出するために使用したい列番号 [0 3] のベクトルがあります。
可変数のマップ フォームを 1 つにまとめる関数を作成するのではなく、マクロを使用するとうまくいくのではないかと考えました。しかし、私は問題を抱えています。
このマクロは、シーケンスと列「マスク」を受け入れます
(defmacro map-cols [seq & columns]
(for [col# columns
:let [mc# `(map #(nth % ~col# nil) ~seq)]]
mc#))
(map-cols s1 cols)
ClassCastException clojure.lang.LazySeq cannot be cast to clojure.lang.IFn bene-csv.core/eval2168
以下に示す複数のマップ フォームを生成したいと考えていました。
(zipmap (map #(nth % 0 nil) s1) (map #(nth % 1 nil) s1))
{:000-00-0001 "FARMER", :000-00-0000 "SMITH"}
私が間違っていることについていくつかのアイデアをいただければ幸いです。もちろん、抽出する必要がある列の数に合わせて a 関数を調整することもできます。
ありがとうございました。
編集:
変更されたマクロ
(defmacro map-cols [seq & columns]
(vec (for [col columns
:let [mc `(map #(nth % ~col nil) ~seq)]]
mc)))
(apply zipmap (map-cols s1 cols))
ArityException Wrong number of args (1) passed to: core$zipmap clojure.lang.AFn.throwArity