tokuhirom's Blog

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____: こまる!