🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). This channel is logged for the purpose of keeping a history about its development | evalbot usage: 'm: say 3;' or /msg camelia m: ... | Log inspection is getting closer to beta. If you're a beginner, you can also check out the #raku-beginner channel!
Set by lizmat on 25 August 2021.
Anton Antonov Yesterday I was experimenting with regex extractions from a large set 09:48
of files. I found that using a regex with 3 captions is ~20 slower
than using a version of it with only 1 caption. Is this expected
and/or documented somewhere? E.g. `XMLSearch0` is ~20 times slower than
`XMLSearch1`:
```
my regex XMLSearch0 {
<header>=('<FactData>')
$<data>=(<-[<>]>*)
<ender>=('</FactData>')
}
my regex XMLSearch1 {
moritz_ well, captures do require the regex engine to keep more data around, and there's an overhead to extracting it. I don't know if 20% is reasonable, but it cannot be zero cost 09:53
Anton Antonov @mortiz_ It is not 20% slower, it is 20 times slower. 09:54
Geth raku-mode: fd286b2d1a | (Philip Kaludercic)++ | 2 files
Remove pkg-info dependency
10:00
raku-mode: 20610a83b5 | (Tom Browder)++ (committed using GitHub Web editor) | 2 files
Merge pull request #53 from phikal/master

Remove pkg-info dependency
grondilu raku: class A {}; class B is A {}; say B.bless: A.new 10:32
evalable6 (exit code 1) Too many positionals passed; expected 1 argument but got 2
in block <unit> at /tmp/Y1_TWp4g_f line 1
grondilu I think that used to work
long time ago though
lizmat grondilu: what should that do ? 10:33
bless only takes named parameters 10:34
grondilu couldn't it take an instance too?
and bless it to a Class 10:35
I vaguely recall a similar mechanism in P5
lizmat why not do B.new ?
grondilu well that does not work 10:36
I want to build a new B instance from a A one
lizmat m: class A {}; class B is A {}; say B.new
camelia B.new
dakkar grondilu: in general, "build a subclass instance from a superclass instance" is not a well-defined thing to do 10:37
grondilu Oh I guess I should use a role for B instead 10:38
dakkar probably
lizmat and then use but: docs.raku.org/routine/but 10:39
grondilu yeah that seems sensible
dakkar (if you're coming from perl5, and thinking of the "re-blessing" practice… raku doesn't do that, because it's nasty and there's better ways now)
(and I have perl5 production code that reblesses happily) 10:40
lizmat notable6: weekly 10:51
notable6 lizmat, No notes for “weekly”
grondilu lol I'm digging into some old code and I'm reminded that there used to be a standard module called "MONKEY_TYPING" 10:52
lizmat it's now built in :-) 10:53
grondilu it was to augmont core classes, right? 10:54
*augment
lizmat docs.raku.org/language/pragmas#ind...EY__pragma 10:55
docs.raku.org/syntax/augment
grondilu again I'm pretty sure I should use roles instead 10:56
lizmat yeah, augment is *really* a last resort
as it messes with all sorts of things, and breaks optimizations 10:57
grondilu I think I wrote this code before I knew about roles, or before they were supported
lizmat yeah, that's quite possible
grondilu checks latest commit date 10:58
"30 May 2012"
might as well say prehistory 10:59
this code will need lots of rewriting 11:00
lizmat yeah, pre GLR code might need some close inspection 11:08
grondilu can you remind me what GLR is? Google did not help much. 11:10
Great List Refactor 11:11
I've just recalled 11:12
Altreus clickbait when? 11:16
:)
grondilu on the other hand my Digest library is fairly old too but seems to be running fine : github.com/grondilu/libdigest-perl6 11:18
still I bet I could modernize it though 11:19
like all these .AT-POS calls, are they still needed for better performance? 11:22
lizmat no, they're not 11:23
these will pretty quickly be optimized away
once a process runs for a bit
compare: 11:27
m: my @a = ^1000; for ^10000 { @a[$_] for ^1000 }; say now - INIT now 11:28
camelia 0.375355557
lizmat m: my @a = ^1000; for ^10000 { @a.AT-POS(0) for ^1000 }; say now - INIT now
camelia 0.238405566
lizmat huh?
m: my @a = ^1000; for ^10000 { @a[$_] for ^1000 }; say now - INIT now
camelia 0.375450081
lizmat m: my @a = ^1000; for ^10000 { @a.AT-POS(0) for ^1000 }; say now - INIT now
camelia 0.240822734
lizmat intriguing, I don't see a difference on my MacOS box
m: my @a = ^1000; for ^10000 { @a.AT-POS($_) for ^1000 }; say now - INIT now # fuh 11:29
camelia 0.346554665
lizmat *duh
m: my @a = ^1000; for ^10000 { @a[$_] for ^1000 }; say now - INIT now 11:30
camelia 0.365621664
lizmat m: my @a = ^1000; for ^10000 { @a.AT-POS($_) for ^1000 }; say now - INIT now # fuh
camelia 0.336668571
lizmat m: my int @a = ^1000; for ^10000 { @a[$_] for ^1000 }; say now - INIT now
camelia 0.398720313
lizmat m: my int @a = ^1000; for ^10000 { @a.AT-POS($_) for ^1000 }; say now - INIT now
camelia 0.454114283
lizmat m: my int @a = ^1000; for ^10000 { @a.AT-POS($_) for ^1000 }; say now - INIT now
camelia 0.449291634
lizmat m: my int @a = ^1000; for ^10000 { @a[$_] for ^1000 }; say now - INIT now
camelia 0.376347564
lizmat grondilu: I'd say, stick with postcircumfix [] :-) 11:31
and yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2021/09/13/2021-37-receding/ 11:34
Altreus there it is! 11:36
lizmat yup :-) 11:40
Altreus I like Flavio's blogs
polettix: I like your blogs :D 11:41
The point about "all but the last one" for a slurpy argument is interesting - it immediately makes me think of prolog 11:46
Is raku introspective enough to even have this ability?
lizmat: your first twitter item has the wrong link :) 11:50
moritz_ counting lists from the end is a bad idea if you have lazy lists
Altreus ah yes lazy 11:55
can we have "isn't"?
sub x (List isn't lazy \x)
guifa lizmat++ (you've been pushing these out much earlier these days haha I used to have to wait until the end of work to read them!) 12:55
grondilu degenerate cases are so annoying. Like if I want to turn an integer into a blob8, I can usually write blob8.new: $n.polymod(256 xx *), but that doesn't work for $n == 0 12:58
raku: say blob8.new: 0.polymod(256 xx *) 12:59
m: say blob8.new: 0.polymod(256 xx *) 13:00
camelia Blob[uint8]:0x<>
grondilu Am I supposed to not use polymod for this?
Altreus lizmat: also your first list item of Core Developments appears to have a font colour override 13:34
Util grondilu: polymod is what I would use. I had not thought about that degenerate case; I would use `|| 0` to solve it, but I agree that it is annoying to have to remember to do so. 13:41
m: for 258,42,0 { say Blob.new( .polymod(256 xx *) || 0) } 13:42
camelia Blob:0x<02 01>
Blob:0x<2A>
Blob:0x<00>
Util Now that I think about it, `0.polymod($any_positive_integer)` should return `0`, not the empty list, IMHO.
Maybe this is a bug.
Roast does not test it: github.com/Raku/roast/blob/master/.../polymod.t 13:44
Altreus is there a bot to show docs? 13:46
or, reframed: I'm too lazy to open a new browser tab when I'm already in IRC
when you give polymod a list n xx *, what is the *? 13:53
grondilu Util: I don't think this is a bug. As written in the doc : "The last non-zero value will be the last remainder." 13:55
so if the first value is zero, then you get nothing.
Altreus the "implementation" in the doc also implies that, because it's described in terms of a for loop 13:56
eh, no, wait
the implementation implies you get something because it should iterate over your integer 13:57
m: say 0 mod 10
camelia 0
grondilu though it's a bit confusing, since polymod doesn't only give remainders, but also quotients
Altreus in fact the docs show that if you keep giving it a bunch of things that mod to 0 you still get them: say 120.polymod: 1, 10, 10², 10³, 10⁴; # OUTPUT: «(0 0 12 0 0 0)␤» 13:58
so 0.polymod(list) should give you n+1 zeroes
"The number of remainders will be always one more item than the number of given divisors"
zero shouldn't have any special behaviour at all, as far as I can see
grondilu yes but : "If the divisors are given as a lazy list, runs until the remainder is 0 or the list of divisors is exhausted." 13:59
Altreus ah
but do you get at least one 0?
grondilu nope
Altreus m: say 10.polymod(10 xx *)
camelia (0 1)
Altreus oh
grondilu m: say blob8.new: 0.polymod(256 xx *) 14:00
camelia Blob[uint8]:0x<>
Altreus that's not how maths works
:D
m: say 10.polymod(1 xx *)
camelia (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...)
Altreus !
I've been lied to
grondilu that's not right
or rather, LTA 14:01
also arguably that's a degenerate case too 14:02
Altreus hrm
grondilu .../src/core.c/Real.pm6#L74 14:07
"last if $lazy and not $more;"
when divisor is 1, $more is constant 14:08
Altreus right, div 1 - makes sense 14:10
Except that's not how you check that the remainder is not 0 ;)
I guess it has to be a lazy list *entirely* of 1s 14:11
grondilu I don't think so
Altreus I mean if it's not then it'll end due to the list, so it's a very edge case 14:12
grondilu 1 cannot be a remainder in this case
an infinite list of zeros actually makes some sense 14:13
grondilu it is, however, very much a degenerate case, and maybe the function should fail instoad 14:14
Altreus except that the doc says it should stop
I'll pop an issue in and see what people think
grondilu I think the issue is with the doc, not the function.
Altreus this will give people the option to decide which :) 14:15
grondilu fair point 14:15
Altreus github.com/rakudo/rakudo/issues/4523 :) 14:20
lizmat: perhaps the weekly could also highlight GH issues that turn into discussions? Unless it already does and I've not remembered :) 14:24
moritz_ Altreus: if you notice an issue turning into a weekly-worthy discussion, just write "weekly: " and then the URL to the issue in here. There's a bot that collects those links 14:26
grondilu I think ideally polymod should be written with &infix:mod and some clever FP tricks. Not necesserarily in the core, but as part of the documentation, to clarify what polymod does. 14:34
so that we can better assess what the degenerate cases should be. 14:35
dakkar github.com/rakudo/rakudo/blob/b14d...#L119-L149 it's definitely written using `mod` 14:36
Util Altreus: `256 xx *` is an infinite list of 256, 256, 256.... (Answering the q from 45 minutes ago) 14:38
grondilu Isn't there a way to write it with reduce and zip or something? 14:39
dakkar maybe? /me tries 14:40
Geth raku-mode: 095b8666e3 | (Tom Browder)++ (committed using GitHub Web editor) | CHANGELOG.md
Bump version for PR #59
raku-mode: 155b0b7a4a | (Tom Browder)++ (committed using GitHub Web editor) | CHANGELOG.md
Update CHANGELOG.md
14:41
raku-mode: ef229addc0 | (Tom Browder)++ (committed using GitHub Web editor) | CHANGELOG.md
Update CHANGELOG.md
14:42
raku-mode: eaac071f17 | (Tom Browder)++ (committed using GitHub Web editor) | CHANGELOG.md
Correct PR merge date
14:46
Altreus Util: that's what I thought, but the docs say it can't be infinite! 14:56
grondilu: the docs *do* show it in terms of mod and div= 14:57
from which one would expect 0.polymod(anything) would return a single 0
Util grondilu, dakkar: This is the closest I got to zip/reduce. AFK now. 14:58
m: say 3 + 5* 256 + 7*256*256;
camelia 460035
Util m: sub pm ($acc is copy) {return (256 xx *).produce({ sink $^a; my $x = $acc mod $^b; $acc div= $^b; last if !$x; $x; }).skip.head(12); }; say pm(460035);
camelia (3 5 7) 14:59
dakkar the gather/for/take way is clearer to me
(especially the way it's written for Real; the Int one is essentially the same but split in lazy/not-lazy maybe for performance reasons) 15:00
Altreus the gather/take for Int also fails to stop at the documented time 15:04
dakkar the docs are wrong ☺ 15:05
Altreus well it should be documented that they're wrong ;)
dakkar (roast says so: `is 86400.polymod(60), (0,1440)`
Altreus I meant that a lazy list should stop when the mod is zero 15:07
dakkar yes, sorry, wrong line 15:08
github.com/Raku/roast/blob/master/...ymod.t#L11
Altreus oh but wait that means the doc was right 15:09
which means the infinite-ones behaviour is wrong :)
I note that zero is not part of that list
the output I mean
dakkar sure is, it's the first element 15:10
Altreus ah it's the first part, not the last
dakkar 123456780 mod 10 == 0
Altreus hmm 15:11
my brain is failing to grasp at a point related to this "base conversion" example in the docs 15:12
But it's along the lines of, if you can use polymod to do a base conversion it stands to reason it should be able to return multiple zeroes in a row 15:13
yes
m: say 65.polymod(2 xx *)
camelia (1 0 0 0 0 0 1)
dakkar yes 15:14
Altreus ^ polymod cannot possibly stop when it gets a zero in a lazy list
I'll add it to my issue
oh it has been noted
dakkar and I've added the link to roast 15:15
re: infinite list of 1s, the current behavious looks good to me
(base-1 is a degenerate case and should not be catered to) 15:16
otoh, `0.polymod(@anything)` should probably return `(0,)` instead of `()`… 15:17
Altreus yes, with an example of returning multiple zeroes in a row it's clear the docs are misworded
my maths brain doesn't come up with such conclusions as quickly as people more knee-deep in the knowledge!
dakkar that's why there's more than one person building this whole thing 😁
Altreus oh I thought it was entirely jnthn 15:34
melezhik . 17:21
Altreus . 17:26
melezhik when I upload my module to zef should I remove (eventually) it from PAUSE index? 18:34
I have 2 Sparky listed now on rakuland - raku.land/?q=Sparky which is confusing ...
tonyo melezhik: if you'd like to. there's been a lot of discussion on how to de-dupe (or whether to) in #raku-land 18:55
it seems like it shouldn't be on the consumer side to dedupe but up to the author on how they're presented because they are _technically_ different dists
El_Che you "technically" won :) 19:16
tonyo technically is the best kind of ally 19:17
El_Che it's like winning a boxing match by points
just playing with words here, technically not making a point 19:18
melezhik tonyo , i see, thanks. i will probably remove my old versions from pause then ... 21:03
Xliff Is there a MetaModel call that can find a method candidate if given a capture? 22:12
Ah! Cando