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 | |
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 = 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 | ||
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. | ||
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 | ||
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; } 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 | ||
15:30
snonux joined
|
|||
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 | |
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 | ||
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 | |
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: perl6advent.wordpress.com/2015/12/...d-methods/ | 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 | ||
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 | |||
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 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 |