This channel is intended for people just starting with the Raku Programming Language ( Logs are available at
Set by lizmat on 8 June 2022.
:(**@args, *%kwargs) is there a way to "unbound" a method then bound them back to another object 01:05
Nemokosch there is method_table on the metaobject 01:12
I did manage to delete a method from a class using that 01:13
oh I can see the risk
you need to make sure that the self argument is set up in a way that supports both the original class and the new class 01:14
:(**@args, *%kwargs) im trying to recreate super which is just evaluating superclass methods in the context of current object so i think its safe 01:17
is it like this? Someclass.^method_table::mymethod and then the object i get is a sub? 01:25
Nemokosch do you state that or is it just wishful thinking? 01:26
:(**@args, *%kwargs) yeah its just thinking
Someclass.^method_table<mymethod> 01:27
ok this is right
m: class C { has $.x; } my $a = => 1); say C.^method_table<x>($a:); 01:31
m: class C { has $.x; } my $c = => 1); say C.^method_table<x>($a:);
m: class C { has $.x; } my $c = => 1); say C.^method_table<x>($c:);
m: class C { has $.x; } my $c = => 1); say C.^method_table<x>($c); 01:33
nice 01:34
m: class C { has $.x; } my $c = => 1); say $c.^method_table<x>($c); 01:36
Nemokosch 👋 😴
:(**@args, *%kwargs) gn 01:37
why doesn't it work notably if i change has $!o to has $.o it worked again 02:07 02:08
Rog oh wow, colors are working now 02:55
02:56 kjp left 03:00 kjp joined
stevied ok, this is unexpected for me: 04:39
m: class Box { has $.data; multi method new($d = '') { say 'here'; self.bless(data => $d); } } my $box ='hi'); say $; my $box2 = => 'be'); say $;
I don't know why the same new method gets called for different arguments
now look at this:
m: class Box { has $.data; multi method new($d) { say 'here'; self.bless(data => $d); } } my $box ='hi'); say $; my $box2 = => 'be'); say $; 04:40
when I take away the default value for $d in new(), it works as expected
what explains this?
I don't expect multi method new($d = '') to get called with = 'be') 04:43 04:56
05:17 Heptite left
ok, it works if I slap an is built to the $data attribute. always wondered what is built was for 05:20
:(**@args, *%kwargs) i think raku choose to call new($d = '') because it can accept no positional args 07:08
i don't know enough of raku dispatch rules 07:09
stevied I asked on SO and got a good answer. 07:10
The *%_ special variable makes it override Mu’s new() 07:11
:(**@rest, *%rest) hmm implicit *%_ 07:17
another thing to note when writing signatures 😭 07:18
stevied Heh. Right. I didn’t even know about it until last week. 07:24
Lots to keep track of. 07:25
Every time I go back and read the docs I learn more and more subtle stuff I missed or didn’t get before.
:(**@rest, *%rest) this is why explicit better than implicit 07:27
stevied Yeah. I was just thinking the same thing. Better to spell everything out even if it results in more code. At least at first. 07:28
Unfortunately, I like to drive myself crazy trying different things to see if I can get them to work. 07:31
:(**@rest, *%rest) idk why you have to override new and use bless 07:36
which are preferred methods to create custom constructor use BUILD or override new? 07:39
stevied Depends if you need to override the constructor methods. 07:42
New does not call parent new. So you use BUILD in that case.
I was trying to figure out how to do things without a BUILD method. It makes things a little harder with just new() method. 07:44
I like to see how I can do things with minimal code. I do learn a lot that way. 07:45
:(**@rest, *%rest) is there a turtle module in raku 08:17
Nemokosch Logo stuff? 09:25
@stevied I think by now you know but yeah... by default, any named argument can be discarded from a call 09:26
Tbh feels like a legacy thing, I wonder what the cost of a change would be
:(**@rest, *%rest) yeah 09:40
Nemokosch When I googled it, I got "Raku fetish turtle" xdd 09:42
:(**@rest, *%rest) raku is not that widely used and its only 8 years old so there is room for change 09:43
Zephyr I skipped a few words at first glance and was wondering why you'd google that
Nemokosch would the turtle module have its own graphics? 09:45
how does the Python version work
I see there is a Perl module that comes completely without graphics, only holding the state
:(**@rest, *%rest) it can use the canvas widget of existing gui frameworks
in fact that is what python does 09:46
Nemokosch > The turtle module provides turtle graphics primitives, in both object-oriented and procedure-oriented ways. Because it uses tkinter for the underlying graphics, it needs a version of Python installed with Tk support. hmmm 09:48
just to reiterate @:(**@rest, *%rest) are you running Rakudo on Windows? 09:51
:(**@rest, *%rest) yes, tho i mostly use glot 09:52
gfldex Most of the time, TWEAK works best. 10:02
Nemokosch to quote vrurg, BUILD should rarely ever be used 10:07
new is good if you want to create multiple creation interfaces to the same underlying data, mainly 10:08
TWEAK is kind of a final step in the creation, default values and blessing stuff has already happened by that time iirc 10:09
it would be interesting to see how much of stuff works well on Windows 10:13
I mean hopefully the core would work without any problems 10:14
but there are many libraries where this is not obvious
also, the filesystem is different, I think that's leveraged with an underlying multiplatform C library
and the "JVM backend" probably does its usual Java business 10:15
gfldex Pretty much the first thing I had to learn was to Introspect All The Things!, because the compiler had so many bugs. If you do the same, you will spot all the hidden gems. I strongly disagree that explicit is better, because that is a statement of opinion, not of fact. Most of the time I don't want to deal with all the details. It's just to much cognitive load. Being able to step back and look at the whole 10:20
picture will come with time. Or it wont. It's not a given that a good programmer will "get" Raku. Nor should we aim for that. One size fits all has never worked well.
Nemokosch by the way, consider trying @jaguart 's Grok module 10:21
I suppose he wrote it with similar thoughts in mind - it would be good to see how the underlying data is composed before making any assumptions 10:22
10:52 NemokoschKiwi joined 11:21 NemokoschKiwi left 11:33 ab5tract joined 11:58 ab5tract left, ab5tract joined 12:12 snonux joined 12:34 ab5tract left
btw I wonder what the most stable choice is if somebody wants to do graphics with Raku 13:04
there are many GTK ports but I barely know GTK
13:13 snonux left
:(**@rest, *%rest) maybe make yet another tcltk binding? 13:22
Nemokosch tbh could be 13:25
I'd assume it has a C interface? 13:26
13:38 NemokoschKiwi joined 13:41 NemokoschKiwi left
:(**@rest, *%rest) don’t know how python does it but i assume its just sending a bunch of commands to the tcl backend 14:00
14:45 raschip joined
stevied Well if your immediate objective is to just get the code to work the way you expect, best to not try anything fancy and spell things out. 14:52
Raku is fairly easy if you stick to the straightforward stuff. It’s when you try to take advantage of all its conveniences it seems to get a lot harder. At least for me. 14:53
:(**@rest, *%rest) sometimes tho raku places assumptions on where you don’t expect which is where its better to be explicit 15:08
like the named argument thing
or just better to read the docs 15:14
stevied yeah, I guess if I pass a Pair to a constructor with a key that does not exist as an attribute, I assume I would get some kind of warning. But maybe that's just a bad assumption on my part. 15:16
15:16 Heptite joined
:(**@rest, *%rest) m: class A { has $.x; }; 15:17
stevied but I don't know how I went a year in Raku without knowing about *%_.
:(**@rest, *%rest) m: class A { has $.x; } dd;
raku belike 15:18
Nemokosch I remember Bruce Gray talking about this on a Raku Study Group meetup 15:19
(next one is tomorrow btw)
:(**@rest, *%rest) also Any being both the base class and the equivalent of undefined :cameliathink:
Nemokosch for the attribute of sort
:(**@rest, *%rest) (this has been talked to death i know)
anyways how to make class methods 15:20
Nemokosch is it not enough that you invoke the method on the type object? 15:22
stevied class methods are explained well in docs 15:28
:(**@rest, *%rest) basically i have a class variable representing shared data and i want to have class methods to access them ok the question should be “how to make class variables”
Nemokosch try my-scope inside the class, I'd say 15:29
:(**@rest, *%rest) class method have a ::?CLASS:U type constraint on the invocant
15:30 snonux joined
stevied 15:30
for like a class variable, just use a regular old "my" variable 15:33
:(**@rest, *%rest) hmm that means i can also define subs in class bodies my sub something { ... } not sure how that would turn out 15:34
stevied yes, you can do that. no problem 15:35
this is what I have done
look at example at the bottom of this section: 15:36
the example is introduced with "Here is an example where we enrich the Str class with an auto-incrementing ID:"
:(**@rest, *%rest) how do i pad a number with zeros 15:40
in its string representation 15:41
Nemokosch I'd definitely just use sprintf
:(**@rest, *%rest) ok
Nemokosch with the arguments known from C
:(**@rest, *%rest) m: printf(“%2d”, 1) 15:42
m: printf(“%10d”, 1)
m: printf(“%010d”, 1) 15:44
m: class TV { # class my %tvs; method tvs(::?CLASS:U:) { %tvs } # instance has $.owner; submethod BUILD(:$!owner) { my $tv-serial = 'TV%04d'.sprintf(%tvs.elems); %tvs{$tv-serial} = self; } } => 'foo'); => 'bar'); => 'baz'); => 'quux'); dd; 15:57
i think this is how it works 15:58
Nemokosch nice 16:12
16:27 snonux left 16:31 snonux joined
p6steve personally I would go method tvs(TV:U:) {...} instead of method tvs(::?CLASS:U:) {...} that just seems a bit clearer... 16:34
:(**@rest, *%rest) should i put the code inside the BUILD body in TWEAK or new? 16:36
p6steve ... (I see that the docs don't mention my way ... so perhaps it has some issues) 16:37
:(**@rest, *%rest) or keep it there?
p6steve ... I usually go with TWEAK since then I can use all the attr defaults and so on
... or I use multi method new() to hone down a variety of creation options 16:38
:(**@rest, *%rest) conceptually it assigns a serial number to the TV instance and put it in %tvs 16:39
which is why idk where would it fit 16:40
raschip The usual recommendation is to go with TWEAK, using BUILD will disable a ton of features you'd have to implement yourself. 16:41
16:43 snonux left
:(**@rest, *%rest) ok 16:48
stevied @gfldex wrote something up years ago about throwing an exception when bad name arguments are passed: 17:35
p6steve raschip++ 18:32
18:38 ab5tract joined 19:03 ab5tract left 19:53 ab5tract joined
stevied i found a bug in the fez module: my $regex = $_.split('*').map({$_ eq '' ?? '.*' !! "'$_'"}).join(''); rx/ <$regex> / 20:52
^^ broken code 20:53
Nemokosch could you elaborate?
stevied If I remove the angle brackets from the second line, it works
let me get you the module file that's broken 20:54
so, if there is a .gitignore file in the directory the module just hangs 20:55
why is that $regex scalar in angle brackets? 20:56
Nemokosch I don't know, maybe let's ask tonyo 20:59
stevied I plan to, but I want to try to make sure I understand the bug. 21:00 21:01
I haven't read it but it looks confusing as shit
Nemokosch one thing is sure: <$foo> and $foo is not the same 21:02
stevied ok, so I think I get it 21:03
not sure how this could go unreported for so long
Nemokosch <$foo> seems like some secret way to turn a string into a regex
stevied and seems like it should be caught by a test
there really are hardly any tests for fez module
Nemokosch well, what do you get exactly 21:04
stevied what do I get when I use fez with a .gitignore file? It just hangs forever 21:05
when I remove the angle brackets, it creates a tarball in sdist
and it doesn't hang
21:07 raschip left 21:09 raschip joined
Nemokosch hmm, the truth is 21:11
I'm not sure if I published anything with raw fez in the last 3 months, when this change happened
but if it's really as you say, indeed it's strange that nobody reported it 21:12
21:14 ab5tract left
stevied the lib/Fez/Util/Pax.rakumod was added on 10/15/2022 21:17
so it's new
alright, well, I guess I got enough to write a decent report
all those maps and greps are confusing as hell, though. I don't understand what's going on with the manifest. seems like that could or should be greatly simplified 21:18
I don't understand this part of the Fez readme: #### using pax pax is the bundler included with v38 onward to avoid compatibility issues with certain BSDs. git archive is no longer used as it caused a lot of confusion - this means that what's on disk is what is getting bundled rather than what is in main/master! #### using git archive (deprecated with v38) fez will attempt to run `git archive` which 21:21
will obey your `.gitignore` files. it is a good idea to put sdist/ in your root gitignore to prevent previously uploaded modules.
it says git archive is "no longer used" and then in the next section is says it's deprecated 21:22
oh, maybe I have to put sdist into the gitignore. maybe that's why it's hanging. it's recursive
nope, still hangs 21:25
now I wonder if I switch to 2022.07 if it will work. let's see 21:35
holy shit. it worked. 21:36
using same version of fez
i think this is a bad bug in rakudo 21:39
Nemokosch hmmmm 21:46
does the regex work differently? @stevied
stevied it must 21:49
I will try to confirm. Can you see if you can reproduce? 21:50
Nemokosch which part? 21:54
stevied see if you can do fez upload on directory with a .gitignore file in 2022.07 and 2022.12 21:55
lizmat fwiw, I've uploaded the latest App::Rak using 2022.12+ on Mojave without any problems (yes, it has a .gitignore file) 21:57
stevied ok, thanks 21:58
now it's hanging for me again on 2022.07. very weird
I think I must have been using my local, hacked version of fez and didn't know it 21:59
/lizmat are you on a mac?
lizmat uploading from Monterey 22:00
22:07 MasterDuke joined
Sparkill ogl 22:08
stevied i'm not sure why the presence of .gitignore would make a difference in ventura and not monterey 22:13
i have a copy of monterey though. i can try on that 22:14
Nemokosch I'd say, you are already a squashathon participant, de facto 😉 22:16
stevied heh 22:19
fuck. hangs on my old mac running big sur running 2022.06
none of this makes any sense. 22:20
Nemokosch could you please log the content of the @ignores variable? 22:21
stevied sure 22:22
Nemokosch Fez could really use a verbose mode tbh
stevied [method rx/ <$regex> / method rx/ <$regex> / method rx/ <$regex> / method rx/ <$regex> / method rx/ <$regex> / method rx/ <$regex> /]
that's what I got
doesn't look like it would work 22:23
looks like a mess
Nemokosch well it could work imo, the textual form is ugly though 22:24
regexes are kind of methods
stevied i don't get why there are repetitive methods, though 22:26
makes no sense to me
oh, it's an arry of methods
Nemokosch for the lines of the gitignore file
lizmat could be that the rendering of each regex is incomplete / incorrect
stevied I keep forgetting that arrays use whitespace separators
Nemokosch you could use dd @ignores (in this case, I don't expect anything informative tbh) 22:27
one thing I have a bad feeling about is any 22:28
junctions can have cunning issues
what could really help with knocking the regex part down is logging $regex itself, to see if it's as lizmat said 22:29
stevied tried with Data::Dump and it's a giant mess of output 22:30
Nemokosch I just meant everyday dd 22:31
stevied here's $regex: '.precomp/' '/Directory-'.* .*'.iml' .*'.idea' 'sdist/' .*
Nemokosch okay, thanks
it seems valid, at least 22:32
stevied remember, when I remove .gitignore, everything works
gotta be a bug in the module
Nemokosch I mean, this piece of code only runs when .gitignore is present 22:33
stevied right
if it works for liz, maybe it's something in the .gitignore itself
22:33 raschip left
Nemokosch but sometimes it worked for you as well with the same data, right?? 22:34
stevied ok, yeah, when I pull some lines from gitignore, it work
got it 22:35
there's a blank line at end of the .gitignore. makes it choke
Nemokosch "null regex not allowed" 22:36
stevied ok, cool. now I can relax 🙂
or, at least, I can move on to the other fez bug 🙂 22:37
Nemokosch makes it choke???
that's the .* right there 22:38
but why should that make it choke? 🙀
stevied yeah, choke. crap out. fuck up.
it just hangs
more technically, it hangs when trying to read the .exitcode on the pax command 22:39
not sure why
Nemokosch could you log the @manifest please? 22:42
maybe we've been going the wrong way all along?
stevied with or without the blank line in .gitignore?
Nemokosch maybe both 22:43
I'd expect there to be a difference between the two cases 22:44
stevied k, one sec
trying to see if I can upload via mi6 right now. have to install some modules
wow! mi6 release now works on 2022.12 for me 22:48
ok, let me check manifest 22:49
with no blank line in .gitignore: [META6.json LICENSE Changes t/02-more.rakutest t/01-basic.rakutest xt/Author-Tests.rakutest lib/Directory.rakumod dist.ini] 22:50
with blank line: [] 22:51
so that's definitely the problem
Nemokosch well yeah the empty repo is not healthy xD
.gitignore itself ignores empty lines, right?
stevied well, it's proper to end all files with a blank line 22:52
that's the way all text files are supposed to be
Nemokosch well I hope not cause it's ugly but anyway 😅
I think .gitignore doesn't give a damn about empty lines 22:53
and they definitely don't ignore the whole folder
stevied yeah, I highly doubt it doesn't like them
^^ say blanks lines are ignored 22:54
Nemokosch yep, cool
then this is one definite bug in fez
stevied more tecnically, ever text file should end with \n 22:55
it just looks like a blank line in your editor
but it's not blank. it doesn't exist
Nemokosch empty line - turns into .* as a regex - matches everything, boom, all files gone
tbh I'm not sure about .* 'some string' either 22:56
stevied yeah, you're going to have to explain that to me. why is it wiping files out?
I know what .* is obviously, but not in the context of this file collector
why doesn't it match every file instead? 22:57
Nemokosch because it's negated in the code
the output of any
stevied i can't wrap my head around that ls sub in there. too confusing 22:58
Nemokosch looks quite bizarre, with ! and .so at the same time
do you have .iml or .idea files in your folder?
stevied you'd have to spend a half hour breaking that down (at least I would)
yeah. .iml and .idea 22:59
Nemokosch hm, those are (rightfully) sorted out
idk the backtrack rules of regex 23:00
but they fit this use case apparently
stevied got to be an easier way to generate the file listing that excludes what's in .gitignore than this 23:01
it's just a mess
is what 's in .gitignore even regexes?
that doesn't seem right at all 23:02
not regexes raku would understand anyway, I wouldn't think
Nemokosch this is not a sentence I would understand anyway 😛 23:03
stevied it looks like the fez code treats each line in .gitignore like a raku regex. 23:04
Nemokosch well regexes are more powerful than .gitignore patterns I think
stevied i have very strong doubts that this a proper method for determining which files to ignore
Nemokosch so this can work
buuut 23:05
I'd rather wish for this to be outsourced into its own module
that does this in a sane, foolproof way
stevied this is possible in .gitignore: A trailing "/**" matches everything inside. For example, "abc/**" matches all files inside directory "abc", relative to the location of the .gitignore file, with infinite depth.
Nemokosch with tests, right?
stevied raku doesn't know how to interpret /**
Nemokosch or, another approach
(what mi6 does) 23:06
git ls-files
and call it a day
stevied this definitely needs tests, yeah
but this has a custom ls command
doesn't use mi6
Nemokosch I mean, the whole "what files need to be saved" is intended to be "all tracked files", no? 23:07
I'd guess so
stevied I presume. but the readme for fez says he is moving away from git acrhive
it looks like it's doing a roll your own method for collecting files. not a super trivial task, if you ask me 23:08
Nemokosch there's also this
stevied yeah, should probably outsource to that module 23:09
Nemokosch this also runs git ls-files under the hood
stevied maybe tony-o cargo culted from mi6 or this module 23:10
Nemokosch actually this is an interface to git ls-files
stevied alright, at any rate, I gotta go get ready for dinner. check you later. thanks again for helping me brainstorm this. helps me find the problem sooner 23:11
Nemokosch 🤝 23:14
bon appetit
Sharparam i am at a loss at what's going on here: perl [6] > my @pairs = [(2..4, 6..8), (2..3, 4..5), (5..7, 7..9), (2..8, 3..7), (6..6, 4..6), (2..6, 4..8)] [(2..4 6..8) (2..3 4..5) (5..7 7..9) (2..8 3..7) (6..6 4..6) (2..6 4..8)] [7] > { $_[0] ~~ $_[1] } (True False False False False False) [8] > { my ($a, $b) = $_[0], $_[1]; $a ~~ $b } (False False False False True False) why does it 23:20
behave different if each Range in the pair is assigned to a variable? i must be missing something fundamental
Nemokosch hello hello 23:27
the second version seems right... :cameliathink: 23:33
oh, I have my suspicion
~~ alters $_
I'm curious if this ever worked differently, then I'll be back to you with an interpretation @Sharparam 23:35
Sharparam yeah the second version produces the expected result, i'm not sure what the first one actually does 23:36
Nemokosch "nothing to bisect" says the bot - this always worked this way (since 2015 at least) 23:37
Sharparam hm, "The smartmatch operator aliases the left-hand side to $_" 23:38
i wonder if that's why
Sharparam right, that makes sense then 23:39
Nemokosch so it's like
you fetch the left range
temporarily rename it $_
Sharparam so a more compact way to do it would be: { [~~] $_ } 23:40
Nemokosch well, almost 23:41
tbh I didn't expect it to work but the result got even more interesting than I thought
m: my @pairs = [(2..4, 6..8), (2..3, 4..5), (5..7, 7..9), (2..8, 3..7), (6..6, 4..6), (2..6, 4..8)]; say { [~~] $_ }; 23:42
this is where one would want to give up 🤠 but there is a remedy 23:43
m: my @pairs = [(2..4, 6..8), (2..3, 4..5), (5..7, 7..9), (2..8, 3..7), (6..6, 4..6), (2..6, 4..8)]; say { [~~] $_[] };
I'm rather surprised that this works
Sharparam curious 23:44
it also works if binding instead: perl [0] > my @pairs := (2..4, 6..8), (2..3, 4..5), (5..7, 7..9), (2..8, 3..7), (6..6, 4..6), (2..6, 4..8) ((2..4 6..8) (2..3 4..5) (5..7 7..9) (2..8 3..7) (6..6 4..6) (2..6 4..8)) [1] > { [~~] $_ } (False False False False True False) [2] > my @pairs = (2..4, 6..8), (2..3, 4..5), (5..7, 7..9), (2..8, 3..7), (6..6, 4..6), (2..6, 4..8) [(2..4 6..8) (2..3 4..5) 23:45
(5..7 7..9) (2..8 3..7) (6..6 4..6) (2..6 4..8)] [3] > { [~~] $_ } (True True True True True True)
Nemokosch the important thing is to get rid of the container
m: my @pairs is List = (2..4, 6..8), (2..3, 4..5), (5..7, 7..9), (2..8, 3..7), (6..6, 4..6), (2..6, 4..8); say { [~~] $_ }; 23:47
container = mutation + itemization
and the values of an array always come in containers 23:48
okay now I understand why it works, after all 23:49
there is no $_ lookup between the operands, it all happens before starting with the operator 👏 23:50
Sharparam right
Nemokosch how long have you been using Raku? you don't seem that much of a beginner 23:51
Sharparam a bit on-and-off for a while, i come back to it occasionally, i still feel like a beginner in it though :p 23:53
i've been mostly translating advent of code solutions from ruby to raku to get more familiar with it
Nemokosch oh okay, have fun 23:54
Ruby did seem kind of like a language inspired by Perl, too
Sharparam yeah, perl and smalltalk iirc? 23:55
Nemokosch Well, I don't know much about Smalltalk but it Ruby does look visually similar that's for sure 23:58
Sharparam never used smalltalk myself either. long ago a friend introduced me to ruby on rails and since then ruby has just *clicked* with me ^^ 23:59