multipart/form-dataのバウンダリ文字列生成(その後)

この方がClojureっぽいよ!という指摘をいただきました。
github:gist

char-rangeのところはおいといて(w

確かに昨日のソースは

(defn generateBoundary []
  (let [chars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"]
    (apply str "-------" (take 40 (repeatedly #(rand-nth chars))))))

にしたほうがよりClojureっぽいですね。

(rand-nth [coll])

はコレクションcollの中からn番目をランダムに選ぶ関数

(repeatedly f)

は関数fを無限回呼び出す遅延シーケンスを返す関数。

#(rand-nth [coll])

として無名関数化してrepeatedlyに渡している。
ただしこいつは

(repeatedly n f)

と書いて無限シーケンスの先頭要素n個を取ることもできるので

(defn generateBoundary []
  (let [chars "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"]
    (apply str "-------" (repeatedly 40 #(rand-nth chars)))))

のようにtakeを省略できる。
乱数については(rand-nth [coll])以外にも(rand-int n) (0〜n-1までの整数の乱数を返す)のもあるのでJavaのRandomのオブジェクトを生成して使わないでもよいケースも多そう。