Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

現状のサブルーチンシグネチャは、Perlの柔軟性を壊してしまう

現在Perl 5.26において、実験的に実装されている、サブルーチンシグネチャの機能。これは、Perlで、引数を普通に書けるようになる機能なのだけれど、僕は、ひとつ問題点を感じている。

サブルーチンシグネチャは以下のように書けるのだけれど、現状のサブルーチンシグネチャは、引数の個数を限定してしまう。

sub foo ($arg1, $arg2) {

}

このサブルーチン定義は、引数の個数が2個でない場合は、エラーになってしまう。

それでいいじゃないかと思うかもしれない。けれども、このサブルーチンの引数の個数を、後で変更したくなる場合がある。それは、以下のようにだ。

sub foo ($arg1, $arg2, $arg3) {

}

すると、どうなるだろう。引数が2個で、呼び出されていたサブルーチンの部分は、すべて、エラーで落ちてしまうのである。

後で、引数を追加しても、元のソースコードの変更が不可欠ではないというPerlの柔軟性が損なわれてしまう。

もしそうであるなら、いつもの方法で、定義しておいた方が柔軟ということになる。

sub foo ($arg1, $arg2) {
  my ($arg1, $arg2) = @_;
}

これならば、$arg3を追加したときの変更にも、fooを引数2個で呼び出している部分を、修正する必要がない。

このように、現状のサブルーチンシグネチャは、Perlの柔軟性を壊してしまう。そして、@_を使う方法と互換性がないので、混乱を引き起こしてしまう。

引数の個数チェックはデフォルトではなくてもよい

引数の個数チェックの機能は、一見すると便利に見えるけれど、もともとのPerlの柔軟な設計と相性が悪い。もし、デフォルトで有効にしてしまうと、Perlの柔軟な部分が減ってしまい、簡単に引数の追加ができなくなってしまう。少しの便利さと引き換えに、Perlの大きな利点を失ってしまう。

だから、引数の個数チェックは、デフォルトではないほうがよいのではないかと考えている。デフォルトのサブルーチンシグネチャは、@_を受け取るときと互換があるものにして、つまり

my ($arg1, $arg2) = @_;

と互換性があるものにする。単なるシンタックスシュガーにする。そして、引数チェックの機能が必要であるならば、追加機能をモジュールで実現できるように設計しておく。

  1. デフォルトではサブルーチンシグネチャを「my ($arg1, $arg2) = @_;」のシンタックスシュガーにする
  2. 引数の個数や型のチェックが必要な人のために、追加機能をモジュールで実現できるように設計する

現状のサブルーチンシグネチャは、そのままでは、Perlの柔軟性が壊れてしまうので、上のようなものが、入るのが希望だ。

ご意見