develooper Front page | perl.perl5.porters | Postings from January 2022

Re: Discourage @_ in signatured subroutine

Thread Previous | Thread Next
From:
Yuki Kimoto
Date:
January 26, 2022 23:24
Subject:
Re: Discourage @_ in signatured subroutine
Message ID:
CAExogxPvhOMZSJnNe9+qJ2yH8voBX6pSKNnO9VYa_KChq0FsmA@mail.gmail.com
2022-1-26 1:33 Paul "LeoNerd" Evans <leonerd@leonerd.org.uk> wrote:

> On Sun, 16 Jan 2022 15:41:44 +0000
> "Paul \"LeoNerd\" Evans" <leonerd@leonerd.org.uk> wrote:
>
> > I've started a branch to add a discouragement warning when people try
> > to rely on the @_ array inside a signatured sub:
> >
> >   https://github.com/Perl/perl5/pull/19346
>
> This is now ready for review/merge, but I'm suddenly unsure about one
> detail: What should the warning category be?
>
> I've currently put it in a new category called "discouraged", on the
> thought that it is a bit similar to "deprecated" but not quite the same.
>
> I'm suddenly unsure though, whether it would be better for this to have
> its own category - perhaps called "snail" or something? I'm thinking of
> a situation where, if we added other "discouraged" warnings of
> unrelated things, whether someone might have done
>
>   no warnings 'discouraged';
>
> to turn off these ones, then they wouldn't see those others. It perhaps
> might be best for this particular category of problem (use of @_ in
> signatured sub) to have its own warning category, to minimise the risk
> of that collateral damage.
>
> Thoughts?
>
>
 Personally, I can accept that signature subroutines don't use @_ in the
future release.

DaveM and Tony think that non-popurating @_ improves the performance of
signature subroutines.

I don't know the details, however I feel it is right.

If the argument count is needed in signature subroutines, we need to write
an array argument.

  # Current subroutines
  sub id {
    my $self = shift;
    if (@_) {
      $self->{id} = $_[0];
      return $self;
    }
    return $self->{id};
  }

  # Signature subroutines
  sub id ($self, @value) {
    if (@value) {
      $self->{id} = $value[0];
      return $self;
    }
    return $self->{id};
  }

I can accept that Carp::confess doesn't get the information of the
arguments in the stack trace because the performance is more important for
me.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About