Perl 5.19.9 で実装された signatures の構文をためしてみる
use 5.019009;
use autodie;
use feature 'signatures';
no warnings "experimental::signatures";
package Foo {
sub new($class, $n) {
bless {n=>$n}, $class;
}
sub bar($class, $a) {
$a+3;
}
sub baz($self, $a) {
$self->{n} * $a;
}
}
sub add($left, $right) {
return $left + $right;
}
say add(1,2);
say Foo->bar(4);
say Foo->new(5)->baz(4);
みたいな感じでつかえる。
【追記】
use 5.019009;
use feature 'signatures';
no warnings "experimental::signatures";
use B::Deparse;
sub add($left, $right) { $left + $right }
my $deparse = B::Deparse->new("-p", "-sC");
say $deparse->coderef2text(\&add);
のようにすると、結果が以下のようになり、引数の処理はコードとして生成されていることがわかる。
{
BEGIN {${^WARNING_BITS} = "\020\001\000\000\000P\004\000\000\000\000\000\000U\005"}
use strict;
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'signatures', 'state', 'switch', 'unicode_strings', 'unicode_eval';
no feature 'array_base';
((@_ <= 2) or die('Too many arguments for subroutine'));
((@_ >= 2) or die('Too few arguments for subroutine'));
(my $left = $_[0]);
(my $right = $_[1]);
();
($left + $right);
}
【追記】
なお、この種類のやつは prototype() 関数ではプロトタイプ宣言がとれません。
【追記】
19:41 xaicron____: signatures、deparse で (); って入るのがなぞ
19:42 tokuhirom: それないとこまるよ
19:42 xaicron____: そうなの?
19:42 tokuhirom: sub mattn { my $ossan=shift; }
19:42 tokuhirom: ってなったら
19:42 tokuhirom: $ossan の中身がそのままかえるじゃん
19:42 xaicron____: あーなる
19:42 tokuhirom: sub mattn($ossan) { } に mattn(3) ってして 3 がかえったらおかしい
19:43 xaicron____: こまる!