»ö« Welcome to Perl 6! | perl6.org/ | evalbot usage: 'p6: say 3;' or rakudo:, or /msg camelia p6: ... | irclog: irc.perl6.org or colabti.org/irclogger/irclogger_logs/perl6 | UTF-8 is our friend!
Set by moritz on 22 December 2015.
lookatme morning 00:30
rubio_terra_ p6: my @a = 1,2; my @b[2;2] = ((1,2),(3,4)); constant @aa = 1,2; constant @bb[2;2] = ((1,2),(3,4)); 01:30
camelia 5===SORRY!5=== Error while compiling <tmp>
Missing initializer on constant declaration
at <tmp>:1
------> 3(3,4)); constant @aa = 1,2; constant @bb7⏏5[2;2] = ((1,2),(3,4));
rubio_terra_ Why can't I declare a multi-dimensional array constant?
Is this by design?
geekosaur I think there's still a fair amount of NYI with respect to shaped arrays at present 01:36
rubio_terra_ hmm 01:38
lookatme m: my @b[2;2] = ((1,2),(3,4)); 01:43
camelia ( no output )
lookatme m: my @b[2;2] = ((1,2),(3,4)); say @b[0][1]; 01:44
camelia Partially dimensioned views of shaped arrays not yet implemented. Sorry.
in block <unit> at <tmp> line 1
rubio_terra_ p6: my @a[2;2] = ((1,2),(3,4)); say @a[0;1]; 01:46
camelia 2
rubio_terra_ m: constant @a = ((1,2),(3,4)); say @a[1;1]; 01:49
camelia 4
rubio_terra_ This works for me. :)
No need to use a shaped array.
lookatme I think this is still a shaped array. 02:06
rubio_terra_ It may be. But at least it works that way. 02:11
geekosaur actually "shaped" means the shape is part of the type. although in the case of a constant there may well not be much difference 02:13
lookatme m: constant @a = ((1,2),(3,4)); say @a.shape; 02:17
camelia No such method 'shape' for invocant of type 'List'
in block <unit> at <tmp> line 1
lookatme m: my @a = ((1,2),(3,4)); say @a.shape; 02:18
camelia (*)
lookatme Oh, it's different
m: constant @a = "123123"; say @a; 02:19
camelia (123123)
BenGoldberg m: constant @a = ((1,2),(3,4)); dd @a 03:01
camelia ((1, 2), (3, 4))
BenGoldberg m: constant @a = ((1,2),(3,4)); say @a.WHAT
camelia (List)
BenGoldberg m: my @a[42]; dd @a
camelia Array.new(:shape(42,), [Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any])
BenGoldberg Oooh. 03:02
m: constant @a := Array.new: :shape(42,), ((1,2),(3,4)); dd @a;
camelia Array.new(:shape(42,), [(1, 2), (3, 4), Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any])
BenGoldberg m: constant @a := Array.new: :shape(42,), ((1,2),(3,4)); say @a.WHAT; 03:03
camelia (Array)
BenGoldberg m: constant @a := Array.new: :shape(42,), ((1,2),(3,4)); say @a.shape;
camelia (42)
BenGoldberg rubio_terra_, Multi dimensioned array constant ^ 03:04
m: constant @a := Array.new: :shape(2,2), ((1,2),(3,4)); say @a.shape;
camelia (2 2)
BenGoldberg m: constant @a := Array.new: :shape(2,2), ((1,2),(3,4)); dd @a;
camelia Array.new(:shape(2, 2), [1, 2], [3, 4])
BenGoldberg m: constant @a := Array.new: :shape(2,2), ((1,2),(3,4)); say @a[1][1];
camelia Partially dimensioned views of shaped arrays not yet implemented. Sorry.
in block <unit> at <tmp> line 1
BenGoldberg m: constant @a := Array.new: :shape(2,2), ((1,2),(3,4)); say @a[1;1];
camelia 4
karabas p6: say reduce(&[<],0,0,1); say [<] 0,0,1 03:21
camelia True
False
kybr may this seems crazy, but is there an equivalent to clang-format for perl6? i write mostly c++ and i started forcing all my code to a particular standard on writes. 03:23
karabas p6: say reduce(&[<],0,0); say [<] 0,0 03:27
camelia False
False
karabas p6: say reduce(&[<],0,0,1); say [<] 0,0,1
camelia True
False
BenGoldberg kybr, I think what you want is Perl6::Tidy 03:41
kybr BenGoldberg: cool. i see it here: github.com/drforr/perl6-Perl6-Tidy but `zef install Perl6::Tidy` fails: No candidates found matching identity: Perl6::Tidy 03:52
but cool. it's good to know that i'll be able to use it eventually. 03:53
saison Hi, if i have a class that contains an array, is it possible to override the [] operator like you can in c++? 07:23
I managed to override the + operator, but couldn't get the [] index working :)
moritz saison: yes, see docs.perl6.org/language/subscripts#Custom_types 07:28
saison moritz: thanks! 07:30
alexk camelia: help 08:17
camelia alexk: Usage: <(rakudo-moar|p5-to-p6|prof-m|star-m|debug-cat|nqp-js|rakudo-jvm|nqp-moarvm|nqp-jvm|nqp-q|r-j|sm|star|nom|nqp-m|p6|m|p56|rakudo|nqp-mvm|r-m|r-jvm|j|rj|perl6|rm|r|nqp)(?^::\s(?!OUTPUT)) $perl6_program>
moritz m: say 42 08:26
camelia 42
alexk m: for ^500_000 { @ = 'a,b,c;d,e'.split(/<[,;]>/) }; say now - INIT now; 09:31
camelia (timeout)
alexk m: for ^100_000 { @ = 'a,b,c;d,e'.split(/<[,;]>/) }; say now - INIT now; 09:32
camelia 7.44574168
alexk m: use Inline::Perl5; my $p5 = Inline::Perl5.new; $p5.run(q|my @a; for my $i (1..500_000) { @a = split(/[,;]/, 'a,b,c;d,e,f')}|); say now - INIT now;
camelia 5===SORRY!5=== Error while compiling /home/camelia/site#sources/FC133D3E7EC3B0CBE238C296893894C9AB745A05 (Inline::Perl5)
An exception occurred while evaluating a constant
at /home/camelia/site#sources/FC133D3E7EC3B0CBE238C296893894C9AB745A05 (Inl…
09:33
alexk m: for ^500_000 { @ = 'a,b,c,d,e'.split(',') }; say now - INIT now; 09:34
camelia 6.61846318
alexk m: use nqp; for ^500_000 { @ = nqp::split(',', 'a,b,c,d,e') }; say now - INIT now; 09:35
camelia 3.2061412
alexk m: for ^400_000 { @ = 'a,b,c;d,e'.split(/<[,;]>/) }; say now - INIT now; 09:36
camelia (timeout) 09:37
timotimo m: for ^400_000 { @ = 'a,b,c;d,e'.split(",", ";") }; say now - INIT now
camelia Cannot convert string to number: base-10 number must begin with valid digits or '.' in '3⏏5;' (indicated by ⏏)
in block <unit> at <tmp> line 1
jnthn I think split can also take an array of things to split on, to avoid the overhead of the regex engine 09:38
timotimo m: for ^400_000 { @ = 'a,b,c;d,e'.split([",", ";"]) }; say now - INIT now
camelia (timeout)
alexk m: for ^500_000 { @ = <a b c d e> }; say now - INIT now; 09:46
camelia 2.704391
nine On the one hand it's scary how advertisement is now so smart that I suddenly see lots of ads for KLM flights to Amsterdam on phoronix.com. On the other hand, how stupid is bombarding someone with ads for a product they already bought?
alexk m: use nqp; for ^500_000 { @ = nqp::split(',', 'a,b,c,d,e') }; say now - INIT now; 09:47
camelia 3.2437390
timotimo nine: you just bought this washing mashine. how about a second one? 09:49
alexk m: use nqp; for ^500_000 { nqp::split(',', 'a,b,c,d,e') }; say now - INIT now;
camelia 0.40678281 09:50
jnthn fwiw, nqp::split is marked as pure, and it's entirely possible one that loop gets hot then it's just not doing the split at all 09:52
'cus it can see the result is dead
m: use nqp; for ^500_000 { $ = nqp::split(',', 'a,b,c,d,e') }; say now - INIT now;
camelia 0.4182325
jnthn That makes sure it is being used (though it appears it actually was, I guess it was being returned and sunk) 09:53
Tad surprised it wasn't pulled out entirely though
alexk jnthn: the point int the example above is that the most time spent in the array assignment @ = ... 09:55
jnthn Yeah
It's going to cost something 'cus it has to allocate a Scalar container per item 09:56
timotimo and if you put the declaration of the scalar outside, it'll become a lexical access, which isn't cheap either 09:57
nine timotimo: yeah, who gets by without a high availability washing machine cluster these days?
jnthn Was just saying that if you have statements in void context, especially nqp:: ops, you need to be careful benchmarking because we do have stuff that will rip out instructions that are pure and produce an unused result 09:58
alexk m: use Inline::Perl5; my $p5 = Inline::Perl5.new; $p5.run(q|my @a; for (1..500_000) { @a = split(/[,;]/, 'a,b,c;d,e,f')}|); say now - INIT now; 10:05
camelia 5===SORRY!5=== Error while compiling /home/camelia/site#sources/FC133D3E7EC3B0CBE238C296893894C9AB745A05 (Inline::Perl5)
An exception occurred while evaluating a constant
at /home/camelia/site#sources/FC133D3E7EC3B0CBE238C296893894C9AB745A05 (Inl…
alexk m: use Inline::Perl5; my $p5 = Inline::Perl5.new; $p5.run('print 42;'); 10:09
camelia 5===SORRY!5=== Error while compiling /home/camelia/site#sources/FC133D3E7EC3B0CBE238C296893894C9AB745A05 (Inline::Perl5)
An exception occurred while evaluating a constant
at /home/camelia/site#sources/FC133D3E7EC3B0CBE238C296893894C9AB745A05 (Inl…
jsimonet .tell Zoffix So the error is generated internally and not by my operation 3.3/0 => (33/10)/0 => ((33/0)/10)? Maybe the exception could be catched and generate another one which present 3.3 to the end user? 10:10
yoleaux jsimonet: I'll pass your message to Zoffix.
Zoffix . 10:10
yoleaux 10:10Z <jsimonet> Zoffix: So the error is generated internally and not by my operation 3.3/0 => (33/10)/0 => ((33/0)/10)? Maybe the exception could be catched and generate another one which present 3.3 to the end user?
Zoffix jsimonet: there's no 3.3 tho 10:11
jsimonet: the error is generated by .gist call on Rat that has 33 in numerator and zero in denominator
nine Darn...camelia's perl does not seem to be compiled with -fPIC anymore 10:12
Zoffix No catching is needed. Just a better exception can be through, like we do in Rational.ceiling: github.com/rakudo/rakudo/blob/nom/...pm#L73-L76 10:13
s/through/thrown/;
jsimonet Zoffix: my bad, ok thank you :) 10:15
Zoffix m: say (3.3/0).Int 10:17
camelia Attempt to divide by zerowhen coercing Rational to Int
in block <unit> at <tmp> line 1
Zoffix
.oO( you had one job... )
jsimonet I can thy to find and fix it :)
Zoffix jsimonet: the missing space is the `$_ with $.details` in this commit should be `" $_" with $.details`: github.com/rakudo/rakudo/commit/e2...fbf645597c 10:19
nine m: EVAL 'print "hello world"', :lang<Perl5> 10:20
camelia hello world
nine alexk: fixed it^^^
Zoffix jsimonet: And the poor error for the "division by 33" I think can be improved by doing the same exception throwing code as here github.com/rakudo/rakudo/blob/nom/...pm#L73-L76 but in method Str instead: github.com/rakudo/rakudo/blob/nom/...nal.pm#L86 10:21
alexk nine++
m: use Inline::Perl5; my $p5 = Inline::Perl5.new; $p5.run(q|my @a; for (1..500_000) { @a = split(/[,;]/, 'a,b,c;d,e,f')}|); say now - INIT now; 10:22
camelia 0.8041398
nine m: EVAL q|my @a; for (1..500_000) { @a = split(/[,;]/, 'a,b,c;d,e,f')}|, :lang<Perl5>; say now - INIT now; 10:23
camelia 1.0882945
nine m: EVAL q|my @a; for (1..500_000) { @a = split(/[,;]/, 'a,b,c;d,e,f')}|, :lang<Perl5>; say now - INIT now;
camelia 0.899915
nine I guess it's a bit higher as it measures the time to load Inline::Perl5, too 10:24
alexk nine: that's ok - just to get an idea how fast perl5's split is ... 10:26
nine ~ crazy fast? ;) 10:27
alexk yeah - especially compared to perl6's regex split ... 10:28
timotimo it's not news that perl6 regexes have gigantic overhead for start/stop 10:29
nine There's so much left to do in the compiler...
jnthn There always will be. :-) 10:30
Given the number PhDs earned each year coming up with shiny new optimization techniques :)
nine We could for example statically optimize a split(/[,;]/, 'a,b,c;d,e,f') to 'a,b,c;d,e,f'.split((',', ';')) 10:34
timotimo yeah if regexes kept around some more info about their contents 10:37
that'd also be nice for stuff like ~~ m/"foo"/ being turned into a .contains call 10:38
(same with starts-with and ends-with if there's a ^ or $)
(except some newline handling shenanigans
i guess)
Zoffix ? what sort of shinanigans? 10:39
Perl 6's $ isn't magical like Perl 5, is it?
m: say "foo\n" ~~ /foo$/ 10:40
camelia Nil
timotimo ah, that's nice
sacomo hi all 11:03
Juerd I used any() in method arguments for the first time. It's amazing how that let me express my thoughts in code with almost no translation 11:11
And especially, no annoying loop to distract me from what I was doing. 11:12
Juerd Is there a way to filter output from put and say, similar to Perl 5's TIEHANDLE? 11:23
timotimo you can override $*OUT, if you use "but" and a role you'll "keep" whatever was set before 11:28
i.e. if that was already a "magical" thing
Juerd Hm, overriding is a start. But how do I hijack the output to modify it? And can I still access the original $*OUT to prevent recursion? 11:35
timotimo you can make your role parametric and stash the original $*OUT in the parameter
my $*OUT = $*OUT but ChangedFrom[$*OUT];
lizmat timotimo: that won't work 11:36
m: my $*OUT = $*OUT; note $*OUT
camelia (Any)
lizmat it's a trap I got into recently myself
m: temp $*OUT = $*OUT; note $*OUT 11:37
camelia IO::Handle<IO::Special.new("<STDOUT>")>(opened)
timotimo ah, of course
that's better
m: role SaysParameter[$foo] { say $foo.perl ~ " is the parameter; }; temp $*OUT = $*OUT but SaysParameter[$*OUT] 11:38
camelia 5===SORRY!5=== Error while compiling <tmp>
Unable to parse expression in double quotes; couldn't find final '"'
at <tmp>:1
------> 3p $*OUT = $*OUT but SaysParameter[$*OUT]7⏏5<EOL>
expecting any of:
postfix
timotimo m: role SaysParameter[$foo] { say $foo.perl ~ " is the parameter"; }; temp $*OUT = $*OUT but SaysParameter[$*OUT]
camelia IO::Handle.new(path => IO::Special.new("<STDOUT>"), chomp => Bool::True, nl-in => $["\n", "\r\n"], nl-out => "\n", encoding => "utf8") is the parameter
timotimo m: role SaysParameter[$foo] { say $foo.perl ~ " is the parameter"; }; temp $*OUT = $*OUT but SaysParameter[$*OUT]; say $*OUT.perl ~ " is the modified one"
camelia IO::Handle.new(path => IO::Special.new("<STDOUT>"), chomp => Bool::True, nl-in => $["\n", "\r\n"], nl-out => "\n", encoding => "utf8") is the parameter
IO::Handle+{SaysParameter[IO::Handle]}.new(path => IO::Special.new("<STDOUT>"), chomp => Bool::True,…
timotimo cool. 11:39
Juerd m: temp $*OUT = $*OUT but role { method print { die 42 } }; print "doesn't die" 11:42
camelia Too many positionals passed; expected 1 argument but got 2
in method print at <tmp> line 1
in block <unit> at <tmp> line 1
timotimo it's not guaranteed that the print sub translates to a print call on the $*OUT
lizmat m: temp $*OUT = $*OUT but role { method print(|) { die 42 } }; print "doesn't die" 11:43
camelia 42
in method print at <tmp> line 1
in block <unit> at <tmp> line 1
timotimo currently the IO::Handle class isn't very friendly to subclass
oh, well, i guess that's that :)
Juerd Ooh, what is | called?
lizmat basically it's short for an unnamed capture
timotimo anonymous capture
Juerd And why does this work? :) 11:44
lizmat because sub print calls $*OUT.print ?
Juerd I mean, why does it work with (|) but not without?
lizmat because then you have a method that doesn't accept any parameters except the object 11:45
hence the "expected 1 but got 2"
Juerd Ah, right. Brain's still stuck in Perl 5 land regarding arguments sometimes
timotimo if you had used @_, it would have worked, no? 11:46
lizmat I believe you want sub print(*@_) { } then
Juerd And the 1 but got 2 thing doesn't fully register because the invocant is counted too :)
Ran into that a few times, can't get used to it :(
lizmat yeah, actually, that feels like an LTA error message
because the error message *does* know it's about a method 11:47
Juerd Hah, the "$*OUT but" thing actually works 11:50
m: role x[$p] { method print(Str:D $x) { $p.print($x.subst(" ", "-", :global)) } }; temp $*OUT = $*OUT but x[$*OUT]; print "first test"; say "second test"; put "third test";
camelia first-testsecond-test
third-test
Juerd And all this because I need a feature in ansi escape sequences that doesn't exist: restore previous color. 11:51
So I'll just parse the string, keep a stack and pop that with a custom ansi-ish escape. 11:52
There's not inverse 'when', is there? 11:54
I have a few ugly "when $_ !~~ ..."
I guess I could do "when none ..." 11:55
moritz
.oO( unwhen )
11:59
jnthn m: for 'foo', 'bar' { when !/a/ { say 42 }; default { say 0 } } 12:00
camelia 42
0
jnthn Since /a/ in boolean context evaluates against $_ then you can just negate the result 12:01
m: for 'foo', 'bar' { when not /a/ { say 42 }; default { say 0 } }
camelia 42
0
jnthn Or that if you prefer it longer :)
Juerd jnthn: That works for regexes, not for classes :) 12:24
s/classes/types/
jnthn ah, you didn't even mention a regex :) 12:25
moritz for types, none(Str) works
Juerd moritz: I think it works for everything?
jnthn Not sure why I conclueded that :)
moritz Juerd: presumably, yes
rindolf Hi all! github.com/shlomif/perl6-examples/...shlomif.p6 is really slow - why? And what can be done about it? 12:59
rindolf github.com/shlomif/project-euler/b...43_v2.bash - this equivalent program in bash and perl 5 is much faster 13:02
moritz rindolf: donate to www.perlfoundation.org/perl_6_core_...pment_fund 13:05
jnthn Perhaps use native types in factor
rindolf jnthn: ah 13:08
jnthn But yeah, otherwise there's no much for it except letting the optimizer get better at dealing with non-native integer stuff 13:09
rindolf jnthn: docs.perl6.org/type.html - do you mean "int"? 13:10
jnthn Yes
rindolf jnthn: ok
perlpilot rindolf: btw, no need for parens around your conditionals. (I only mention it because it looks weird to me now :) 13:12
rindolf perlpilot: ok 13:12
rindolf jnthn: ok - converted to "int" - it is still very slow - github.com/shlomif/perl6-examples/...shlomif.p6 - hit reload 13:19
lucasb rindolf: maybe drop the "return" word 13:35
is that still a thing in rakudo or it has been optimized?
perlpilot rindolf: Here's that shell+P5 version converted to shell+P6: gist.github.com/perlpilot/434bea65...09e4bf6dc6 by my timing, it's slightly faster than the P5 version, but that's probably noise. 13:38
rindolf perlpilot: i see 13:39
lucasb perlpilot: maybe you like the style, but I'm just pointing out that you don't need the extra backslash at "... | factor | \" :) 13:40
perlpilot rindolf: btw, did you try profiling your pure Perl 6 version? 13:41
rindolf perlpilot: i did 13:41
perlpilot lucasb: nah, I just copied rindolf's and changed stuff. He had the \ :)
lucasb ah :)
Juerd Is there a way to determine whether an exception is a built-in Perl 6 exception type? 13:42
perlpilot Juerd: I doubt it. 13:44
moritz Juerd: not really; that's rarely a useful distinction
perlpilot Juerd: I guess you could grep rakudo/src/core/Exception.pm to see if it appears there 13:45
Juerd moritz: I think it is. The built-in ones indicate programming errors, whereas the ones I add are mostly user errors.
moritz maybe you can look at CORE:: if it's in there somewhere
Juerd perlpilot: Yep, did do that. They all just inherit from Exception only
Of course, I can decorate my own exceptions. Was just curious if I had to 13:46
lucasb maybe differentiate the ones that are under the "X::" namespace and those that are not 13:47
Juerd lucasb: That's harder because smart matching doesn't do prefixes or wildcards :) 13:48
perlpilot lucasb: sure, that would be by convention though ... nothing stopping someone from violating that convention. (might really matter when it's a 3rd party lib that does so)
Juerd In my current use case, the difference between X::AdHoc and everything else is good enough
Juerd Where I'm assuming that all "die Str" are user input errors, and the rest are unexpected. 13:49
lizmat we have some die's still in core though :-( 13:51
Juerd Oh :(
I'll probably create my own exception type with some syntactic sugar then
lizmat it appears freenode is going to do something new: freenode.net/news/freenode-live 13:52
perhaps something for #perl6 people to show up for? freenode.net/news/freenode-live-exhibit
lizmat afk for a bit& 13:54
rindolf perlpilot: the Perl 5 translation of my p6 code is also slow - github.com/shlomif/project-euler/b...shlomif.pl 14:00
perlpilot: thanks!
araraloren Can anyone use MAC help me ? What's the value of $*KERNEL under OSX ? 14:50
gdonald darwin (16.6.0) 14:53
araraloren gdonald, thanks 14:54
hythm hello perl6, I'm working in a file parsing program, wrote Grammar actions class with a hash attribute, and wrote the action method that is called after each line to insert into the hash. I can print the hash content from the method, but when I print it from MAIN it's empty. 15:21
what am i missing? here is the code gist.github.com/hythm7/f80b2d291df...437b72fcef
timotimo i suggest you leave out passing "my %logs" to LogActions.new (so that a new hash gets created for you in the actions class) and then grab it out using the action class' .logs method 15:23
moritz hythm: you seem to be doing a weird mixture of passing around hashes but also modifying a shared hash. I suggest you settle for one paradigma (preferrably returning data instead of mutating it in place)
hythm timotimo makes sense, trying that now 15:25
moritz, i think you are right, this weird mixture is probably due to not fully understand this part of passing data yet, i need to read more on that 15:28
Zoffix araraloren: note that $*KERNEL is an object, not a string. 15:56
m: $*KERNEL.^methods.say
camelia (BUILD name version release hardware arch archname bits signals signal Str gist auth signature desc)
moritz m: say $*KERNEL.^name 16:03
camelia Kernel
araraloren .tell Zoffix Got it, thanks! 16:14
yoleaux araraloren: I'll pass your message to Zoffix.
Zoffix . 16:15
yoleaux 16:14Z <araraloren> Zoffix: Got it, thanks!
araraloren m: say $*KERNEL
camelia linux (4.4.70.18.9.default)
araraloren m: say $*KERNEL.WHAT 16:15
camelia (Kernel)
araraloren m: say "maybe linux ?" if $*KERNEL ~~ /^linux/ 16:16
camelia maybe linux ?
araraloren Night!
Good night.
Zoffix m: say "maybe linux ?" if $*KERNEL.name eq 'linux';
camelia maybe linux ?
mr_ron I am interested in learning a bit about garbage collection. Yesterday I showed a MoarVM memory panic on #perl6-dev - irclog.perlgeek.de/perl6-dev/2017-...i_14893012 . I reproduced it on my system and it looks like the concatenation just keeps gobbling memory, never frees and eventually runs out. In this case when memory runs out shouldn't the GC try to recover some? 16:46
ugexe if memory runs out what memory would the GC use to recover memory? 16:47
mr_ron The total string length is 7_000_000 characters and the ulimit is 1 GB 16:48
mr_ron I guess I am not clear on whether the problem is a memory leak of some kind or a GC failure 16:52
ugexe if you run with `perl6-valgrind-m` it might give you some insight 16:56
mr_ron never ran valgrind before but just installed and trying ... 17:02
ugexe gist.github.com/ugexe/f0b471d176de...804f5bca09 <- this is the summary I got from it, although I'm not sure what to extrapolate from it 17:03
hythm timotimo when I understood that part of not passing %log to the Actions class and made the change in the gist, but what I dont understand is how to grab %logs out, If I used LogActions.new.logs it will be empty because it creates a new object. 17:07
timotimo right, you will want to store your LogActions.new in a variable, pass it to the parse call and later grab $my-log-actions.logs to get the hash 17:08
hythm aaah
right
thanks
hythm worked :) 17:13
mr_ron ugexe: your gist seems to show 10GB of heap usage. Looks like a problem. No? 17:16
ugexe i just reran after building with a rakudo built from HEAD and it was `2,093,230,194 bytes allocated` with the same number allocs and frees 17:26
approx the same anyway
mr_ron If I set a "ulimit -v 1024000" the in use at exit goes way up to 1/2 GB. Maybe the in use at exit if it runs to completion allows for freeing some extra memory. 17:29
ugexe probably samcv's recent commits in moarvm are responsible for the reduced bytes allocated github.com/MoarVM/MoarVM/commits/master 17:30
timotimo is working on something 17:31
mr_ron doing rakudobrew build moar now .. don't know if that will get those commits ...
ugexe no no, rakudobrew build moar-blead 17:32
mr_ron thx
ugexe and if you ever want to update moar-blead, always do `rakudobrew nuke moar-blead` before doing `rakudobrew build moar-blead` again 17:33
timotimo mr_ron: what real-world code are you trying to simulate with this repeated concatenation benchmark? 17:34
ugexe he is tryign to learn about garbage collection 17:35
timotimo ah
mr_ron There is no real world use case. Perl 5 has no problems here. For large cases p6 is much slower and runs out of memory. 17:36
Cannot build Rakudo with backend 'moar-bleed': this backend does not exist.
ugexe blead, not bleed
mr_ron thx
timotimo i just put in something very similar to what we have for bigints that causes GC to run more often when huge objects are created 17:37
the thing is that the GC-managed portion of the MVMString is the same size no matter how many characters are in it 17:38
so we have to teach the GC to count some extra for such big objects
anyway, 500_000 still takes ages
memory usage sawtooths like crazy 17:39
timotimo 500000: 586.6925867 17:41
462.79user 118.04system 9:46.97elapsed 98%CPU (0avgtext+0avgdata 5392876maxresident)k
so "only" 5 gigs 17:42
timotimo running it without that stuff to see how many iterations it survives and when it reaches the same memory usage 17:44
ugexe its significantly faster and uses less memory if you type the $x and $y to str
timotimo interesting
ugexe 5.5s vs 0.2s for me on 50k 17:46
timotimo oh wow
can you --profile that at all?
ugexe just add --profile?
timotimo yeah
mr_ron you mean my - yes what do you want "--profile"d
s/my/me 17:47
ugexe m: for (50_000) -> $limit {my str $x; my str $y = "x" x 100; $x ~= $y for (1..$limit); say "$limit: ", now - ENTER now}
camelia 50000: 0.062815
timotimo i think it touched the 5 gigs just now, but htop didn't refresh often enough to see
at like 370k 17:48
ugexe m: for (50_000) -> $limit {my Str $x; my Str $y = "x" x 100; $x ~= $y for (1..$limit); say "$limit: ", now - ENTER now}
camelia 50000: 6.2019572
timotimo yeah, it takes 410k to reach the same amount of ram that it tops out at with my patch 17:49
um, what 17:51
with str instead of Str it finishes using just 80368maxresidentk
timotimo that's 80 megs 17:51
mr_ron is "MoarVM version 2017.07-6-ga739fc8" blead? 17:58
ugexe yes
my $x; my str $y; is all that is needed 18:01
timotimo seems so 18:02
mr_ron "my str $y" works for me but with blead and a count of 100_000 (without str $y) valgrind shows "in use at exit 2 GB" with the MoarVM panic 18:05
mr_ron I need to move on to other things right now but but thank you both for all of the insights. 18:07
timotimo 99% time spent in collapse_strands
mr_ron timotimo: was your biting thing a MoarVM issue or an RT ticket?
timotimo: was your bigint thing a MoarVM issue or an RT ticket? 18:08
timotimo i can push it as a branch 18:08
ugexe "💩 " x 100 triples the time with Str, but it stays the same with str too 18:09
mr_ron I'll review the logs tomorrow and try and decide if an RT ticket still makes sense. Thanks again. 18:11
Juerd Is $foo.+method supposed to call multiple candidates of multi methods? 18:12
If not, I think the documentation is inaccurate.
If so, I think it's broken.
timotimo For any method name, there may be some number of candidate methods that could handle the request: typically, inherited methods or multi variants. The ordinary "dot" operator dispatches to a method in the standard fashion. There are also "dot" variants that call some number of methods with the same name: 18:15
$object.+meth(@args) # calls all methods (1 or more, die if none) 18:16
ugexe m: role Bar { method xxx($a) { say $a * 2 } }; class Foo { method xxx($a) { say $a } }; my $foo = Foo.new; $foo does Bar; $foo.+xxx(1) 18:17
camelia 2
1
jnthn .? and .+ and .* are just about the MRO 18:24
.+ and .* will call a candidate that it finds at each level of the MRO 18:25
Multi-dispatch is orthogonal to this. In each class with multi candidates, there is a proto method that dispatches to the appropriate candidate
The proto if not present being produced by cloning the one in a parent class, if relevant 18:26
Or making a new one with an empty candidate list otherwise
Juerd Thanks for the explanation, I'll file a doc bug 18:33
Juerd Done: github.com/perl6/doc/issues/1421 18:38
nine I don't get this. I have a BOOTStr (i.e. a P6Str) in NQP. I unbox_s it, yet it still remains nqp::isstr? How do I get at the darn string? 18:46
timotimo but if you have nqp::isstr it already is a string? 18:47
nine Apparently not. The isstr op seems to check for P6str: GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_P6str ? 1 : 0; 18:48
jnthn nine: nqp::isstr takes an object, so if you nqp::isstr(nqp::unbox_s($s)) then it will box the result of the unbox
nine Also if I $err.print() it, it complains about the string being NULL
jnthn nqp::isnull_s(nqp::unbox_s($s)) will tell you if a null string got boxed, if that's what you're after
nine Ah isnull_s! 18:49
Zoffix nine: ah, right, I should've mentioned the latest code in nqp for that area isn't doing much :} along with needing nqp::isnull_s instead of nqp::isnull that nqp::can($error, 'message') is always false 18:51
nine Zoffix: yeah, because it's not the $error but $error's payload we need to check 18:52
Fix pushed 18:54
Zoffix huh :|
Zoffix I don't get how that works. 18:56
nine Does it at least work?
Zoffix You didn't test? :)
nine I did with the one test case :) 18:57
Zoffix Ok then :)
I thought $error was nqp-type exception, not Exception.pm6 exception 18:58
timotimo maybe through the P6EX mechanism?
Zoffix timotimo: where is it?
Geth ecosystem: 3abfcbdb8b | (Tony O'Dell)++ (committed using GitHub Web editor) | META.list
Add YAML::Parser::LibYAML
Zoffix I see this github.com/rakudo/rakudo/blob/nom/...#L343-L355 19:00
Well, I'm disappointed such an easy fix eluded me last night :)
nine++
nine Well it's a small fix, but the isnull_s thing made it not exactly easy 19:02
jnthn++ # without that hint, I'd still scratch my head :)
Juerd What would be an idiomatic way to call multiple candidates of a multi method? 19:03
Zoffix nine: that makes me feel even worse, because both the nqp::null was added by my hand AND last night I found out it was supposed to be nqp::null_s, but because changing that alone didn't fix the original problem I never commited it :P 19:11
Zoffix Juerd: call why? 19:14
m: multi x(Int) { say "Int" }; multi x(Cool) { say "Cool" }; multi x(Any) { say "Any" }; $_(42) for &x.cando(\(42))
camelia Int
Cool
Any
Zoffix I've no idea what you're trying to do 19:15
Juerd I have a bunch of objects, and am doing things based on a role
Juerd I built it the wrong way around, and instead of having methods in the roles, I was trying to do a multi method somewhere else 19:16
It did make me curious if that could have worked. Apparently, it could :)
Hm, I can't do it with methods in the roles because that wouldn't compose...
Meh.
Some objects will do multiple roles 19:17
Juerd I currently do this: gist.github.com/Juerd/b26ab3fbb704...1b9ba429ad 19:21
ugexe m: role Bar { method xxx($a) { say $a * 2 } }; role Baz { method xxx($a) { say $a * 3 }; }; class Foo { method xxx($a) { say $a } }; my $foo = Foo.new; ($foo does Bar) does Baz; $foo.+xxx(1)
camelia 3
2
1
Juerd I don't understand why that works 19:22
nine Zoffix: well, all's well that ends well :) 19:26
hythm m: class TestActions { method TOP ($/) { say so "abc" ~~ /abc/ } }; TestActions.new.TOP($/) 19:27
camelia Cannot assign to a readonly variable ($/) or a value
in method TOP at <tmp> line 1
in block <unit> at <tmp> line 1
hythm I understand that it's trying to assign $/ which is already in TOP scope, but how to match against regex inside grammar actions method? 19:28
jnthn Call the parameter something else 19:29
Zoffix m: class TestActions { method TOP ($foo) { say so "abc" ~~ /abc/ } }; TestActions.new.TOP($/) 19:30
camelia True
jnthn (Also, it's a bit of a code smell to be doing parsing in the actions, that would ideally have been taken care of in the grammar.)
Zoffix And access stuff via $foo<bar> instead of $<bar>
jnthn Juerd: Works because each mixin is a new level of inheritance
shopping & 19:31
Juerd jnthn: I thought roles didn't do inheritance. Apparently they sometimes do?
ugexe consider the difference with `($foo does Bar) does Baz` and `$foo does (Bar,Baz)` 19:35
Juerd Hmm 19:36
hythm Thank you jnth and zoffix, that fixed the problem. looking now onto making grammar take care of that match better 19:39
jnthn Juerd: The role itself is composed rather than inherited. The `does` trait (in class C does R { }) composes the role into the class. The `does` infix operator performs a runtime mixin, meaning it creates an anonymous subclass of the type of the LHS, composes the role into that subclass, and then changes the type of the object to that new anonymous subclass. 20:19
class C does R1 does R2 { } will detect conflicts between R1 and R2; $x does (R1, R2) will do similar (it only creates one anon subclass and composes the roles into both) 20:20
Juerd I didn't know the difference between 'does' as a trait and 'does' as an infix was so big 20:21
jnthn They're both composing roles into something, just in one case it's the class being declared (compile time) and in the other case into an individual object (runtime). 20:25
And the latter is done by the very same mechanism as the first, it's just an anonymous subclass they're being composed into 20:26
But it runs the same composition code otherwise :)
bbiab 20:27
Juerd When is a package defined? I'm getting "The following packages were stubbed but not defined", but I have classes for them. 20:32
I'm able to work around my circular dependencies with 'augment' but it feels icky :D 20:37
nadim goood evening, can someone, who preferably knows html, have a look at this file drive.google.com/open?id=0B2cpZf_W...XdvX0hKSkE it's a rendering of a data dump, three actually 20:45
I'd like to know if it is possible to avoid the blue border around the button once it is clicked
also when an element of the structure is folded, it is not easy to see that it is folded, don't really know how to make folded data look like folded data, ideas welcome 20:46