This channel is intended for people just starting with the Raku Programming Language ( Logs are available at
Set by lizmat on 8 June 2022.
00:03 Kaipei left, Kaipei joined 00:06 kjp left
stevied how can I turn this into a one-liner? 00:41
method topics() {
my @topics; { @topics.push(.name) if .depth == 1 };
return @topics;
ok, got it `map( { .name if .depth == 1 }, @.directories)` 01:10
01:11 frost joined
or ` { .name if .depth == 1 };` 01:11
guifa why not use grep? 01:15
stevied I couldn't figure it out
guifa @.directories.grep(*.depth == 1).map: *.name
also, any reason you're using method access rather than direct attribute access? (not necessary wrong, but it's not common, so I'm curious) 01:16
stevied i'm calling the method from a test file 01:19
seems a little more elegant without grep, actually 01:30
when I was trying grep, I was trying to use with the hyper operator. that was my problem 01:31
04:32 kjp joined 07:02 dakkar joined 10:01 frost left 10:22 lizmat_ joined 10:26 lizmat left, lizmat_ is now known as lizmat 10:44 Nemokosch joined 10:56 frost joined 11:10 discord-raku-bot left, discord-raku-bot joined
I've got this method calls: `method resource-exists(Str:D $path)` 11:17
I want to check that the $path starts with a certain directory. if it doesn't, I want to modify it before it gets used by the method. is this possible? 11:19
SmokeMachine `Str:D $path is copy`? 11:20
stevied it's not set up as `is copy` no 11:23
what can that get me?
lizmat that you can modify it 11:25
m: sub a($a is copy) { $a = 42; say $a }; a 666
camelia 42
stevied right, but what does it get me in relation to my problem of wanting to modify the argument before it's used by the method? 11:27
lizmat m: sub a($a is copy) { $a = 42 if $a == 666 }; a 666; a 314 11:28
camelia ( no output )
stevied might this be what a callable is for? I have never used a callable argument before.
SmokeMachine staved: it let you modify the argument received by the method. I've probably misunderstood something...
lizmat m: sub a($a is copy) { $a = 42 if $a == 666; say $a }; a 666; a 314
camelia 42
stevied yeah, but is there a way to modify the argument without putting that logic inside of the method? 11:29
like, I want to run a little subroutine to do the argument checking, is what I guess I mean 11:30
lizmat well, you could make it a multi
m: multi sub a(666) { a 42 }; multi sub a($a) { say $a }; a 666; a 314 11:31
camelia 42
stevied I want to test if `$path` starts with `blah/` and if it doesn't, then tack on `blah/` to the front
lizmat m: multi sub a($a where *.starts-with("blah/") ) { say $a }; multi sub a($a) { a "blah/$a" }; a "blah/foo"; a "bar" 11:34
camelia blah/foo
SmokeMachine m: multi bla($path where *.starts-with: "bla/") { bla "somewhere/else/" }; multi bla($path) { say $path }; bla "bla/qwer"; bla "ble/qwer" 11:35
camelia somewhere/else/
SmokeMachine m: multi bla($path where *.starts-with: "bla/") { callwith "somewhere/else/" }; multi bla($path) { say $path }; bla "bla/qwer"; bla "ble/qwer"
camelia somewhere/else/
stevied I guess that works. might get a little mess with a bunch of multis for each of my methods that use `$path` 11:37
i guess I'll just remember to put a little path-check() method in the body of each method. 11:39
i'll use multi for the `path-check` sub 11:42
SmokeMachine stevied: maybe you could do something like this: 11:48
m: multi trait_mod:<is>(Routine $ref, Bool :$path-checked) { $ref.wrap: -> $path, |c { do if $path.starts-with: "bla/" { callwith "other/path", |c } else { callsame } } }; sub do-something-with-path($path) is path-checked { say $path }; do-something-with-path "bla/ble"; do-something-with-path "ble/bli"
camelia other/path
stevied that's hard to read in discord. it's all on one line. can you put that in a paste bin or something, please? 11:50
SmokeMachine m: 11:53
camelia ===SORRY!=== Error while compiling <tmp>
Two terms in a row across lines (missing semicolon or comma?)
at <tmp>:21
------> do-something-with-path "ble/bli"⏏<EOL>
expecting any of:
infix stopper
Nemokosch dw it's hard to read in IRC as well
SmokeMachine m: 11:54
camelia other/path
something else: other/path
something else: ble/bli
stevied taht's super cool 11:55
SmokeMachine (sorry, missing `;`)
11:58 discord-raku-bot left, Nemokosch left, discord-raku-bot joined
stevied ok, I knew nothing about traits: 11:58
SmokeMachine stevied: I think that would work even better it $path was named instead of positional... 12:02
stevied i'm running into one small problem. the trait_mod method can't seem to get access to the `self.root` attribute in the class it's being used in
12:05 discord-raku-bot left, discord-raku-bot joined 12:06 jgaz joined
ok, running into issues. the `trait-mod` sub is inside a class. so the first arg is the invocant 12:17
here's the error I get: 12:23
No such method 'starts-with' for invocant of type
in block at /Users/stevedondley/git_repos/raku/modules/Doc-Examples/lib/Doc/Resources.rakumod (Doc::Resources) line 44
in block <unit> at /Users/stevedondley/git_repos/raku/modules/Doc-Examples/t/03-resources.rakutest line 12
13:15 jgaz left 13:25 lizmat_ joined 13:27 lizmat left 13:32 lizmat_ is now known as lizmat 14:07 frost left
ok, managed to figure out how to do a trait_mod to wrap a method: 14:19
multi sub trait_mod:<is>(Method $obj, Bool :$path-checked) {
$obj.wrap: -> $inv, $path, |c {
if $path.starts-with: 'resources/examples/' {
} else {
callwith $inv, "resources/examples/" ~ $path, |c;
now, the last tricky bit is that I want to look up the path which is a `$.root` attribute 14:20
I can't get access to it from inside the trait_mod sub 14:21
I tried doing `multi method trait_mod` but just got an error:
`Can't use unknown trait 'is' -> 'path-checked' in method declaration.`
is there any way to get around that?
SmokeMachine why not just call $inv.root? 14:23
stevied ah, lemme try
bam, nice. 14:24
thanks! 14:25
i'm at peace again 🙂
this is exactly the kind of thing I was looking to do. very cool
this is some pretty amazing stuff, at least to me 14:27
14:36 Kaipii joined 14:39 Kaipei left 14:41 Kaipii left, Kaipii joined 15:23 sienet_ja_LSD[m] joined 15:38 dakkar left 16:14 Kaipii left, Kaipii joined 16:36 jgaz joined 16:57 jgaz left
guifa traits can be crazy useful in some instances 17:13
I have one that lets you use alias method names. Took about 5-10 minutes to write, but man, it saves a LOT of time (and improved user experience for folks using the module :-) ) 17:14
Nemokosch which module? 🧐 17:25
guifa Intl::CLDR 17:26
LOL my declarator pod is backwards between the attribute and method trait. note to self to fix it 17:27
I did it because CLDR has been around for a while, and depending on the era, some parts use one or another naming convention. I default to lowercase kebab because that's the norm in Raku, but if that's not what it uses, I provide the alias in case that makes life easier integrating with other workflows 17:40
17:48 johnjaye joined
johnjaye is most work that happens on raku on the language or libraries or something else? 17:48
Nemokosch what is CLDR 😅 17:50
johnjaye some unicode xml-ish thing for locales. sounds terrifying 17:53
Nemokosch lol xd 17:59
johnjaye: check this out 18:06
sienet_ja_LSD[m] what data format is h' ? 18:33
like in python they have b'a0a786a8' for bytes data 18:34
that starts with h'
21:24 Kaipii left
guifa I would assume it's for hex, but it's not a Raku-based format 21:26
21:27 jgaz joined
guifa johnjaye both. There are still parts of the language that are being worked on (macros, etc) but since everything is there for 99% of projects, lots of us are now focusing on developing libraries to use with it 21:27
sienet_ja_LSD[m] aye ok, CBOR::Simple produced it (which I still don't seem to get working)
guifa Nemo: yeah, it's a massive database of localization data, like, how do you format dates, what are the abbreviations for months, etc. 21:28
21:36 jgaz left
Anton Antonov I have a nested hash (say, a hash of hashes of hashes) `%h3` and a list of keys `<k1 k2 k3>`. What is the shortest code to get to the "bottom" element with that list of keys? I know I can do `%h<k1><k2><k3>` and, maybe, I can write a reduce-like code. Is there anything shorter and/or more standard? 21:50
22:06 m_athias_ joined 22:07 pi1 joined, m_athias left, deadmarshal left, johnjaye left 22:10 m_athias_ is now known as m_athias 22:13 deadmarshal joined 22:25 pi1 is now known as johnjaye
johnjaye how easy is it to port a perl library to a raku library on a scale of 1 to 10? 22:26
22:33 jgaz joined
guifa Anton: nothing standard. I'd just write a quick sub that does it, and call it 22:38
m: sub deep(%b,+@k) {my $r=%b; $r=$r{$_} for @k;$r}; my %a = b=>%(c=>1,d=>2),e=>%(f=>3,g=>4); say %a.&deep: <b c>; say %a.&deep(<e g>);
camelia 1
guifa if you're really going to use it a lot, you might look at creating a custom postcircumfix, but since the standard (post)circumfixes have all been taken, it'll be tricky coming up with a good choice, but you could do 22:40
multi sub postcircumfix:<⟨ ⟩>(%b,+@k) {my $r=%b; $r=$r{$_} for @k;$r}; my %a = b=>%(c=>1,d=>2),e=>%(f=>3,g=>4); say %a⟨<b c>⟩; say %a⟨<e g>⟩; 22:41
the catch is that the %a<foo> is actually shorthand for %a{'foo'}, so it's combining a quote and an operator in one. You can only create the custom operator side, so you'd still need to create an array of strings (via < >) 22:44
Anton Antonov @guifa Thanks! The postcircumfix solution is nice. (But I used double squared brackets, "⟦ ⟧", instead of angular brackets.) 22:51
BTW, I mostly want / need this for testing of Tries with frequencies; see So, having that kind function defined in that package would make sense. 22:54
guifa BTW, I just tested and you can use ASCII double square brackets without any trouble :-) 22:55
multi sub postcircumfix:<[[ ]]>(%b,+@k) {my $r=%b; $r=$r{$_} for @k;$r}; my %a = b=>%(c=>1,d=>2),e=>%(f=>3,g=>4); say %a[[<b c>]]; say %a[[<e g>]]; 22:56
m: multi sub postcircumfix:<[[ ]]>(%b,+@k) {my $r=%b; $r=$r{$_} for @k;$r}; my %a = b=>%(c=>1,d=>2),e=>%(f=>3,g=>4); say %a[[<b c>]]; say %a[[<e g>]]; say [[1,2], 3]
camelia 1
[[1 2] 3]
guifa Might make typing easier. Shouldn't be a problem, as you can create raw lists like @a = [[1, 2], [3,4]] without interference (those are circumfixes, rather than postcircumfixes), and the likelihood of you doing needing to pass a literal array as an index of an array (like `@foo[[1,2] + 3]` or something) is probably about zero :-) 22:58
Anton Antonov Thank you, sounds good! 23:10
stevied I can't figure out how to use splitpath: 23:32
just get an error: `No such method 'splitpath' for invocant of type 'Str'` 23:33
I tried converting it to .IO but that didn't help
this is my code:
method has-separator(Str:D $path) {
($path.splitpath)[1] ?? True !! False;
23:42 jgaz left