bashで高階関数のアイデア
bashで高階関数が使えたらどんだけプログラミングが楽になるか。最近そう考えるようになった。 欲しい高階関数は、こんな感じかな。
- map ( xargs のaliasでも良い?)
- filter ( grep のaliasでも良い?)
- fold
- map_with_index
ついでに関数型プログラミングっぽいコードを書く為に必要そうな関数(コマンドで実装する?)
- take
- atoi (名前はPythonに習ってrangeでも良い)
ところで何でbashにこだわるの?という疑問が当然発せられると思う。 それはbashから呼びだす関数(というかコマンド)が一番豊富だと思うから。かつ実装系が枯れている。 例えば、画像の変換を行ないたいと思えばImageMagikのconvert関数を呼べばよい。 ファイルを圧縮したいと思えばgzipコマンドを呼べば良い。 ファイルリストを取りたいと思えばfindを呼べば良い。 さらには、メールを送りたいと思えばmailを呼べば良い。 もし、高階関数があればこんなコーディングができるかも。
f() { echo -n $1; md5sum $2 }
find . | map_with_index f
fがbashの関数である限り、map_with_indexはbashの関数で書かざるを得ない。 使うのは簡単だけど作るのはちょっと厳しいかな。 もしかしたらもっと強力な言語(RubyとかPythonとか)でbashスクリプトを生成してから 実行するスタイルにするほうがうまく行くかも。 でも、そうするとbashのお手軽さは無くなっちゃうし。うーん。バランスが難しい。
こんなの(Es: A shell with higher-order functions)があるが、新しい言語を実装するのは大袈裟すぎる。 枯れた実装系であるbashをそのまま使いたいよね。 できればbashで100から200行程度でできて source でファイルを読みこむだけで使えるものが良い。 [OldType]実装ついでに良いものが出来たら分離してリリースするかも。