tokuhirom's Blog

perl5 でファンクションプロトタイプをつかっちゃいけない理由と使われる理由。

Damian Conway の Perl Best Practice は関数プロトタイプを非推奨扱いにしているが、一方で巷の Perl Hackers はこれを使いまくっている。このような状況が初心者を混乱させているのではないかと思い、解説することにした。

function prototype を Damian Conway の Perl Best Practice が非推奨扱いにしている理由は以下のような点だ。

Prototypes do not work on methods.
Prototypes do not work on function references.
Calling a function with a leading & (&foo) disables prototypes. But you shouldn't be calling functions like that.

要するに、function prototype は「Validationとして信頼して使用することができない」ということである。まったくもってそのとおり。

だが一方で、近年 function prototype は perl hackers によって、頻繁に利用されている。
function prototype は、「perl5 の構文解析器にたいしてヒントをあたえる」という機能があるからだ。

sub x (&) { }

のように書くと、「x の第一引数には関数リファレンスがはいってくることが期待されている」というヒントが Perl5 の構文解析器に伝わるので、'x' というキーワードの後につづく関数リファレンスにおいてキーワード sub を省略し、

x { };

のように書くことができるようになる。

同様に、

sub CONST () { 1 }

のように、引数がないということを示してあげた場合、この関数には引数がないということがわかるので、& や () をつけなくても、いいケースが増える。

引数の数を指定することにより、解釈の具合を調整することができるので、DSL を設計する場合には必要不可欠な機能となる。

まとめ

function prototype は

  • バリデーション用途に使用するのはオススメできない(ref. PBP)
  • DSLを設計するために構文解析器にヒントをあたえる目的に利用するのはかまわない

ということである。