高階関数(Higher Order Function)と、デコレータの理解メモ

vim_bridge という egg(?) を使用すれば、python で定義した関数を VimScript から直接呼べるらしい

これは Python で定義した関数を デコレータを使用して、Vim の関数として自動的に定義しているから。
コードはすごく短い。
http://github.com/nvie/vim_bridge/blob/master/vim_bridge/__init__.py


そういう訳でデコレータを理解したくなったので,簡単なコードサンプルにまとめてみた。
デコレータっていいんかね? 特定の領域で convention 的に使用するなら分かりやすいんかな。
デコレータ使うともとの関数は隠蔽されちゃう?このへんは追々分かってくるはず。
今回は大体分かったってレベル。

  1. gen_seq_transformer() は 関数 f を引数にとって、新しい関数を返す。
  2. 作られた新しい関数は sequence を引数にとる。引数として与えられた sequence の一つ一つの要素に対し、1で渡された関数 f が適用される。

sequence の要素一つ一つに、特定の関数を適用する、というのはよくあるパターンで、その関数が、upper() だったり、lower() だったりする。
そういう時に高階関数を使用して関数を生成する関数(関数ジェネレータ)を作れば、重複コードを減らし、全体のコード量を減らす事が出来る。
関数ジェネレータで生成した関数を,別の変数にバインドする作業自体も定型作業だから、@hogehoge を関数定義の直前に書けば、単に関数を呼んでも、
「@hogehoge に(@hogehogeの直後に定義した)関数を渡して生成して出来た関数」を呼ぶ事にしましょう、というルールを作った。それがデコレータ。
個人的にはそんな感じの理解。

※ 参考にしたサイト
http://satoshi.blogs.com/life/2009/11/python%E5%85%A5%E9%96%80%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%81%AF.html