[Namazu-users-ja 1205] Re: mknmzのプロトタイプ宣言

Tasamasa Teranishi yw3t-trns @ asahi-net.or.jp
2011年 6月 22日 (水) 21:29:33 JST


寺西です。

Perl のプロトタイプ宣言についてのお話ですが、
言語仕様として結構あいまいなので何が正解かというのは少々難しい
ところがあります。

(2011/06/22 15:03), Shigekazu Aoyagi wrote:
> mknmzのソースを眺めていて、本質的ではないし動作にもおそらく支障はないと
> 思われますが、気になった点がありましたので修正してみました。

2箇所指摘されていますが、それぞれについてコメントさせていた
だきます。

> 修正したものが FreeBSD 8.2-RELEASE の環境で、make check を通ることは確認
> いたしました。

これについては、
makae check で行っているチェックは不十分だということのようです。

> ! sub generate_uri (@) {
>       my ($file, $fragment) = @_;
>       return "" unless defined $file;
...
> ! sub generate_uri ($$) {
>       my ($file, $fragment) = @_;
>       return "" unless defined $file;

generate_uri ですが、これは引数1つで呼び出される時と、引数2つで
呼び出されることがあります。
また generate_uri の中身で判断すると、引数なしで呼び出されること
も想定しています。(引数なしで呼ぶことに意味があるかどうかは別に
して)

このため、($$) だとまずいです。
引数の省略ができるため (;$$) とするか、(@) のままでないと
いけません。

こういう場合、(@) を (;$$) に書き換えて、引数2個で省略が可能だ
ということを明記した方がいいかどうかは Perl の場合ちょっと
不明です。
# 割と (@) を使うことも多いので。

> ! sub trapintr {
>       my ($signame) = @_;
>       print STDERR "Warning: signal $signame occured.\n";
>   }
...
> ! sub trapintr($) {
>       my ($signame) = @_;
>       print STDERR "Warning: signal $signame occured.\n";
>   }

次に trapintr ですが、これはシグナルハンドラです。
シグナルハンドラでは引数が1つと仕様で決まっているので、明記しても
良いのですが、perldoc perlipc で示されている例のように引数を
省いて記述した例が多数存在するため、慣例に従っています。

おそらくシグナルハンドラということで、この関数をユーザが明示的に
呼び出すことはないため、プロトタイプ宣言する意味がほぼなく、
誰も意識していないためではないかと思います。


ということで、

- 現状問題が生じていない
- 修正するメリットが特にない

という理由により、折角なんですが本修正は行わないことにします。

もし、何か不具合があるとか、修正するとこういうメリットがあると
いうことがあればご指摘ください。

以上、よろしくお願いします。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns @ asahi-net.or.jp
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E


Namazu-users-ja メーリングリストの案内