「プログラミングClojure」で出てきたサンプル。
user=> (filter (fn [w] (> (count w) 2)) (str/split "A fine day" #"\W+")) ("fine" "day")
filter関数は、
(filter pred coll)
コレクションcollの各要素に対して、条件をチェックする関数predを適応して、trueが返ってきたものだけを、
戻りのシーケンスに入れて返す。
rubyでいうとArray#select
に相当する。
さて、上記の(fn [w] (> (count w) 2))
が無名関数で、リーダマクロ#()
を使って、#(> (count %) 2)
という形で書ける。
user=> (filter #(> (count %) 2) (str/split "A fine day" #"\W+")) ("fine" "day")
無名関数は任意の変数にバインドできる。 (Clojureのvarは変数とは厳密に違うようだが)
a
にバインドして実行してみる。
user=> (def a #(> (count %) 2)) #'user/a
user=> (a "abc") true user=> (a "jk") false
ここら辺の関数の扱いの気軽さはjavascript並みだ。 javascriptで書くと下記のようなものになるかと。
var a = function(w) { return (count(w)>2); } a("abc);
最後に冒頭の例で、a
にバインドされた無名関数を使ってみる。
user=> (filter a (str/split "A fine day" #"\W+")) ("fine" "day")