01:49 discord-raku-bot left, discord-raku-bot joined 01:53 gfldex left 01:57 gfldex joined 03:05 frost joined 04:21 frost left 04:37 guifa joined 05:23 frost joined 06:37 frost left 06:40 frost joined 07:16 frost left 07:28 frost joined 07:34 frost left 08:07 dakkar joined 10:21 qorg11 left 12:46 destroycomputers left, discord-raku-bot left, discord-raku-bot joined, destroycomputers joined 16:39 dakkar left
stevied what is the comma doing in this line? `my @out = [ [@in.shift], ];` 20:07
MasterDuke make a list of lists, see the single arg rule in the docs 20:08
stevied it's creating an array within an array but I'm not sure how 20:09
MasterDuke the ,
stevied ok, this here: docs.raku.org/syntax/Single%20Argument%20Rule 20:13
haven't seen this before
why doesn't `my @array = [ 1, ];` create an array within the @array? 20:19
MasterDuke there's only one level there, `my @array = [ [1], ];` would make two 20:21
m: my @a = [ [1,2], ]; say @a.elems; say @a[0].elems 20:22
camelia 1
stevied i'm confused. why doesn't [ [ 1 ] ] create an array in an array? 20:25
MasterDuke because commas create lists/arrays, not [] or () 20:27
stevied no matter how many square brackets I use, it's always just on element in an array
ok, i see my confusion now. the outer brackets in `[ [@in.shift], ]` are superfluous 20:29
don't need them
thanks 20:30
MasterDuke np
20:43 qorg11 joined
Nemokosch interesting 21:01
stevied ok, got this: 23:03
multi blah ($string) {
$string = 3;
multi blah (@array) {
my @array = 1, 2, 3;
blah @array;
say @array;
my $string = 'old';
blah $string;
say $string;
the @array is actually changed by the function, which was unexpected 23:04
the string is immutable unless I do `is copy`
why is the array mutable and the string isn't?
guifa that $string = 3 there should fail 23:11
stevied right, it does
guifa @array.shift doesn't change the array in @array, it just tells @array to do something 23:12
m: sub foo(@a) { @a.shift }; my @a = 1,2,3; say @a.WHICH; foo @a; say @a.WHICH; 23:13
camelia Array|5485619587248
stevied the `say @arrary` will print out [2, 3]
so it changed
guifa If I put three balls in a bag, and take one out, is it the same bag?
stevied yes. but why doesn't the bag stop you from taking balls out like with the string? 23:15
the string is read only. I'm wondering why there is a different rule for the array. I can do anything I want to it and it changes outside the function.
I can do @array = 7 inside the `blah` function and it works 23:17
guifa So it's a two part answer. 23:19
But it revolves around the question of what we're changing. 23:20
And then also the assignment type (determined by the sigil)
MasterDuke a very short answer is that an array is a container. you can't change the container itself, it's immutable like the string is in your example, but you can change its contents 23:22
stevied but I thought scalars were also containers 23:23
Nemokosch well, it seems like this abstraction is more disturbing than useful here
at the end of the day, the behavior is exactly the same as it would be in Javascript or Python
guifa Nemokosch: almost
stevied well, it's much different from perl
which is what I'm used to
guifa m: sub foo (@x) { @x = 4,5,6 }; my @y = 1,2,3; foo @y; say @y; 23:24
camelia [4 5 6]
Nemokosch an array is composit, even if you take it as a literal
guifa ^^ that would be different in Javascript or Python, I believe
because they don't distinguish different types of assignments 23:25
Nemokosch I don't think that could change with any sigil
and tbh I wouldn't consider this a feature in this context, more an anomaly
guifa m: sub foo ($x) { $x = 4,5,6 }; my @y = 1,2,3; foo @y; say @y; 23:26
camelia Cannot assign to a readonly variable or a value
in sub foo at <tmp> line 1
in block <unit> at <tmp> line 1
Nemokosch implicit "is rw"
the compiler does warn you about it of course, I mean that the @ sigil is always rw 23:27
is it even possible to make it readonly or something?
guifa You can pass a list
m: sub foo (@x) { @x = 4,5,6 }; my @y is List = 1,2,3; foo @y; say @y; 23:28
camelia Cannot modify an immutable Int (1)
in sub foo at <tmp> line 1
in block <unit> at <tmp> line 1
Nemokosch okay but this fails because of the data passed, right? 23:29
not because of the parameter
guifa @x is read only regardless. The question is whether what's passed into X well allow itself to do anything. 23:30
Nemokosch if it's read only, how come you assign a value to it which it even keeps? 23:31
stevied that was my question, too
Nemokosch which is btw in accordance with what Rakudo says 23:32
guifa Because @foo = is list assignment, and $foo = is scalar assignment, and they're subtly different
well, subtly different except here
Nemokosch ie "you don't have to mark is rw on @ sigilled parameters" 23:33
list assignment again... don't get me started
stevied gotta go eat. I'll check back later. 23:34
Nemokosch eating is caring
I'm yet to see list assignment written down in a positive context 23:36
remember switching @a and @b? 23:38
m: my @a = 1, 2; my @b = 3, 4; (@a, @b) = (@b, @a); dd @a, @b; 23:40
big yikes
and unlike the famous JS [] == ![], this is a perfectly realistic scenario 23:44
m: my $a = [1, 2]; my $b = [3, 4]; ($a, $b) = ($b, $a); dd $a, $b; 23:50
see, it can be done