monad pipeline on xonsh

pythonを利用される方に大変便利なシェル xonsh と、以前の記事で紹介したモナドを利用して、シェルパイプライン処理の記述を紹介したいと思います。 

まず、公式ページ等を参考に、各環境にxonshをインストールしていただきたいと思います。これによって、シェルのコマンドプロンプト上でpythonコードを実行できるようです。

そして、xonsh は、他シェルと同じように、起動時に~/.xonshrcを実行するようです。
ここで、pymonadを利用してパイプライン処理を行えるように、以下のような.xonshrcを用意いました。
予め、toolz, pymonad が環境にインストールされているものとします。

~/.xonshrc に上記を記述し、xonshを再起動、または

で、再読み込みします。

ここから、Eitherモナドによる、シェルコマンドラインでのパイプラインを書いてみようと思います。

まず、xonshの大変便利な機能に、シェル実行コマンド結果をpython文字列とする記述 $(シェルコマンド)があります。

python文字列ですので、メソッドが呼べます

こうなれば、pythonの世界でmapやfilter等の高階関数等、馴染んだpythonスクリプトの処理を行いやすいと思います。ここでは、簡単なcsvファイルの処理でパイプライン処理例を紹介したいと思います。

なぜこの例を持ち出したかというと、以前私はcsvファイルの処理をシェルコマンドラインでやろうとして、1ライナーで記述するのに難しく、断念した思い出があるからです。

例えば、以下のような内容のtest.csvがあったとします。

これを上記.xonsh内で定義した関数を用いてみると、

となります。 関数spはEitherモナドを返す関数ですので、.value を付けない場合、

のような結果が返ってきます。
この状況を想定して、値を見るための関数epを定義しています。

と、値の表示の後に、Rightオブジェクトを返します。 最後のRightオブジェクトによって、パイプラインをつなげていけます。

リスト各要素を評価して、値を計算してみましょう。

map処理はlist等を適用することで実際に評価され、各評価結果がリストに入ります。これを行わせるためelsを結合しています。

各行の結果をすべて足した結果は、以下のように記述できます。

今回はxonshと、このシェルコマンド上でワンライナーでパイプライン処理していく例を紹介させていただきました。

“monad pipeline on xonsh” への1件の返信

コメントは受け付けていません。