いわゆる卍研究所。
In: Clojure
17 12月 2009久々にのけぞった。
いやもうね map とか reduce とか強力すぎるからw
Clojureで多次元配列を扱う方法を探していたのですが
たとえば3×3×3の大きさの3次元配列:
(def lattice [[ [1 2 3] [4 5 6] [7 8 9]] [[10 11 12] [13 14 15] [16 17 18]] [[19 20 21] [22 23 24] [25 26 27]]])
の任意の要素を取り出したいとする。
lattice[z][y][x] のように簡単に要素を取り出したい。
いろいろ検索して見つけた答えは Clojureで書くとこうなります。
(reduce nth lattice [z y x])
うわー。やられた。おもいっきり盲点。
reduceは rubyでいうところの injectと覚えていたので
(1..6).inject(:+) # = 1 + 2 + 3 + 4 + 5 + 6
のイメージが強すぎた。
だからapply と似たような使い方をしていたわけだ。
でもよく考えると本当は
((((((1) + 2) + 3) + 4) + 5) + 6)
なんだよね。
つまり最初の例だとこうなる。
(nth (nth (nth lattice z) y) x)
reduceの本質は再帰性にあったのだと再認識。
そう考えるといままで再帰にするだけで満足していたものが reduceで表記できるのもあったのかもしれないなー。
アルゴリズムの抽象度を高めていくのは楽しい工程ですね。
Lispネイティブと言えるほどに使いこなせるのはいつの日か。
私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。