2012-04-12 6 views
1

2つのパラメータ(csv-data1とcsv-data2、2つの行と保証された不一致ベクトルのベクトルは出力にcmp-valを得ます)をとる次の関数が与えられます。関数におけるこの条件でなぜ条件付きリダクションがnilを返すのですか?

(defn test-key-inclusion 
    "Accepts csv-data param and an index, a second csv-data param and an index, 
    and searches the second csv-data instances' rows (at index) to see if 
    the first file's data is located in the second csv-data instance." 

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

    (reduce 
     (fn [out-log csv-row1] 
      (let [cmp-val (nth csv-row1 pkey-idx1 nil) 
        lnam (nth csv-row1 lnam-idx nil) 
        fnam (nth csv-row1 fnam-idx) 
        temp-rc (first (key-pres? cmp-val pkey-idx2 csv-data2))] 

       (if-not (nil? cmp-val) 
        (concat out-log (sorted-map cmp-val (vector lnam fnam)))))) 
     {} 
     csv-data1)) 

(if-not (nil? cmp-val) 
    (concat out-log (sorted-map cmp-val (vector lnam fnam)))))) 

返すnilを減らします。

なぜですか?

+0

と同等であることを

(if cmp-val (concat out-log (sorted-map cmp-val (vector lnam fnam))))) out-log) 

注意する必要があり、 '「リターン」にそのブランチのデフォルトではありませんnil'? –

答えて

4

cmp-valがnilの場合、reduce関数からnilが返されるためです。

条件は、あなたが(他の)句を交互に供給していない場合はif-not (nil? foo)if foo