develooper Front page | perl.perl6.users | Postings from July 2020

Re: proto and multi

Thread Previous
From:
William Michels via perl6-users
Date:
July 15, 2020 20:55
Subject:
Re: proto and multi
Message ID:
CAA99HCwXZ9Ap7QuGNuXwiCeYBQ_8O0L=QAgkJoW=MU76wcG=fw@mail.gmail.com
Reviving this thread...

Synopsis: the previous discussion revolved around an error seen with a
whatever-star of the format  "{ * }"  (with spaces around the star). The
error was corrected by removing the spaces to use the whatever-star
"{*}"   format.

So why then does the Raku NativeLibs module say to use the "{ * }" format?
See:

https://github.com/salortiz/NativeLibs

From the ReadMe.md:

use NativeLibs; # This also re-exports NativeCall :DEFAULTS for
conveniencemy $Lib; # To keep the reference
sub some_native_func() is native { * } # Note no library needed
… The rest of your module
INIT {
    # Load the needed library
    without $Lib = NativeLibs::Loader.load('libsomelib.so.4') {
        .fail;
    }
}
…


It seems that some of these tiny differences--such adding a space or
two--could end up being a very off-putting source of frustration for people
who are just starting out (and even for experienced programmers as well).

Best, Bill.

W. Michels, Ph.D.


On Mon, Jun 29, 2020 at 11:32 AM Fernando Santagata <
nando.santagata@gmail.com> wrote:

> On Mon, Jun 29, 2020 at 8:22 PM Richard Hainsworth <rnhainsworth@gmail.com>
> wrote:
>
>> a) I don't understand why the white space matters, but clearly it does.
>> So the token is '{*}' and not braces around a Whatever-star.
>>
> For an explanation see the thread "Playing with protos and phasers" that I
> started here three days ago.
>
> b) Removing the space yields the following response.
>> in string
>> Cannot resolve caller handle(NewClass:D: List:D); none of these
>> signatures match:
>>     (NewClass: Str $s, *%_)
>>     (NewClass: Positional @s, *%_)
>>   in method handle at test.raku line 15
>>   in block <unit> at test.raku line 30
>>
>> Not sure why the List:D is not being matched to Positional. Is the List:D
>> refering to the |c signature capture ??
>>
>> Since 'in string' was printed, one of the methods was reached. Confused.
>>
>> c) Writing out all the code in each method is what I already have. But
>> I'm looking for ways to factor out common code.
>>
>> Regards
>> On 29/06/2020 18:44, Fernando Santagata wrote:
>>
>> After deleting the spaces as suggested, there's a "Positional" too many.
>> I guess you can rewrite that method declaration as
>>
>> multi method handle(@s)
>>
>> or
>>
>> multi method handle(Positional $s)
>>
>> and adjust the method's body.
>>
>> On Mon, Jun 29, 2020 at 7:37 PM yary <not.com@gmail.com> wrote:
>>
>>> It looks like you have spaces in the token { * } can you try it without,
>>> using this {*} instead?
>>>
>>> On Mon, Jun 29, 2020, 1:29 PM Richard Hainsworth <rnhainsworth@gmail.com>
>>> wrote:
>>>
>>>> I have several multi methods.
>>>>
>>>> All of them have the same first statement, then differ depending on the
>>>> signature.
>>>>
>>>> proto seems to be a way to factor out the common statement, and there
>>>> is a phrase in the Documentation that * can affect the dispatch, viz:
>>>>
>>>> "You can give the proto a function body, and place the {*} where you
>>>> want the dispatch to be done. This can be useful when you have a "hole" in
>>>> your routine that gives it different behavior depending on the arguments
>>>> given:"
>>>>
>>>> The docs give and example proto, but unfortunately, not how this works
>>>> with other multi's.
>>>>
>>>> So  I tried this:
>>>>
>>>> class NewClass {
>>>>     has $.debug is rw = False;
>>>>     has $.value is rw = 'Initial value';
>>>>
>>>>     proto method handle( |c ) {
>>>>         note "value is $.value" if $.debug;
>>>>         { * }    }
>>>>     multi method handle(Str $s) {
>>>>         $.value = $s;
>>>>         say 'in string'    }
>>>>     multi method handle(Positional @s) {
>>>>         $.value = @s[0];
>>>>         say 'in positional'    }
>>>> }
>>>> my NewClass $x .= new;
>>>> $x.handle('hello world');$x.handle(<hello world>);$x.debug = True;$x.handle('hello world');$x.handle(<hello world>);
>>>>
>>>> #raku test.raku
>>>> #value is Initial value
>>>> #value is Initial value
>>>>
>>>> I am wondering how to use proto and {*}
>>>>
>>>>
>>
>> --
>> Fernando Santagata
>>
>>
>
> --
> Fernando Santagata
>

Thread Previous


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