tailgate I have a list(@Bits) of a class I created, BitString::BitString which has the operator ~ overriden. It's been working fine until I tried 00:00
my $result = @Bits.reduce(&infix:<~>)
this only works when 2 BitStrings are in the list. If I have 3, instead of returning a BitString, it returns BitString::BitString<140428016216096>BitString::BitString<140428016216136>BitString::BitString<140428016216176>
However, the code
my $result = BitString.new(value => "" );
for @Bits {
$result ~= $_
}
gets the expected result no matter how many BitStrings are in the list. What am I doing wrong?
00:03 discord-raku-bot left, discord-raku-bot joined
gfldex What does your custom ~ return? 00:15
tailgate BitString
guifa can confirm. reduce is, for some reason, using GLOBAL::infix:<~> rather than the LEXICAL::infix:<~> that was passed 00:37
gfldex Defining a new proto will help with that but will also hide all the other candidates for the operator in question. 00:38
guifa m: class A { has $.v }; multi sub infix:<~> (A $x, A $y) { say "CUSTOM"; A.new: v => $x.v + $y.v }; my @l = do A.new(v => $_) for ^3; say @l.reduce(&infix:<~>);
camelia A<3419364252112>A<3419364252192>A<3419364252232>
gfldex m: class A { has $.v }; multi sub infix:<~> (A $x, A $y) { say "CUSTOM"; A.new: v => $x.v + $y.v }; my @l = do A.new(v => $_) for ^3; say @l.reduce(&infix:<~>); 00:39
camelia A<4262385801680>A<4262385801760>A<4262385801800>
guifa I'm curious why the global one is passed. If we're passing it, the lexical one should absolutely be visible
(in the reduce subroutine, I mean)
gfldex m: class A { has $.v }; proto sub infix:<~>(|){}multi sub infix:<~> (A $x, A $y) { say "CUSTOM"; A.new: v => $x.v + $y.v }; my @l = do A.new(v => $_) for ^3; say @l.reduce(&infix:<~>);
camelia ===SORRY!=== Error while compiling <tmp>
Strange text after block (missing semicolon or comma?)
at <tmp>:1
------> A { has $.v }; proto sub infix:<~>(|){}⏏multi sub infix:<~> (A $x, A $y) { say "
expecting any of:
gfldex m: class A { has $.v }; proto sub infix:<~>(|){*}; multi sub infix:<~> (A $x, A $y) { say "CUSTOM"; A.new: v => $x.v + $y.v }; my @l = do A.new(v => $_) for ^3; say @l.reduce(&infix:<~>); 00:40
camelia CUSTOM
CUSTOM
A.new(v => 3)
gfldex guifa: .reduce is rather elaborate. github.com/rakudo/rakudo/blob/mast....pm6#L1832
guifa aha 00:41
It's trying to be fancy
but the find should probably check whether it's identical or not
gfldex And I believe when it comes to metaops there is some caching involved. 00:42
guifa still wishes multi sub GLOBAL::infix:<~>(Foo, Foo) { … } worked haha 00:46
gfldex @tailgate#1731 You are missing a candidate. see: github.com/rakudo/rakudo/blob/mast....pm6#L1388 00:48
(i hope)
tailgate what is a candidate? 00:50
gfldex You need 2 multi candidates to make metaops and thus .reduce work. See the implementation of Blob. 00:52
guifa m: class A { has $.v }; multi sub infix:<~> (A $x) { A.new: v => 0 }; multi sub infix:<~> (A $x, A $y) { A.new: v => $x.v + $y.v }; my @l = do A.new(v => $_) for ^3; say @l.reduce(&infix:<~>); 01:05
camelia A<3996232047056>A<3996232047136>A<3996232047176>
04:30 frost joined 05:49 frost left 08:34 dakkar joined 09:43 dakkar left 12:41 frost joined 13:10 frost left 13:28 frost joined 13:48 discord-raku-bot left 13:51 discord-raku-bot joined 14:29 frost left 14:45 frost joined 14:55 getimiskon joined
getimiskon Hello. I have encountered a weird issue. In my code I use the MAIN routine with a couple of variables, which will be used as arguments. I declared these variables outside of MAIN. While I have given a value, that value seem to work only inside MAIN, and not in other subroutines in which that value is needed to function. I couldn't find anything about it in the documentation. 15:12
MasterDuke can you post a gist with an example? 15:21
getimiskon of course
do you want the part of the code that has the issue, or the whole script? 15:22
MasterDuke heh, depends on the size
getimiskon it's the whole script has less than 100 LOC 15:23
MasterDuke sure, post it
15:25 frost left
getimiskon gist.github.com/getimiskon/a5e68f6...678bacdd66 15:26
here it is
I have the problem I mentioned when the playVideo subroutine runs. But if I add the line "$resolution=[value]" at the beginning of the subroutine, it seems to work just fine. 15:29
MasterDuke hm 15:31
interesting. because $video_link is correct in playVideo 15:33
getimiskon I know
I'm not sure about what's the problem in this case
MasterDuke so this does appear to be a bug. maybe because MAIN is a bit special something is going wrong 15:38
getimiskon I see
MasterDuke well, it seems to have always been that way gist.github.com/Whateverable/f7bc9...3f0350cce2 15:47
mind creating an issue? github.com/rakudo/rakudo/issues/new 15:48
getimiskon ok 15:52
MasterDuke thanks 16:07
gfldex getimiskon: declaring $resolution in MAIN's signature shadows the global $resolution. playVideo referes to global $resolution. You can solve that with a dynvar or by moving playVideo into MAIN. 19:24
getimiskon I see. It seems to work like that. 19:33
gfldex If you wanna be fancy, you could try `use dynamic-scope <$resolution>`. 19:45
getimiskon I'll keep that in mind. It's still weird why one of the variables didn't have that issue. 19:51
stevied I seem to recall that it's possible to change the value of an argument in the signature. Is this possible or am I misremembering? Can't find any documenation. 20:37
gfldex m: sub subby($a is rw where { $a = 42 } ) { say $a }; subby my $cont = 'answer'; 20:41
Only evil ppl are allowed to do so ofc.
stevied Thanks. i'm trying to subtract one from the argument: 20:45
`Int $begin is rw where { --$begin }`
just get errors, though
gfldex $begin has to be a container supplied by the caller.
stevied oh, ok
gfldex m: sub subby($a is copy where { $a++ } ) { say $a }; subby 41;
unless we copy
This is slightly less evil. 20:46
stevied ah, yes. that worked. 20:47
cool
easier to do it in the body of the sub, though 20:49
one more thing: `@list[--$begin..--$end].uc.list;`
getting a cryptic error on this one
nvm, got it. also determined by how args were passed in 20:51
now things are starting to click a lttle
20:53 discord-raku-bot left 20:54 discord-raku-bot joined 22:37 getimiskon left
how do I convert an Array object to a List object? `@list.list` returns a sequence. same with `@list.flat` 23:05
OK, it's `List` not `list`. 2nd time I've made that mistake 23:07
23:16 Esoren joined
Esoren Howdy.  Is this a good place to ask language questions? 23:17
MasterDuke sure. it's getting a bit late though, since a lot of the people are in europe, so you might not get an answer until tomorrow 23:21
gfldex Depends a bit on the language. 23:22
Esoren Thanks.  I'm logged in through the web chat, so if I close this window I won't see replies after I also go to bed.  So my first question is, where is this chat logged so I can read what I've missed?
MasterDuke fyi, you can read logs of the chat here logs.liz.nl/raku-beginner/2022-01-22.html 23:24
Esoren Thank you!  The other first question is hopefully simple.  Let's say I've got a Str in $x.  What's the idiomatic way of determining if I can convert it to an Int?  Or, a method to try to convert it to an Int that fails peacefully if it's not int'able?  I know one way is to just see if it matches `/\d+/`.  I saw online another way is to check 23:25
if `$x.Int !~~ Failure`.  Both of these ways feel kind of janky to me.
(I don't care about int overflows or even negatives.  The input would be a human-countable whole number, or else an unrelated string.) 23:26
MasterDuke m: my $a = "abc"; if try $a.Int { say "a is Intable" }; my $b = "123"; if try $b.Int { say "b is Intable" }   # here's another way 23:27
camelia b is Intable
Esoren Nice, that seems good and short.  I hadn't come cross that try piece yet.  Thanks, let me give it a shot. 23:28
MasterDuke np 23:29
m: my $b = "0"; if try $b.Int { say "b is Intable" }   # this way does have some caveats though 23:30
camelia ( no output )
MasterDuke m: my $b = "0"; with try $b.Int { say "b is Intable" }   # so maybe this is better
camelia b is Intable
Esoren Interesting.  By coincidence, I don't want to deal with zeros either, so the first way works, but I'll need to read up more about with as well. 23:31
MasterDuke it's very like if, but it tests definedness, not truthiness 23:34
Esoren Okay, cool, I like this approach the best. Okay, second question: I'm composing regexes from (trusted) user input. I've got a pile of strings, and I want to conjoin them with &, as if it looked like `my $pattern = '^ ' ~ @patterns.map({"[$_]"}).join(' & ') ~ ' $'`.  That part works well enough.  The problem is that rx/$pattern/ or
rx/<{$pattern}>/ or rx/($pattern)/ all create a regex that re-evaluates $pattern every time it's run.  When running this on a large file, it's super super slow.  But I found a workaround.  If I use `EVAL "rx/$pattern/"` then it's as fast as if I wrote the regex as a literal.  Not an idea workaround but it works well.  What's the proper way to 23:35
do this?
MasterDuke well, first of all <$pattern> is probably what you want 23:38
but yes, i believe that is still going to re-evaluate it every time 23:39
and regexes/grammars are currently the slowest part of raku. so honestly, you're likely best off using EVAL for now 23:40
Esoren ah, so be it then.  Thanks for the answers.
MasterDuke np 23:41