2012年10月04日

Perl 初心者なので、うっかりはまったので質問してみたら理解力深まったので open & share します。

17:33 < acotie> sub html_builder (&){}
17:33 < acotie> my $x = sub {};
17:33 < acotie> html_builder $x;
17:34 < acotie> これで Type of arg 1 to main::html_builder must be block or sub {} (not private variable) 
17:34 < acotie> て怒られない方法あった気がしたのに忘れたくらい初心者です
17:35 < jox__> html_builder \&{$x};
17:35 < jox__> or &html_builder($x)
17:37 < acotie> おおー
17:37 < acotie> ああー & つけるんだった
17:37 < acotie> あざっす!
17:38 < acotie> & 付ければ protoype 効かないのはバグじゃないんだよね
17:39 < jox__> umu
17:39 < jox__> Perl4との互換性のためですね!
17:39 < tokuhirom> ww
17:39 < acotie> あざっすあざっす!
17:39 < jox__> ぼくは html_builder(\&{$x}) のほうが好きだけど!
17:40 < jox__> てかひろむにきけばいいのにw
17:40 < tokuhirom> w
17:40 < tokuhirom> \&{$x} の方がなにしたいかわからんなw
17:40 < jox__> まあねえ…
17:40 < jox__> うーむw
17:40 < jox__> ぼくにはわかります!
17:40 < acotie> あるぇってなりそう
17:40 < tokuhirom> というか現時点で、今どういう読み方するのかよくわかってないw
17:41 < jox__> (&) prototypeはサブルーチンリファレンスも受け付けるのです。
17:41 < acotie> やりたい事はわかるけど、わかんないw
17:41 < jox__> つまり html_builder(\&hoge) は valid.
17:41 < jox__> で、これはあくまでも構文上の問題なので、適当に構文をあわせてやればパーサが納得してくれるというわけ。
17:42 < acotie> サブルーチンリファレンス と コードリファレンス の違いすら分かってない Perl 初心者です!
17:42 < jox__> 同じです!
17:42 < acotie> w
17:42 < acotie> あとでググれるようにブログにろぐのっけといていいですか//
17:42 < jox__> 重箱の隅突くの(・A・)イクナイ!!
17:42 < jox__> どうぞ!
17:42 < acotie> あざす
17:42 < acotie> や、つついてないw
17:43 < jox__> ><
17:43 < acotie> サブルーチンリファレンス 受け付けるけど コードリファレンス 受け付けて無いじゃんw
17:43 < acotie> Perl ってそういうとこあるよねって納得したからいいや!
17:44 < jox__> や、構文の問題で、パーサにとってコードリファレンス(=サブルーチンリファレンス)に見えるかどうかが問題なのです。
17:44 < acotie> なるほどね
17:44 < acotie> $code だと、じっさい動かさないとわからん!ってことね
17:44 < jox__> sousou
17:44 < acotie> かしこさ 1 あがった
17:45 < acotie> &$code する事により、パーサは $code がサブルーチンなんだなって認識して、その上でリファレンスに渡し直す。と
17:45 < gfx__> (\@) とかもそうで、sub hoge(\@); とかすると hoge($value) ははじいて hoge(\@{$hoge}) と書かなきゃならない。 
17:46 < acotie> であるならば \&$code にしたほうが正しいな
17:46 < cho45> そうなんだ!
17:46 < jox__> でしょ!
17:46 < acotie> コメント付きでかかないと後続だれもわからんから、それだけかかなきゃいけないw
17:46 < jox__> ><
17:46 < acotie> いがいとログのびたw

まとめるとプロトタイプ付きの関数を呼ぶ時にプロトタイプ宣言うざいのを回避する方法として &foo($code) みたいに呼ぶとかやれるんですが(Perl4 の後方互換性のため)せっかく型指定されてるので、それをわざわざ回避せずにパーサにコードリファレンスだと明示的に知らせる事が出来る foo(\&$code ) みたいな呼び出し方が正しいという事ですね。

ただ、 \&$code / \&{ $code } とか書かれてもやってる意図が伝わりにくいので、そういうコードを書く時には、こちらのエントリをコメントに添えて実装すると捗りますね。

Posted by Yappo at 2012年10月04日 17:51 | TrackBack | Perl
Comments
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。