Clojureを遊ぶ:括弧とか
「プログラミングClojure」で出てきたforループのサンプル。
(defn indexed [coll] (map vector (iterate inc 0) coll)) (defn index-filter [pred coll] (when pred (for [[idx elt] (indexed coll) :when (pred elt)] idx)))
実行結果:
(index-filter #{\a} "dfajklfabce") -> (2 7)
初学者の自分がこれを読み解くのに苦労した。
お遊びで、Rubyっぽく表記を変えてみる。
def indexed (coll) map(vector, iterate(inc, 0), coll) end def index-filter (pred, coll) when pred for (idx, elt) in indexed(coll) :when pred(elt) idx end end end
こういうお遊びは楽しい。
括弧の()
や[]
という表記は、範囲を表すためのものだが、
ネストすると脳内で解読が必要になってしまう。
元のコードだと[[idx elt] ...]
あたりで目がちかちかするW。
処理によって表現に使う記号を変えるだけで、ずいぶんと読みやすくなる。
一方で、Paul Grahamがどっかの本で書いてあったのだが、 LISPer人たちは、括弧は無視してて、エディタの力を借りて、 インデントで構文を読んでいると。(最近はシンタックスハイライトもあるしね)
元のコードから、人間には解読可能な範囲で、括弧をなくすだけでも、ずいぶんと読みやすくなる。
defn index-filter [pred coll] when pred for [idx elt] (indexed coll) :when (pred elt) idx
こうするとPythonっぽいよな。