This channel is intended for people just starting with the Raku Programming Language (raku.org). Logs are available at irclogs.raku.org/raku-beginner/live.html
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 = A.new(x => 1); say C.^method_table<x>($a:); 01:31
m: class C { has $.x; } my $c = C.new(x => 1); say C.^method_table<x>($a:);
m: class C { has $.x; } my $c = C.new(x => 1); say C.^method_table<x>($c:);
what
m: class C { has $.x; } my $c = C.new(x => 1); say C.^method_table<x>($c); 01:33
nice 01:34
m: class C { has $.x; } my $c = C.new(x => 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
glot.io/snippets/ghoxb47ub4 02:08
Rog oh wow, colors are working now 02:55
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 = Box.new('hi'); say $box.data; my $box2 = Box.new(data => 'be'); say $box2.data;
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 = Box.new('hi'); say $box.data; my $box2 = Box.new(data => 'be'); say $box2.data; 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 Box.new(data = 'be') 04:43
stackoverflow.com/questions/752654...unexpected 04:56
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.
stackoverflow.com/a/75265629/1641112 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
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
:(**@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
:(**@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
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
:(**@rest, *%rest) m: class A { has $.x; } A.new(:nope); 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 A.new(:nope);
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
stevied docs.raku.org/language/objects#Cla...ce_methods 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: docs.raku.org/language/objects#Obj...nstruction 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; } } TV.new(owner => 'foo'); TV.new(owner => 'bar'); TV.new(owner => 'baz'); TV.new(owner => 'quux'); dd TV.tvs; 15:57
i think this is how it works 15:58
Nemokosch nice 16:12
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
BUILD or TWEAK
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
:(**@rest, *%rest) ok 16:48
stevied @gfldex wrote something up years ago about throwing an exception when bad name arguments are passed: perl6advent.wordpress.com/2015/12/...d-methods/ 17:35
p6steve raschip++ 18:32
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
github.com/tony-o/raku-fez/blob/64...akumod#L13
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
docs.raku.org/language/regexes#Reg...erpolation 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
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
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
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
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 README.md 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
www.oreilly.com/library/view/versi...05s08.html
^^ 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
raku.land/zef:lizmat/Git::Files
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] > @pairs.map: { $_[0] ~~ $_[1] } (True False False False False False) [8] > @pairs.map: { 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
Nemokosch docs.raku.org/language/traps#Topic..._operators
yes
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: @pairs.map: { [~~] $_ } 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 @pairs.map: { [~~] $_ }; 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 @pairs.map: { [~~] $_[] };
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] > @pairs.map: { [~~] $_ } (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] > @pairs.map: { [~~] $_ } (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 @pairs.map: { [~~] $_ }; 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