404 Blog Not Found:algorithm – mapBetween – 配列の隣接する2項にそれぞれ演算を施した配列
を見たので clojure でどうなるかやってみました.
(defn map-between [f s] (map (fn [[a b]] (f a b)) (partition 2 1 s)))
実行例
user=> (map-between #(- %2 %1) '()) () user=> (map-between #(- %2 %1) '(0)) () user=> (map-between #(- %2 %1) '(0 1)) (1) user=> (map-between #(- %2 %1) '(0 1 4)) (1 3) user=> (map-between #(- %2 %1) '(0 1 4 9)) (1 3 5)
partition は便利で,
partition n step coll
で, シーケンス coll から, n 個ずつの要素のリストを, step 個ずつずらしながら取得できます.
user=> (partition 2 1 '(:a :b :c :d :e :f)) ((:a :b) (:b :c) (:c :d) (:d :e) (:e :f))
[[a b]] の [a b] の部分はパターンマッチです.
引数が二要素のリストなら a に第一要素が, b に第二要素が束縛されますので,
元のシーケンスから partition で一個ずつずらしながら, 二個ずつ要素を取得し,
map で, そのそれぞれの二個の要素に対して, それを引数として二引数関数 f を適用し,
全体をシーケンスとして返します.
追記: 2011.01.06
@omasanori さんからのご指摘 で, 無駄に無名関数ひとつ挟んでいたのを直しました.
@omasanori さんありがとうございます.
文法は S 式ですが, 現代的な言語の良いところを集めて, 洗練された言語である上に, JVM の上で動き, Java クラスライブラリとの相互運用を可能にすることで, 若い言語でありながらライブラリが追いつく前から実用できるという成る程なやり方.
(この本を読んでいる間に純 Clojure のライブラリもどんどん充実し, Java との相互運用の必要性も薄れ, CLR 版も開発が進んでる様子ですが..)
言語が洗練されているので, この本は薄いですが, Clojure を理解するのに十分と思えます. ただし密度は濃いので流し読みはできません.
まずはこの本を, と思い, 他の Clojure 本は読んでませんが, これから他の本も読んでみたいと思います.
「どうしてそうなっているか」, 「(あなたが知っているかもしれない)他のやり方のどの欠点を克服するためにそうなっているか」を, 必要なところはパラダイムの説明に何節か割いたり, 他の言語でのそのパラダイムの取り扱われ方の説明も交え, 懇切丁寧に書かれている.
Clojure について, LISP について, 一般のプログラミング パラダイムについて, 知らなかったことについてはもちろん, 既に知っているものについても, より理解が深まると思う.
パート2(八章以降)は, 実用のケーススタディだ. 自分の必要とするケースに併せて拾い読みしても良いし, ケース自体の勉強のために通読しても良いと思う.
以下は, 前書きからの引用(拙訳)
“より良い道具とはなんだろう. 何に対してより良いということだろう.より良い道具とは複雑さの管理をより良く助けてくれるようなものだと私は思う.結局, 「複雑さ」が我々の業界のこんな状況の根本的な原因なのだ.ブルックスは1986年という早い時期に複雑さについて論文で言及している.彼は本質的な(essential) 複雑さと本質的でない (accidental) 複雑さの区別を書いている.
本質的な複雑さとは目的領域にそもそも存在するものであり, 一方,
本質的でない複雑さとは目的領域の外から持ち込まれた複雑さである.
例えば, 税金の申告を取り扱うソフトウェアプロジェクトにおいて,
入り組んだ税金コードに起因する複雑さはその領域の一部であり, つまり本質的である.
難解なビジター・パターンを採用するとか, そういったことが引き起こす全ての複雑さは
本質的ではないものだ.
先ほどの言明を言い換えさせてもらうならば, 「より良い道具とは本質的でない複雑さを
最小限にするよう我々を助けてくれるようなものだ」と言える.
我々が我々の仕事を可能な限り良い方法で行えるようにする.
すばらしい道具とはそれ以上のものだ. 我々に力を与えてくれる. 道具自体の問題を持ち込んだりせず, 設計者やプログラマとしての我々の有効性を増幅してくれる.
LISP プログラミング言語はそういった道具になるべく設計されている.
そして Clojure は驚くほど良く設計された LISP である.”
Related Posts:
- ハノイとバベルの塔 第九階 – 端末アニメ in Clojure
- clojure から DBMS を利用する
- Swinging Clojure (1)
- ぷログラミング
- Swinging Clojure (3)