Twitterでアドバイスをいただいた。ありがとうございます!
早速試してみよう。
教えてもらった2パターンをそのまま書いてみる。
おお…確かにどちらでも動作する。しかも簡潔だ。
初めて使う関数がいくつかあるので、一つずつ見ていこう。
partition-all
前回、(partition 3 3 nil '(a b c d e f g h i k))とやって3つ組に満たないkも結果に残すようにしていたが、
そういう用途であれば(partition-all 3 '(a b c d e f g h i k))でよかったようだ。
when, when-not
when は 述語と何らかの値を取り、述語が真であればその値を、偽であればnilを返す関数のようだ。 when-not はその逆。
> (when (= 1 1) :a)
:a
> (when (= 1 2) :a)
nil
> (when-not (= 1 2) :a)
:a
> (when-not (= 1 1) :a)
nil
keep-indexed
keep-indexedmap-indexedとほぼ同じだが、要素にnilが含まれていた場合除外するかどうかに違いがある、
という理解で良いのかな?
インデックスを見つつフィルタしたい場合に使えそうだ。
> (keep-indexed #(if (odd? %1) %2) [:a :b :c :d :e])
(:b :d)
> (map-indexed #(if (odd? %1) %2) [:a :b :c :d :e])
(nil :b nil :d nil)
mapcat
mapcatはScalaでいうflatMapみたいな関数か。
> (map #(list % %) '(1 2 3 4 5))
((1 1) (2 2) (3 3) (4 4) (5 5))
> (mapcat #(list % %) '(1 2 3 4 5))
(1 1 2 2 3 3 4 4 5 5)

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .