in reply to Re^5: Distinguish between missing and undefined arguments with subroutine signatures (slurpy parameter)
in thread Distinguish between missing and undefined arguments with subroutine signatures

Using a slurpy parameter @settings will solve this and fits much better into your use-case.

Sadly, it does not. I already considered this. It does not prevent the sub from being called with more arguments than allowed.

Greetings,
-jo

$gryYup$d0ylprbpriprrYpkJl2xyl~rzg??P~5lp2hyl0p$
  • Comment on Re^6: Distinguish between missing and undefined arguments with subroutine signatures (semipredicate problem)

Replies are listed 'Best First'.
Re^7: Distinguish between missing and undefined arguments with subroutine signatures (semipredicate problem)
by LanX (Saint) on Dec 27, 2020 at 21:21 UTC
    > It does not prevent the sub from being called with more arguments than allowed.

    hmm ... you are going to extremes now. :)

    so

    ->mutate(FIELD) is a getter for FIELD

    ->mutate(FIELD,VALUE) is a setter for FIELD

    ->mutate(FILED,VALUE,OTHER...) shouldn't compile

    I think, in this particular case you can still apply a prototype of ($;$) together with the signature ($field,@values)

    At least theoretically, not sure if it's still implemented that way.

    UPDATE

    well not with methods, see other post:

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

Re^7: Distinguish between missing and undefined arguments with subroutine signatures (methods with signatures?)
by LanX (Saint) on Dec 27, 2020 at 21:39 UTC
    > It does not prevent the sub from being called with more arguments than allowed.

    Wait a second....

    If you are talking about compile-time checking a ->method I'm pretty sure that this can't be done in dynamically typed languages like Perl.

    Like with prototypes I expect this only to be possible with normal subs. ( without static typing of the $obj it's impossible to tell which ->methods are allowed, normal subs OTOH can be pre-declared.)

    And when doing a dynamic check at run-time, using a @slurpy array is just good enough.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      If you are talking about compile-time checking ...

      No, I'm not talking about compile-time checking. I want method call checking at runtime. My sig_lexical example does what I want, but I'm not sure if this is a legal usage.

      Greetings,
      -jo

      $gryYup$d0ylprbpriprrYpkJl2xyl~rzg??P~5lp2hyl0p$
        > I want method call checking at runtime

        I can't follow anymore.

        You want 1 argument for a setter, and 0 arguments for a getter.

        Hence you need a conditional check anyway.

        So use a @slurpy parameter and check the size at runtime.

        Then die "too many arguments" if @slurpy > 1

        Problem solved.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery