3

私の質問は、Clojure のスレッド化マクロの 1 つを特定のケースで動作させるにはどうすればよいですか? ありがとうございました。

このエラーが発生しています:

(IllegalArgumentException Don't know how to create ISeq from: 
bene_csv.core$test_key_exclusion$fn__346  clojure.lang.RT.seqFrom (RT.java:487)

この関数を呼び出すと:

bene-csv.core=> (test-key-exclusion bene-data 1 gic-data 0 2 3)

このコードを考えると -- マクロをスレッド化せずに動作するソリューションはコメントアウトされています --

(defn ret-non-match-rows
    "Expects a sequence of sequences, like what is returned from clojure-csv.
     Returns nil if there's a match; else returns failing row."

    [s-o-s cmp-col-idx inq-row-idx inq-row]

    (let [inq-row inq-row]
        (loop [[row & remain-seq] s-o-s pos 0]
            (let [cmp-val (nth inq-row inq-row-idx nil)]
            (cond
                (not row) inq-row
                (= cmp-val (nth row cmp-col-idx)) nil
                :not-found (recur remain-seq (inc pos)))))))

(defn test-key-exclusion
    "This function takes csv-data1 (the includees) and tests to see
     if each includee is in csv-data2 (the includeds). This function
     also gathers enough other data, so that excludees (those not found),
     can be identified."

    [csv-data1 pkey-idx1 csv-data2 pkey-idx2 lnam-idx fnam-idx]

    (-> (map #(ret-non-match-rows csv-data2 pkey-idx2 pkey-idx1 %1) csv-data1)
        (filter (complement nil?))
        (map (fn [row]
                (vector (nth row pkey-idx1 nil)
                        (nth row lnam-idx nil)
                        (nth row fnam-idx nil))))))
(comment
    (map (fn [row]
            (vector (nth row pkey-idx1 nil)
                    (nth row lnam-idx nil)
                    (nth row fnam-idx nil)))

         (filter (complement nil?)
            (map #(ret-non-match-rows csv-data2 pkey-idx2 pkey-idx1 %1) csv-data1)))

次のようなデータがあります。

[["0123456789" "SMITHFIELD" "HAM"]["1123456789" "LITTLE" "CHICKEN"] ...]
4

1 に答える 1

15

「thread-first」マクロを使用していますが、代わりに「thread-last」マクロを使用する必要があります。シンボル->>にバインドされている "thread-last" マクロは、最初の引数ではなく最後の引数としてフォームを挿入することを除いて、"thread-first" マクロと同じことを行います。

したがって、コードは次のようになります。

(->> (map #(ret-non-match-rows csv-data2 pkey-idx2 pkey-idx1 %1) csv-data1)
     (filter (complement nil?))
     (map (fn [row]
       (vector (nth row pkey-idx1 nil)
               (nth row lnam-idx nil)
               (nth row fnam-idx nil))))))
于 2012-05-10T17:21:25.643 に答える