包丁一本さらしに巻いて

プラグマティック関数プログラミング

実際の作業で「あるディレクトリ配下の全てのファイルのフルパス、ファイル名、タイムスタンプ(yyyymmddhhmmss)、ファイルサイズをタブ区切りにしてファイルに書き出せ。ちなみにあるディレクトリには数百ファイルあるぴょん。」というフザケたものがあった。

無理。

面倒くさすぎて無理。「面倒くさいことをしないためにはどんな面倒くさいこともする」っちゅー格言にしたがい、自分はスクリプトで何とかしようと考えた。一応完成してちゃんとやりたいことやってくれるようになってから試しにググってみたら、こんなものが見つかった。

関数プログラミング的シェルスクリプト

おおおおおお。シェルでも関数プログラミング的に書けるんだ。

#! /bin/bash

function rec {
    for FILE in `ls ${2}`
        do
           local FULL=${2}/${FILE}
           if [ -f $FULL ]; then $1 $FULL
           elif [ -d $FULL ]; then rec $1 $FULL
           fi
        done
}

rec $1 `pwd`/${2}

これを読んで一人感動した。関数プログラミングをもう少し深く理解した気分になった。上のスクリプトが言っているのは「二つ目の引数で与えられたディレクトリ以下のファイルにほげほげしろ」ってこと。この「ほげほげ」って部分が第一引数になる。「二つ目の引数で与えられたディレクトリ以下のファイルにほげほげしろ」っていう指示は抽象的である。抽象的であるが故に「ほげほげ」の部分を自由に組み替えることができる。それはつまり、拡張性・再利用性が高いってことだ。「関数プログラミングは拡張性・再利用性の高いものが書きやすい」ってのをほんの少し(たぶん自分が思っているよりもだいぶほんの少し)体感した気がする。

いいこと学んだ!