🦋 Welcome to the former MAIN() IRC channel of the Raku Programming Language (raku.org). This channel has moved to Libera (irc.libera.chat #raku)
Set by lizmat on 23 May 2021.
japhb Normally it's not super-slow. It's responding now again (was timing out for a while for me). It uses an in-memory DB, so maybe the VM was swapping ...? 00:02
melezhik .tell AlexDaniel are latest whateverable commits missing bin/raku? gist.github.com/melezhik/b85595140...a962e90371 00:27
tellable6 melezhik, I'll pass your message to AlexDaniel
AlexDaniel Hmmm maybe 00:53
tellable6 2021-07-19T00:27:37Z #raku <melezhik> AlexDaniel are latest whateverable commits missing bin/raku? gist.github.com/melezhik/b85595140...a962e90371
AlexDaniel So only bin/perl6 and no bin/raku ?
Or .. uhm
Ah, these are failed builds I think 00:54
I see now, sry
You can check the logs, they're present in the tar as well
Sounds like something is wrong on the main branch, if that's what you're seeing for the latest commita 00:55
Commits*
pjscott Hello! Having trouble with latest rakudo. I downloaded rakudo star 2021.04 and built from source for Linux; I then tried installing command line rakudoc from github but raku couldn't find the target of 'use Rakudoc'. It says: 02:49
Could not find Rakudoc in: 02:50
inst#/home/peter/.raku
inst#/home/peter/rakudo/share/perl6/site
inst#/home/peter/rakudo/share/perl6/vendor
inst#/home/peter/rakudo/share/perl6/core
ap#
nqp#
perl5#
But putting Rakudoc.rakumod in that path didn't help. Yet I can 'use DBIish' and it works, but DBIsh.pm6 isn't in that path. 02:51
pjscott I gather it's finding DBIish in some precompiled file, but I still don't know where to put Rakudoc.rakumod. 03:00
I fixed it with by adding a use lib to the rakudoc script but can't help think I missed something basic. 03:07
avuserow if I have a list @a, and want to remove all elements from @a that are in @b, is there a better way than: my $to-remove = @b.Set; @a .= grep({ $_ !(elem) $to-remove}); 03:43
I also need to preserve the ordering of the items in @a.
m: my @a = (1, 2, 3, 4, 5); my @b = (2, 3); my $to-remove = @b.Set; @a .= grep({$_ !(elem) $to-remove}); dd @a 03:45
camelia Array @a = [1, 4, 5]
lucs m: my @a = (1, 2, 3, 4, 5); my @b = (3, 2); say @a (-) @b 03:46
camelia Set(1 4 5)
lucs docs.raku.org/language/operators#i...e_operator 03:47
avuserow hmm, looks nice 03:51
but if I convert back to a list with `.keys`, then the ordering is lost, presumably when it makes the set 03:52
lucs Hmm... Right. Maybe someone else will know. 03:53
avuserow technically I could write it as `@a .= grep({$_ !(elem) @b.Set})` which is very nice and short, but I'd rather have the extra variable than make the extra Sets :) 03:55
raydiak there are many ways to do it, and I'm not sure which is fastest for your case, or which you would consider "better", but here is another with no Set and no intermediate variable: 04:00
m: my @a = 1..5; my @b = 2, 3; @a .= grep: { !@b.first: $_ }; say @a
camelia [1 4 5]
avuserow yeah, I guess I wanted to make sure there wasn't a magic operator that I was overlooking 04:05
or an "inverted grep" (`@a.keep({...})` or something, I dunno) 04:06
raydiak not off the top of my head. inverted grep was something someone else speculated about in recent weeks though, not a bad idea imo 04:07
could use a Junction... 04:10
m: my @a = 1..5; my @b = 2, 3; @a .= grep: none @b; say @a
camelia [1 4 5]
avuserow okay, I guess my original question was thinking of something along the lines of python's `remove(value)` method for a list. but you would have to call it N times
oh yeah, junctions are a good option 04:11
moon-child @a .= grep: &[∊].assuming(*, @b) 04:17
err, should be ∌ 04:18
and get rid of *,
or &[!(cont)] for texans 04:22
avuserow I did some benchmarking just for kicks 04:26
.assuming is way slow
everything else is fairly similar, with `(@a (-) @b).List` being the fastest (if you can live with the randomized ordering) 04:29
but all the other approaches come within 10% of each other, and sometimes it varies which one is fastest (maybe my system is not sufficiently idle to always select a consistent winner) 04:30
moon-child oh my, .assuming is ... slightly disturbing
github.com/rakudo/rakudo/blob/mast...e.pm6#L311 04:31
avuserow surprisingly, creating the Set in advance (like my original approach) is not always better than just doing `@a .= grep: {$_ !(elem) @b}`
though my data is an array of five elements and removing two, so that's on the tiny side
moon-child yeah, hash-type collections are generally slower than arrays at such small sizes. (The flip side, though, is that an std type should know that and use an array representation when it's small enough, so you don't have to worry about that) 04:32
mykhal avuserow: you may realize that even in Python, list comprehension would be better than remove(), where you would have to check presence of en element as well 04:37
avuserow though if I really needed the speed, I would change the backing database structure and just issue a DELETE FROM table WHERE id IN (...)
mykhal m: my @a = 1..5; my @b = 2, 3; say ( $_ unless $_ (elem) @b for @a ; )
camelia (1 4 5)
moon-child avuserow: have you seen red?
avuserow Red scares me :)
okay, it does not scare me. it's too much magic for my application, and it is very cool 04:38
but yes, I've seen a bit of it
Xliff \o 04:44
What's the best way to force GC?
I'd like to test something in a DESTROY
avuserow Xliff: seems like there's nqp::force_gc? or you can look at what Inline::Perl5 does in its tests: github.com/niner/Inline-Perl5/blob...ctor.t#L25 04:51
Xliff avuserow: Thanks! 04:53
Now THAT'S odd. 04:54
When I create an object, I get a different .WHERE than I do when it is reaped in submethod DESTROY! 04:55
moon-child compacted maybe 04:56
Xliff class A { submethod DESTROY { say "D: { self.WHERE }"; }; }; my $a = A.new; say "C: { $a.WHERE }"; $a = Nil; use nqp; nqp::force_gc; my $p = start sleep 3; await $p; say "A: { A.WHERE }" 04:56
m: class A { submethod DESTROY { say "D: { self.WHERE }"; }; }; my $a = A.new; say "C: { $a.WHERE }"; $a = Nil; use nqp; nqp::force_gc; my $p = start sleep 3; await $p; say "A: { A.WHERE }"
camelia C: 139933773097672
D: 139933738761072
A: 77365192
Xliff O_o 04:57
I'
I expected the C and D values to be the same.
HAH! If I use an attribute's WHERE, it works. 05:00
avuserow "Please note that in the Rakudo implementation of Raku, and possibly other implementations, the memory location of an object is NOT fixed for the lifetime of the object." - docs.raku.org/routine/WHERE
Xliff Aaand... it's the same value. Of course. The Attribute object, itself. :/ 05:01
I'm trying to get something instance level.
raydiak I'd hesitate to use DESTROY at all. you can't count on it happening at any certain time (even in the middle of other code running), in any certain order, or even at all (even when the program terminates). beyond that, I'd also strongly avoid relying on underlying VM semantics. is there no clear exit path in your own code that you could use to call your own teardown methods manually? 05:08
even with force_gc it's not guaranteed... 05:12
m: class C { submethod DESTROY { say "DESTROY!"; } }; my $o = C.new; $o = Nil; use nqp; nqp::force_gc();
camelia ( no output )
raydiak m: class C { submethod DESTROY { say "DESTROY!"; } }; my $o = C.new; $o = Nil; use nqp; nqp::force_gc(); sleep 0; # it seems to wait for an idle time to actually run the gc 05:13
camelia DESTROY!
raydiak and none of that is guaranteed not to change tomorrow 05:14
Xliff radiak: Thanks for telling me something I already knew! :) 05:28
And for this use case, I only care that it happens, not WHEN. That's exactly what DESTROY was meant for, yes? 05:29
I only asked about force_gc for testing purposes.
Glad I did. My initial assumption turned out to be wrong. LOL 05:30
raydiak you can count on me to state the obvious :) 05:31
Xliff Haha! I get where you were coming from. You were helpful. That's all that matters. radiak++ 05:32
At any rate, crossed 600kLOC of Raku, today!
See github.com/Xliff/p6-GLib/blob/mast...x?raw=true 05:33
raydiak heh that's quite a lot
but no, I don't believe you can always count on DESTROY running. maybe if you always call force_gc and then something else after it, but if there's a point where you can do that, then you might as well just call your own destructor methods which will always be reliable regardless of underlying VM behavior. that's why I showed that example above of it not running, so you know it won't always be called 05:36
maybe better to at least get input from a more authoratative core dev before relying on it 05:37
afk
Xliff radiak: If it doesn't get called then it doesn't get called. I just need it to make a basic attempt at resource cleanu. 05:41
Without it, I'd leak like a sieve.
And there is NO OTHER METHOD that will work. This is not something for manual methods. 05:42
mykhal this fries CPU and memleaks: t' or '^D' 07:39
eh, sorry, paste issue. correct code: "" ~~ /<.ws>+/
also with * instead of + and/or without . and/or on non-empty string on left 07:46
(not trying to say to m, don't want to hurt camelia) 07:48
SmokeMachine yes, that's an infinite loop, right?! 08:12
it will always find a `<ws>` on "" for ever...
m: say "" ~~ /<ws>/ 08:13
camelia 「」
ws => 「」
SmokeMachine m: say "" ~~ /<ws> ** 10/
camelia 「」
ws => 「」
ws => 「」
ws => 「」
ws => 「」
ws => 「」
ws => 「」
ws => 「」
ws => 「」
ws => 「」
ws => 「」
SmokeMachine m: my token my-ws { \s* }; say "" ~~ /<my-ws> ** 10/ 08:18
camelia 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
my-ws => 「」
SmokeMachine mykhal: it's something like this: ^^ 08:19
it will always find "no space" 08:23
moon-child ways, so the empty string is whitespace? I find that counterintuitive 08:32
SmokeMachine no... 08:35
but <ws> matches 0, 1 or more white spaces, that's matching 0 spaces 08:36
moon-child right
SmokeMachine and because it matches 0 spaces it do not move forward... so it will match for ever... 08:43
mykhal But it's just a pattern. Either should match or not, and not try to match forever 09:41
is perl -e 'print "" =~ /^^/' should also nahg ? 09:43
moon-child what do you think "" ~~ /[.*]*/ should do?
mykhal s/is//; s/nahg/hang/
initiallly i'd think that special meaning would be switched to literary in [] 09:48
mykhal i'll think more afte ma after-vacc sleep 09:50
raydiak imo, a quantified construct matching nothing should only match once in a particular string position. this also seems to be how p5 behaves. that said, not everyone agrees, and this is a known behavior with a closed issue: github.com/rakudo/rakudo/issues/4438 11:06
Geth problem-solving/master: 5 commits pushed by (Daniel Sockwell)++, (Juan Julián Merelo Guervós)++, (Elizabeth Mattijsen)++ 11:17
abraxxa is watching Liz FOSDEM talk on sets. Is there really no ascii equivalent of the negated set operators? 11:19
lizmat !(elem) 11:20
prefix with !
I guess we could consider something like (!elem) 11:21
abraxxa I see, thanks! Junst wondered because you didn't include them in the slides 11:22
lizmat m: sub infix:<(!elem)>(\a,\b) { !(a (elem) b) }; dd 42 (!elem) ^10 11:23
camelia Bool::True
abraxxa why does a union of two arrays not return an array but a set?
I prefer the negation before the operator instead of another operator
lizmat because it is a *set* operator, which always at least returns a Set 11:24
abraxxa is there an operator for joining arrays too?
lizmat define joining ?
abraxxa concatenate
lizmat m: my @a = ^5; my @b = 42,666; @a .= append: @b; dd @a 11:26
camelia Array @a = [0, 1, 2, 3, 4, 42, 666]
abraxxa like append does
lizmat or just .append :-)
abraxxa so no operator, only the method? 11:27
lizmat well, depends... 11:28
abraxxa what Bruce Gray said in his 'Raku, the Big' talk is what I'm thinking since years: there needs to a best practise guide for what way to use when 11:29
why operators when there a methods for all those things? They are just hard to remember, I guess hard to suggest for a text editor and aren't as easy to understand for novices 11:30
what helped me in Perl 5 to remember the sigils when I learned it back then was the explanation why the characters where chosen: like % looks like key / value 11:32
lizmat m: sub infix:<@>(\a,\b) { slip(|a,|b) }; .say for 42,666 @ ^10
camelia 42
666
0
1
2
3
4
5
6
7
8
9
sena_kun I don't think operators are not easy to understand for novices, people are just ok with "5 + 5" and it is far easier to them than "5.add(5)".
abraxxa (|) for union seems weird to me, I would have expected to be (~) because ~ is used to join strings
sena_kun: for mathematics everybody is used to it 11:33
sena_kun I do agree there is a place for the tool and when the syntax complexity goes overboard, that's a bad thing in general
lizmat abraxxa: | is "or", so it indicates elems that are either on left *or* right
abraxxa yes, I was also thinking
lizmat (&) indicates elems that are on both sides, as & is "and"
abraxxa 'or' when I've seen it but couldn't find an explanation as what an or has to do with joining 11:34
lizmat: that explanation absolutely makes sense, thank you! Can it be included in the docs?
lizmat abraxxa: probably, if someone (you?) makes a PR for that? github.com/Raku/doc/pulls 11:41
abraxxa how is the Whatever * different from $_? Your example at 41:47 includes .sort(-*.value), .sort(-$_.value) would also make sense for me as $_ is the topic variable which gets set to each element of the array 14:31
Altreus I'm pretty sure that has to be .sort({-$_.value})
sena_kun abraxxa, `$_` won't work, as it is not a block
abraxxa or asking differently: why was * necessary in addition to $_ for such constructs? 14:32
lizmat what Altreus and sena_kun said :-)
Altreus which is then .sort({ - .value })
* becomes $_ /and makes a block/
FSVO "becomes $_"
I think of it more as "becomes $^a" ... or $^b or whatever Raku thinks makes sense 14:33
abraxxa FSVO?
{} is a pointy block, right? what type is it when you pass -*.value to sort? I guess sort is a multi-sub? 14:34
Altreus for some values of 14:38
There's a WhateverCode I think?
Ah, it's called Whatever-currying docs.raku.org/type/Whatever
> which is actually a Block that can be used wherever Callables are accepted 14:39
abraxxa so each literal text becomes a Whatever object? 14:46
how can I view pod6?
ah, rakudoc needs to be installed separately... 14:48
zef install rakudoc fails tests 14:49
lizmat: docs are hard. I've forked the docs repo. Will add some lines but it will need a review. 14:52
Altreus hah, that's a fun one!
What tests does it even have? :o 14:53
perlbot abraxxa pasted a new file at perl.bot/p/er7c6f - rakudoc test failure 14:56
Altreus looks like /site became /store perhaps? 14:58
ugexe no, tests would not be assuming the directory of the zef cache directory 14:58
(also more importantly is no such directory change has every occured in zef, so that couldnt be what they were doing) 14:59
looks like rakudoc is incorrectly trying to see if modules are installed
in rakudo itself
which it should also not be doing
ugexe in this case the test is written with the assumption the test dependencies are installed, but they dont have to be (they can be, and are, linked via -I/path/to/lib) 15:00
ugexe t/04-compunit.t should be deleted entirely 15:01
Geth doc: abraxxa++ created pull request #3919:
add Set operator character explanations
SmokeMachine m: my &a = *.self; say &a.^name 15:10
camelia WhateverCode
Altreus surely that is not the way you determine whether a module is installed, whether it needs to or not 15:17
lizmat and yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2021/07/19/2021-...uled-to-3/ 15:38
sena_kun lizmat++ 15:39
Altreus a survey! 15:40
But the first question is hard
kind of weirdly worded throughout tbh 15:43
mykhal SmokeMachine, moon-child : maybe there shuld be at least some detection and warning for such infinite regex bombs
lizmat Altreus: you can leave your comments at the end of the survey :-) 15:51
Altreus I saw this, but I couldn't articulate them 15:56
mykhal so is there a reson why Raku should explode on /(.*)*/ and Perl not ? 16:21
Altreus empirically, yes, otherwise it wouldn't 16:23
mykhal i mean SHOULD as in e.g. RFC 16:25
kind of
Altreus like is it defined in such a way that it would do that?
tu m'as posé un colle 16:26
mykhal mr armrer, mr cncn 16:31
Altreus: see several hours above 16:33
melezhik . 17:08
gfldex m: my &b = { … }; my &wc = * - 1 + *; my &p = -> { … }; (&b, &wc, &p)».signature».say; 18:44
camelia (;; $_? is raw = OUTER::<$_>)
(;; $whatevercode_arg_1 is raw, $whatevercode_arg_2 is raw)
()
gfldex abraxxa: ^^^ the main difference between Block, pointy block and WhateverCode is the generates Signature. 18:45
timo twitter.com/DeepSchneider/status/1...6877431811 19:54
lizmat yuck :-) 19:57
gfldex m: constant yES‾wE‾cAN = True; 20:06
camelia 5===SORRY!5=== Error while compiling <tmp>
Missing initializer on constant declaration
at <tmp>:1
------> 3constant yES7⏏5‾wE‾cAN = True;
gfldex :-(
m: constant term:<yES‾wE‾tERM> = True;
camelia ( no output )
gfldex :-) 20:07
Doc_Holliwood any idea why this bugs out? 22:00
m: dd map { .value / .key }, 1 .. * Z=> [\+] 10, 20 ... 90
camelia 5===SORRY!5=== Error while compiling <tmp>
Missing comma after block argument to map
at <tmp>:1
------> 3 / .key }, 1 .. * Z=> [\+] 10, 20 ... 907⏏5<EOL>
expecting any of:
postfix
Doc_Holliwood i can fix it with parens, i just don't see why they are neccessary here 22:01
leont I guess because the whatever consumes the entire expression on the right hand side 22:03
Doc_Holliwood m: dd map { .value / .key }, 1 .. Inf Z=> [\+] 10, 20 ... 90
camelia 5===SORRY!5=== Error while compiling <tmp>
Missing comma after block argument to map
at <tmp>:1
------> 3 .key }, 1 .. Inf Z=> [\+] 10, 20 ... 907⏏5<EOL>
expecting any of:
postfix
Doc_Holliwood nope
leont No, it consumes too much on the left side 22:05
The entire thing is the whatever expression?
Yeah, if you remove the map you just get a whatever expression, so that conclusion must be correct 22:06
No, it's a normal block. I don't know anymore. 22:07
Doc_Holliwood it seems to think the comma belongs to the list 22:45
m: dd map { .value / .key }, foo => bar, 1 .. Inf Z=> [\+] 10, 20 ... 90 22:46
camelia 5===SORRY!5=== Error while compiling <tmp>
Missing comma after block argument to map
at <tmp>:1
------> 3 => bar, 1 .. Inf Z=> [\+] 10, 20 ... 907⏏5<EOL>
expecting any of:
postfix
DocHolliwould attempts installing Comma on the new M1 23:40