タオルケット体操

サツバツいんたーねっとでゲームとかガジェットのレビューとかをします

Pythonのラムダ辛い問題を解決する暗黙のプレースホルダ

* ネタ元

Rubyのブロックつらい問題を解決する暗黙のブロックパラメータ - Qiita

RubyPythonのブロックラムダつらい問題

Pythonでショートコードをしようとおもうと、時々こういうことが起きます。

map(lambda it: it.upper(), ['foo', 'bar', 'baz'])

それぞれの要素に対してupcaseを適用する、ただそれだけのためにitを2回も記述しなければなりません。っていうかそもそもlambda:って読みにくいです。
Pythonはラムダをあまり使わない言語なのでこの様なコードを書く機会は少ないですが、それでもちょくちょく出番があり、やがてあなたは辟易するはずです。

続きを読む

Haskellの合成演算子 . をPythonで 〜関数合成によるCollection処理の実装

メソッドチェインを利用した関数合成の実現案的な。当然ですが実用性汎用性ともに一切ございません。

事前に用意しておく必要があるので、Haskellでの.みたいな汎用性は一切ないですウワー。ただ、あらかじめ決められたオブジェクトへの関数の合成に応用することは出来るし、案外有用なのでは?

というわけで、世の中に無数にあるLINQ to ObjectのPython移植をつくります。何番煎じだとか言わないでやめて実装がちょっと違うの!
つまり、世の中のLINQ移植の実装をみると、そのほとんどが基本的にラッパーオブジェクトを生成して返すメソッドチェインで実現しています。今回の記事では、関数合成と要素への適用という形で実装してみます。

この時点で、先ほどのcomposableみたいに合成を行う以外に、事前に用意した要素への適用を行う(toListとか、firstとかanyのような IEnumerable -> Uみたいなことを行う系)decoratorも必要になりそうですね。

続きを読む

Pythonでパターンマッチめいたモノを作ってみる with Rubyのブロック渡しっぽい見た目

今回説明するものを実装したソースコードは https://github.com/hachibeeDI/masala/blob/master/masala/match.py で読めます。

Rubyで内部DSL的なものを実現する際の常套手段として、ブロックを使うものがあります。
わかりやすい例としては、RakeやSinatraがありますね。
パターンマッチでいうと、egison/egison-ruby · GitHub とかはそんな感じですね。

パターンマッチもどきを実装する前に

さて、PythonにはSinatraに対応するフレームワークとしてFlaskがあります。Flaskではデコレータを使って、Sinatraのような宣言的な見た目を実現しています。ということは、デコレータを使えばブロックと同じことが出来るわけです(?)。
Pythonといえば、switch文がありません。まぁswitch文なんて別にいらないんですが、Rubyのcase式はちょっと羨ましいです。swiftのswitchも悪くないんですが、やっぱが式がいいですよね? まぁ式じゃなくてもいいんですが、とりあず今や時代は猫も杓子もパターンマッチなので、Pythonにも輸入しましょう。

ただ、Pythonは某神の言語みたいに自分で構文を拡張したりは出来ないので、あり合わせの物を組合せなんとかそれっぽいものを作ります。ぶっちゃけ3番煎じくらいのネタなんですけども、今回の実装は既存のものともかなりかけ離れた感じになったので大目に見てください。

さて、私の作ったmasalaライブラリ内にあるMatchクラス式を使えば、以下のような書き方ができるようになります。

続きを読む