kiyokaのブログアーカイブ

Archive of old blog posts

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]実装ついでに良いものが出来たら分離してリリースするかも。