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.santag...@gmail.com> wrote: > On Mon, Jun 29, 2020 at 8:22 PM Richard Hainsworth <rnhainswo...@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....@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 <rnhainswo...@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 >