»ö« 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.
SmokeMachine____ hi there! I'm trying to find a documentation showing how to make a class that extends the Hash... do any one here know where can I find it? 01:32
kid51 What, specificially, do you mean by "extends"? 01:37
kid51 notes that the string 'extend' is not found in either doc.perl6.org/type/Hash or doc.perl6.org/language/classtut 01:38
SmokeMachine____ "class Bla is Hash"
kid51 At the second of the two links above, search for subhead "Multiple inheritance" 01:39
timotimo you don't need multiple inheritance 01:43
sortiz SmokeMachine____, There are dozens of classes in Perl 6, I doubt there is specific documentation for any particular, If you need to create a hash like new class, I recommend you to read doc.perl6.org/language/subscripts#Custom_types 01:44
kid51 Also: perl6intro.com/#_multiple_inheritance
ugexe just use monkey typing for everything 01:45
augment all the classes 01:46
timotimo the custom types part of the subscripts document is excellent for what you need, SmokeMachine____
who wrote that? :)
sortiz SmokeMachine____, So if you need a hash like class, instead of inherit from Hash, you should implement the Associative role: "class Foo does Associative { ... }" 01:54
sortiz \o #perl6 01:55
timotimo that's probably a better idea, true 01:56
otherwise, you can have a class that "has %.storage handles <AT-KEY EXISTS-KEY DELETE-KEY BIND-KEY>" 01:57
sortiz That is a trivial example, yes. 01:58
SmokeMachine____ thank you all 02:02
BenGoldberg_ m: my @a; my $x = 1; @a[0] := $x; ++$x; dd @a; 03:13
camelia rakudo-moar fb74ab: OUTPUT«Array @a = [2]␤»
BenGoldberg m: my @a; @a[*] = 'i like'; @a[*] = 'pie'; dd @a; 03:19
camelia rakudo-moar fb74ab: OUTPUT«Array @a = []␤»
BenGoldberg m: my @a; @a[*+0] = 'i like'; @a[*+0] = 'pie'; dd @a;
camelia rakudo-moar fb74ab: OUTPUT«Array @a = ["i like", "pie"]␤»
Herby__ Evening, everyone! 03:39
Herby__ \o 03:40
dalek Iish: 2a36f59 | (Salvador Ortiz)++ | lib/DBDish/mysql/ (3 files):
mysql: Post oracle merge repairs
04:54
pmurias if I want to start creating a p6tidy what's the best way to get hold of the Perl 6 grammar? 09:24
dalek osystem: e2a5cd2 | okaoka++ | META.list:
Add Algorithm::TernarySearchTree

See github.com/okaoka/p6-Algorithm-Ter...SearchTree
09:35
osystem: 87157e1 | RabidGravy++ | META.list:
Merge pull request #161 from okaoka/add-ternary

Add Algorithm::TernarySearchTree
lizmat good *, #perl6! 09:37
brrt ehm, has anybody taken a shot already at reencoding the FOSDEM videos 10:08
lizmat good question: sometimes I think I've given up on FOSDEM recording anything altogether :-( 10:09
brrt i can actually reencode them, but i'll need to know their approximate lengths 10:10
and a place to upload them 10:11
lizmat talks were max 50 minutes, I seem to recall
brrt hmmm
let me check if i can make something work
lizmat but isn't this really a case of garbage in garbage out? 10:12
brrt no
nine_ brrt: I can provide the webspace. But I'd give the FOSDEM people a bit more time before investing a lot of time myself.
lizmat I mean, wouldn't you need access to the raw sources?
brrt videos are OK
its the headers that are bad
pmurias do we have a recommended code formatting guide? 10:32
llfourn_ not that I've seen 10:33
brrt somehow after a while the videos keep on looping. if i can figure out where that is, i can cut off the video before, and get a well-formed file 10:36
also, i can crop the video to the exact position of the video stream
dalek kudo/nom: c70a18e | lizmat++ | src/core/native_array.pm:
Make int @a.append(1) 1800x faster

by not making it take the long, slurpy array -> flattening route
10:44
kudo/nom: ced5fbf | lizmat++ | src/core/native_array.pm:
Make int @a.append(int @b) 6x faster

by not making it take the long, slurpy array -> flattening route
lizmat and there's more where that came from ^^^ 10:45
brrt \o/ 10:46
lizmat .tell jnthn there's something strange with reading a 2.5MB file with slurp: with nqp::readallfh it takes about 80ms, with nqp::readfh with the size of the file as a buffer, it takes 350 msec (like 4x as long) 10:49
yoleaux lizmat: I'll pass your message to jnthn.
lizmat .tell jnthn I would expect the unicode handling to make things *slower*, but instead it's 4x faster than binary ?
yoleaux lizmat: I'll pass your message to jnthn.
nine_ I now have a working version, where use NativeCall; will use the precomp files created during installation :) Including it's dependencies :) 10:51
brrt nine_++ 10:53
lizmat nine_ ++
RabidGravy nine_++ # I don't know what that implies but it sounds like it deserves appreciation 10:55
llfourn nine_++
lizmat takes a few secs of each spectest run for me
dalek kudo/nom: d740258 | lizmat++ | src/core/Buf.pm:
Rename private method to something more appropriate

Also, lose the start position parameter, because we're not going to use it in the foreseeable future.
11:07
brrt .tell moritz seems the logging bot doesn't work in #moarvm 11:09
brrt lunch &
yoleaux brrt: I'll pass your message to moritz. 11:10
ely-se p: say ((0, 1) Xlcm (0, 1)) eqv ((0, 1) X&& (0, 1)) 11:14
ely-se p6: say ((0, 1) Xlcm (0, 1)) eqv ((0, 1) X&& (0, 1)) 11:14
camelia rakudo-moar d74025: OUTPUT«True␤» 11:15
moritz restarts ilbot 11:15
yoleaux 11:09Z <brrt> moritz: seems the logging bot doesn't work in #moarvm
ely-se p6: say ((0, 1) Xgcd (0, 1)) eqv ((0, 1) X|| (0, 1))
camelia rakudo-moar d74025: OUTPUT«True␤»
ely-se :)
lcm is && and gcd is ||
moritz .tell brrt ilbot fixed
yoleaux moritz: I'll pass your message to brrt.
nine_ RabidGravy: it means that users will no longer have to wait for precompilation on first run after installing a module. And that we will store much fewer files in ~/.perl6 or scattered around .precomp directories 11:18
FROGGS o/ 11:30
lizmat FROGGS \o 11:31
psch \o 11:34
lizmat theperlfisher.blogspot.nl/2016/02/f...pt_28.html # DrForr++ 11:38
RabidGravy nine_, that is cool yes :) 11:43
dalek kudo/nom: 50f2aaf | lizmat++ | src/core/Buf.pm:
Make Buf.EXISTS-POS(1) 7x faster

By letting rakudo take care of the unboxing itself, and not creating a variable: this probably allows it to be inlined better, even though the unboxing is now happening twice on the "in range" code path.
11:45
RabidGravy Perl6++ # so there I was in the shower and I suddenly had the horrible realisation that I couldn't deal with subsets, and it's so easy that it's already sorted 11:51
RabidGravy I do think however "subset Foo of Int; Foo("10") ' should be made to work if the refinee can do that kind of coercion 11:53
there's probably a whole bunch of things I haven't considered but I'd say it wouldn't be that difficult to do 11:54
dalek kudo/jvminterop: 7e45d6b | peschwa++ | t/03-jvm/01-interop.t:
Correct two tests for multi candidate interop.

Between the original creation of this test and now something changed wrt iteration over utf8 object in Perl 6. The updated tests reflect this different behavior.
11:56
kudo/jvminterop: 7799dbf | peschwa++ | src/vm/jvm/runtime/org/perl6/rakudo/RakudoJavaInterop.java:
Make name => CodeRef pairs show up in the Metamodel.
kudo/jvminterop: d4b71b7 | peschwa++ | src/vm/jvm/CompUnit/Repository/Java.pm:
Remove unused function.
kudo/jvminterop: 45c205a | peschwa++ | src/vm/jvm/runtime/org/perl6/rakudo/RakudoJavaInterop.java:
Clean up and correct JavaHOW field assignments.

This adds Java class wrapper methods to .^methods and .^method_table while leaving out generated helpers like e.g.
  "method/mmd+update/([Ljava/lang/Object;)Ljava/lang/Object;".
kudo/jvminterop: 6524d45 | peschwa++ | src/vm/jvm/Perl6/Metamodel/JavaHOW.nqp:
Provide JavaHOW.parents(), just so nothing complains.
psch RabidGravy: subsets as coercers..? 11:57
psch doesn't understand the intent
lizmat RabidGravy: doesn't really go towards a .COERCE method., like we have .ACCEPTS ? 11:58
so Foo(bar) would call Foo.COERCE(bar) 11:59
RabidGravy Well if one has some kind of parser that winds up with something like "sub parse-atom(Str $val, Real $type) { $type($val) }" then that will blow up if infact $type is a coercion 12:00
so you would have that and then "multi sub parse-atom(Str $val, $type where *.HOW ~~ Metamodel::SubsetHow) { parse-atom($val, $type.^refinee }" 12:01
modulo the missing brackets 12:02
RabidGravy it would be easy-ish to make the latter step happen under the hood rather than blowing up with the useless "cannot invoke this object" 12:03
RabidGravy s/$type is a coercion/$type is a subset/ above 12:04
psch how would that deal with coercing values outside of the subset to the refinee?
RabidGravy sorry I'm not quite sure what you mean 12:05
ah, it would just blow up when it hits the subsetted target
RabidGravy as it would do anyway 12:05
psch ah, so something like < my Foo $x = parse-atom("10", Foo) > dying in the assignment, and not in parse-atom 12:06
RabidGravy yea
RabidGravy one could of course check the refinment in the sub but that's un-neccessary 12:07
psch hm, feels too late to me, fwiw. as in, < Int("foo") > dies on it's own already, but < Foo("10") > wouldn't 12:08
but i guess that's mostly in how Subsets work in general
they do kind of work like where constraints on containers, don't they 12:09
which means coercion to something that should fit can only complain when it doesn't, and not when it can't be coerced..
well, it's consistent enough with my understanding at least vOv
RabidGravy yeah that would happen anyway with "subset Foo of Int where * < 99; my Foo $a = Int("foo");" 12:10
psch right, that blows up in Int(), but replacing "foo" with "100" blows up in the assignment
RabidGravy right, so "my Foo $a = Foo("100")" would blow up in the assignment too (rather than "cannot invoke this object") 12:14
psch yeah, i think i like that. it frees up module users from knowing the subset refinee (or jumping through the MOP) to coerce 12:15
RabidGravy which (for what I'm doing right now,) seems like the right thing
RabidGravy anyhoo, this came to me when I *thought* I had finished this module and was just making the documentation 12:20
this seems to be a recurring thing with this particular thing
dalek kudo/nom: 85c18aa | lizmat++ | src/core/Buf.pm:
Make Buf.Numeric|Int a few percent faster

By removing an additional layer of indirection
12:25
Woodi hi #perl6 :) 12:26
dalek kudo/nom: 1e33bc5 | lizmat++ | src/core/Buf.pm:
Make Buf.bytes about 13x faster

By calculating the number of bytes per element at compose time, rather than every time we call .bytes
12:27
Woodi m: Real.max.rand; Int.max.rand; # not usefull
camelia ( no output )
Woodi m: say Real.max.rand; say Int.max.rand; # not usefull and visible
camelia rakudo-moar 50f2aa: OUTPUT«-Inf␤-Inf␤»
psch m: 5.rand.say 12:27
camelia rakudo-moar 50f2aa: OUTPUT«0.180473400462497␤»
lizmat Woodi: isn't that a matter of GIGO ?
Woodi lizmat: GIGO ?
lizmat m: dd int32.max.rand 12:28
camelia rakudo-moar 50f2aa: OUTPUT«-Inf␤»
lizmat now *that* is strange
psch m: say Real.max
camelia rakudo-moar 50f2aa: OUTPUT«-Inf␤»
psch that seems kinda wrong-ish..? :P
lizmat psch: no, that's correct
sjn \o
lizmat (been discussed at length before) 12:28
Woodi: Garbage In Garbage Out 12:29
psch lizmat: oh, right, .max is not MAX_VALUE, is it
?
Woodi but .rand should find something in the range...
psch m: say (0..-Inf).elems
camelia rakudo-moar 50f2aa: OUTPUT«0␤»
lizmat m: dd int32.Range.max.rand # must make it a range
camelia rakudo-moar 50f2aa: OUTPUT«928070625.042826e0␤»
lizmat m: dd int8.Range.max.rand # must make it a range
camelia rakudo-moar 50f2aa: OUTPUT«20.7272851815008e0␤»
lizmat m: dd int8.Range.pick 12:30
camelia rakudo-moar 50f2aa: OUTPUT«-37␤»
lizmat m: dd int8.Range.pick
camelia rakudo-moar 50f2aa: OUTPUT«125␤»
lizmat m: dd uint8.Range.pick
camelia rakudo-moar 50f2aa: OUTPUT«217␤»
lizmat m: dd uint8.Range.pick
camelia rakudo-moar 50f2aa: OUTPUT«213␤»
Woodi ok, use Range... 12:31
lizmat which won't work for Int/Real, because they range from -Inf..Inf
m: Int.Range.rand
camelia rakudo-moar 50f2aa: OUTPUT«Cannot modify an immutable Bool␤ in block <unit> at /tmp/Lt49YFHhCm line 1␤␤»
lizmat m: dd Int.Range.rand
camelia rakudo-moar 50f2aa: OUTPUT«Cannot modify an immutable Bool␤ in block <unit> at /tmp/ONwLXBqOU0 line 1␤␤»
lizmat hmmm... LTA error
please someone RT that
lizmat goes outside for a few hours...
Woodi how I can get long long int ? :) 12:32
psch that's int128?
Woodi possible...
thanx lizmat, psch
psch ah, wikipedia says long long int is at least 64 bits 12:34
so int64 12:35
which is probably better, 'cause we don't have int128 :)
Woodi not in one piece :)
moritz not yet 12:49
RabidGravy lizmat, looks like I'm going to have to benchmark some of the Audio::* modules before and after these changes - there is a lot of Buf -> Array -> CArray shuffling (in vaious orders) going on :) 12:51
sortiz I'm going to push a somewhat massive cleanup in DBIish, but the only user visible change is that now the FooDriver.Version method returns a Version, not a Rat. Internally I remove the 'Role' word from the long-names of the roles. 13:09
RabidGravy sortiz++ # sounds great, and loving your enthusiasm for cleaning up DBIish :) 13:19
sortiz RabidGravy, Pushed now, but dalek was dead, I'm waiting for travis-ci results. :) 13:21
dalek rl6-most-wanted: 43a7d09 | (Tom Browder)++ | most-wanted/modules.md:
add new module; correct WIP location of Geo::Ellipsoid
13:36
rl6-most-wanted: f6686bb | tbrowder++ | most-wanted/modules.md:
Merge remote-tracking branch 'upstream/master'

Conflicts: most-wanted/modules.md
rl6-most-wanted: 7a74d61 | tbrowder++ | / (5 files):
Merge remote-tracking branch 'upstream/master'
rl6-most-wanted: dd6ff6c | tbrowder++ | most-wanted/modules.md:
add memoize wanted for core like Perl 5
rl6-most-wanted: 0ce5428 | (Tom Browder)++ | most-wanted/modules.md:
Merge pull request #20 from tbrowder/master

Add memoize as most wanted (for core)
timotimo o/ 13:37
sortiz \o timotimo
lucs m: class Foo { has $!n; method N { $!n }; }; my $foo = Foo.new(42); say $foo.N; # How do the 「new」 and/or 「BUILD」 methods need to be written for this to work? 13:40
camelia rakudo-moar 1e33bc: OUTPUT«Default constructor for 'Foo' only takes named arguments␤ in block <unit> at /tmp/nDbehF3wjV line 1␤␤»
sortiz m: class Foo { has $!n; multi method new(Int $n) { self.new(:$n) }; submethod BUILD(:$!n) { }; method N { $!n }; }; my $foo = Foo.new(42); say $foo.N 13:52
camelia rakudo-moar 1e33bc: OUTPUT«42␤»
sortiz lucs, ^^^ 13:53
timotimo lucs: you could also use github.com/LLFourn/p6-AttrX-InitArg
ugexe memoize like core? isnt that `cached` trait? 13:54
lucs timotimo: Oh, neat. Thanks! 13:55
timotimo the cached trait is experimental, because we couldn't find a design that doesn't suck :)
psch doc.perl6.org/language/objects#Obje...nstruction is the docs, which looks pretty good from here
lucs psch: I wasn't able to figure it out from reading that :/ 13:56
psch oh right, your specific case is missing there...
it only says "please don't use the bless shortcut"
lucs sortiz: Er, thanks too! (misread who had supplied the first solution) 13:58
timotimo "don't use the bless shortcut", eh?
psch timotimo: well, paraphrase... :)
psch as in, < self.bless(:$x, :$y) > is shorter than writing new with pos params and BUILD instead 13:59
timotimo ah
timotimo for subclassability 13:59
psch but that is documented to screw with... right
psch ttps://gist.github.com/anonymous/8a57e90a0499511f1ea8 14:06
hrm, no "h" :/
gist.github.com/anonymous/8a57e90a0499511f1ea8 # for the extra lazy vOv
timotimo i am extra lazy 14:07
psch that doesn't explain the need for BUILD with private Attributes though
i'll check if that's mentioned somewhere else...
psch well, no idea if that diff is actually factual. as in, i don't know if redispatching to Any.new is actually *not* considered poor practice 14:10
timotimo well, redispatching to self.new is nice, because you also get "newer" new methods that way
brrt moritz: thanks :-) 14:12
yoleaux 11:15Z <moritz> brrt: ilbot fixed
psch docs are hard, lets write jvm bytecode /o\ 14:14
brrt has recoded 3/11 FOSDEM videos 14:16
interestingly, making them much smaller
buharin hey 14:18
I want to see video
but it appears to be broken
video.fosdem.org/2016/h2214/
timotimo yeah, it is :( 14:20
buharin greate 14:23
;s
timotimo this year we have an additional source for video recordings
i.e. we brought our own recording equipment in addition
Skarsnik hm, there is no POSIX stuff in the core? 14:27
nine_ nope
buharin DrForr, hey are you here? 14:27
timotimo that'd be ... kind of bad :)
Skarsnik so I need a module to translate this: strftime "%A, %B %d at %H:%M", localtime($chapter{time});
?
timotimo strftime isn't posix, is it? as in, other OSes ship that in their libc, too? 14:28
DrForr buharin: Yeah.
buharin DrForr, could you fix your blog?
RabidGravy it is part of the POSIX spec however
DrForr What's broken about it?
RabidGravy but yes you would need a module, I think there is one
RabidGravy but it would be relatively easy to make if there isn't 14:29
buharin DrForr, you should separate your code
buharin it is unreadable 14:29
Skarsnik I mean, there is no equivalent in perl6 core with datetime?
RabidGravy isn't that what formatters are for? 14:30
buharin Skarsnik, hey
timotimo we really need that prancer blog thing :) 14:31
RabidGravy github.com/supernovus/perl6-datetime-format
timotimo it'll be the first blog software to do things the right way. finally!
Skarsnik ah thx
The localised month/week day name is important ^^ 14:32
DrForr buharin: Do you have a plugin you can recommend? I tried a few but none seemed to work well.
buharin DrForr, no sorry
DrForr Also I added <code/> around the blocks but it didn't seem to do anything worthwhile. 14:33
RabidGravy does the old "stick it in github gist and use the embed" thing work in whatever you are using? 14:34
DrForr timotimo: Yeah, what I'm probably going to do once I get the core to work properly is refactor the h*ll ot of PearlBee and use that.
timotimo refactor pearlbee into perl6? ;) 14:35
DrForr RabidGravy: I've got a helluva lot of snippets, but I can try. 14:36
RabidGravy DrForr, before I forget I have two questions regarding prancer, a) is there scope for dispatch based on other than request path? (e.g. based on some authorisation?)
Skarsnik buharin, hello 14:37
RabidGravy and b) I'd like to plug in the websocket thingy, should that just work?
DrForr RabidGravy: Not at the moment, right now I need to work around some OO issues, once that's solved I do intend to tackle those issues. 14:38
Skarsnik did you write an async webscoket client RabidGravy ? x)
timotimo we have a websocket client and server in the ecosystem, btw 14:39
Skarsnik it's not async
timotimo OK
buharin Skarsnik, hi
RabidGravy the server is
Skarsnik hm, I can't have 2 whenever block in a react one? 14:40
timotimo of course
you can, i mean
RabidGravy yeah you can have as many as you want 14:42
DrForr OKay, found a formatter I'm happy with. 14:43
ugexe whats a suitable internal name for a an IO abstraction layer that works with IO::Paths, http urls, git urls, etc that does both write (.spurt, POST, push) and read? i just used `Fetch` before, but that doesnt work now that i want to add writes
timotimo virtual file system?
ugexe ah thats better
timotimo that's what gnome/glib calls it
ugexe that'll work. i didnt want to give the name to give the impression it followed the IO:: interfaces 14:44
timotimo mhm
RabidGravy m: react { whenever Supply.interval(1) { say "one second"; if $_ == 5 { done; }}; whenever Supply.interval(2) { say "two second" }} 14:45
camelia rakudo-moar 1e33bc: OUTPUT«one second␤two second␤one second␤two second␤one second␤one second␤two second␤one second␤one second␤»
Skarsnik Oh, nvm it's an error somewhere else 14:47
DrForr goes through the last of his Kriek. 14:50
RabidGravy Mmm Kriek 14:53
rudi_s Hi. Is this expected? 14:54
m: "test".split("x", :bla);
camelia ( no output ) 14:55
rudi_s I'd expect an error because :bla is not a valid parameter.
(In my case I tried :split_empty which should've been :split-empty.)
psch rudi_s: design.perl6.org/S12.html#Interface_Consistency 14:56
rudi_s That sounds awful. 14:57
It makes calling methods totally unsafe with no safeguard against typos.
ugexe thats one reason why BUILD is promoted over new id imagine 14:59
but ive seen the typo thing happen in rakudo itself
rudi_s What makes it even worse IMHO is that for subs the check is performed which is inconsistent and causes false expectations. 15:00
But I guess it's too late to fix that.
ugexe it probably enables all sorts of other goodies though 15:01
DrForr RabidGravy: Only picked up two bottles on the way back from FOSDEM. Wanted to find Frambois actually but this is close enough. 15:02
rudi_s Well, the check works for subs.
timotimo aye, because subs don't have anything like subclassing going on 15:03
RabidGravy there are ways to check if you really are that worried about it, but as it has been re-hashed several times I'll leave it as an exercis 15:04
psch m: class A { method foo(:$h) { say ":h handled" } }; class B is A { method foo(:$u) { say ":u handled"; nextsame } }; B.foo(:u, :h) # this breaks without interface consistency
camelia rakudo-moar 1e33bc: OUTPUT«:u handled␤:h handled␤»
rudi_s Yeah. Still would've been nice to get this additional check. 15:05
DrForr buharin: Updated with the new formatter. Does this work better?
If so I'll go back and do the same with the previous posts.
And then figure out how to translate pod6 markup into that format so I don't have to wear out my fingers editing. 15:06
rudi_s RabidGravy: Was that for me? 15:07
RabidGravy yes
timotimo moritz: when trying to "submit a talk proposal" to GPW2016, i get a raw "Forbidden" error page; is that because i'm too late to submit? 15:07
rudi_s RabidGravy: Could you give me a pointer please. 15:08
DrForr Could a few of you hit theperlfisher.blogspot.ro/2016/02/f...pt_28.html just to give feedback on the code blocks? 15:09
rudi_s RabidGravy: perl6advent.wordpress.com/2015/12/...d-methods/ <- this? 15:10
RabidGravy class Foo { method bar(:$f, *%f where *.keys.elems == 0) { say "f" };}; Foo.bar(:f); Foo.bar(:f, :b)
timotimo *punch* 15:11
DrForr: i find it annoying that the website layout is narrow, but the code blocks have horizontal scrolling
i'm in favor of narrow-ish website layouts, though
rudi_s RabidGravy: Thanks.
RabidGravy but that other thing would work fine too with some adjustment to taste 15:12
llfourn DrForr: I think you just try and move the archive from the right to the top so the content can take more space 15:13
(somehow :P)
DrForr Yeah, I hadn't actually tried the layout at a full window on my monitor, and simply (foolishly) assumed that the center column would take the remainder of thespace. 15:14
But I was mainly after the readability of the code blocks, as I've had at least one person comment on the blog about it being unreadable. Is that at least better to look at? 15:15
(I didn't have a problem with how the code looked before, but the readers are the arbiters of taste here, not me.)
llfourn subscribes to DrForr's blog
they are more readable than your previous posts 15:16
but the extra space would make them even better
timotimo well, the code isn't colored, which makes it a bit more strenuous to look at, imo
llfourn yeah, I wonder if there is an easy way to color it 15:17
timotimo on the other hand, there's people who code completely without highlighting
llfourn is there a way to use GH markdown code block rendering on your own blog?
llfourn sleep & 15:18
DrForr Dunno. I'm going to reformat the rest of the postings this way and worry later, this appears to be an improvement. Little steps... 15:19
Skarsnik hm, what is the oposite of push for Array? 15:22
DrForr If it's not intuitively obvious I'm something of a novice at this.
pop()
Skarsnik I mean, that put at the head, not the tail 15:23
RabidGravy unshift
Skarsnik Oh, thx
RabidGravy or prepend
Skarsnik Na prepend is not the same than push
if you do @tab.prepend(%hash) it flat the hash 15:24
RabidGravy yes, like append
lucs What's the P6 equivalent of P5's s/.../.../r ? 15:27
RabidGravy what does /r do? 15:28
geekosaur instead of modifying the string in place, the modified string is the return value of the s///r 15:28
RabidGravy yeah, got it 15:29
m: say do given "hshshshs" { S:g/h/g/ } 15:31
camelia rakudo-moar 1e33bc: OUTPUT«gsgsgsgs␤»
lucs Oh, capital S, eh. Nice. 15:32
RabidGravy or 15:33
m: my $a = "hshshshs"; say $a.subst(/h/, "g", :g); say $a
lucs Thanks.
camelia rakudo-moar 1e33bc: OUTPUT«gsgsgsgs␤hshshshs␤»
RabidGravy S/// only works on $_ though 15:34
lucs Ah, okay.
DrForr Updated blog. 15:44
buharin DrForr, work 16:23
DrForr Uh, how about tomorrow? :) Or, do you mean that works? 16:26
buharin DrForr, its working!!! 16:27
DrForr Aha, great.
moritz timotimo: dunno; I'll have to ask the others 16:39
moritz timotimo: have you signed up as a participant already? 16:40
timotimo moritz: is the submission deadline already over?
maybe i've missed the time for that, too? i can't find a button for that
moritz timotimo: yes, signup period is over 16:41
timotimo >_<
moritz and the venue is full
"Registration is possible until February 17th 2016" is what the front page says
timotimo urgh 16:42
why do i procrastinate stuff so often? >_<
moritz :(
timotimo can i sneak in during the hackathon, though? :P
ugexe m: my $buf = Buf.new(1..5); my @arr = $buf.contents; say @arr[0..*-3]; say $buf.subbuf(0..2); say $buf.subbuf(0..*-3); 16:43
camelia rakudo-moar 1e33bc: OUTPUT«(1 2 3)␤Buf:0x<01 02 03>␤This type cannot unbox to a native integer␤ in block <unit> at /tmp/yv2cH96U7O line 1␤␤»
moritz timotimo: yes
timotimo cool! :) 16:44
i'll definitely do that, then
moritz \o/
dalek kudo/nom: 95069c8 | lizmat++ | src/core/Buf.pm:
Buf.push|unshift shouldn't take lists

Because it doesn't work with int @arrays either, as should not be flattened, and they cannot be stored unflattened. Please use
  .append (for push) or .prepend (for unshift) instead.
16:47
tadzik timotimo: I managed to register and sneak in just 3-4 days ago, try :)
there's a note somewhere to email the organizers and ask for a spot
tadzik procrastination's not that bad! :) 16:48
dalek c: 0f11a13 | (Simon Ruderich)++ | doc/Language/subscripts.pod:
Language/subscripts: add "or" as alternative in :exists example
c: 9f71be2 | (Simon Ruderich)++ | doc/Type/DateTime.pod:
DateTime: mention "epoch" in .posix
timotimo what, really?
tadzik yep
timotimo you didn't happen to get a 2-person-room by accident? :P
tadzik I did, but not by accident :)
timotimo ah, you're already sharing, eh?
tadzik yea 16:49
timotimo OK, let's see ...
tadzik with sergot, who's also coming
timotimo cool!
sjn hey, cool that you're coming, tadzik :) 16:49
tadzik yep :)
sjn has finished reading the course material he borrowed from tadzik 16:50
tadzik haven't seen y'all Perl people a while
sjn tadzik: how's the job situation? anything signed yet? :) 16:50
pmurias is there still a way to make <.foo> capture? 16:51
tadzik sjn: yep, stuff got signed recently :)
sjn tadzik: cool! grats! :D
pmurias tadzik: what event are you attending?
tadzik pmurias: GPW
in Nurmberg
timotimo pmurias: you can <bar=.foo>
sjn is in Nürnberg now, actually 16:52
it's a really nice city
tadzik hah, still living nearby upcoming Perl events? :)
sjn yeah :)
pmurias timotimo: there used to be a way to turn of capturing without changing the regex
sjn well, I'm missing quite a few too :-P
pmurias timotimo: AFAIR using a modifier 16:53
timotimo i don't remember that, sadly
sjn has a small appartment just down the street from the GPW venue
sjn should invite for some drinks here during GPW... hmmm 16:56
tadzik hmmm
sjn is off to find a cafe in the city to work on his presentation
dalek ast: 0e4496a | lizmat++ | S03-operators/buf.t:
Fix tests wrt 95069c8480466ff25fbc78
16:59
TreyHarr1 Need a doc pointer... I see a couple very complicated ways to go about it, but is there a straightforward way to to interrogate a compilation unit for its definitions? In other words, point at a p6 file and get back a list of module foo, class bar, sub MAIN? 17:01
Skarsnik hm 17:02
kjs_ good afternoon #perl6. So I’m doing data analysis on ~10,000 records, stored in JSON files, parsing them and storign them into an SQLite database. This works fine mostly, but after having processed about half of them, my script slows down significantly, and my only guess is that this is due to pressure on the memory allocation. Is this a known issue? 17:04
timotimo when you load the compunit, you get back the stashes that make up its symbols
that's the EXPORT:: business and such
TreyHarr1 I'm just writing a bunch of boilerplate for tests, and it would be nifty to refactor it so I don't repeat myself, but I need to write a scanner instead. If I can easily ask, "for each .pm file in dir, does it have a class matching this criteria? If so, run these tests against it"
timotimo: yup, that was the first way I found that looked complicated.
timotimo it's not so bad
TreyHarr1 the other was using the phasers
timotimo: k, i'll give it a shot. thanks. 17:05
Skarsnik kjs_, maybe, try to trace the memory print of the process? 17:08
rudi_s I have a function which takes an array (sub foo (@x)) and I want to pass the combination of two arrays (e.g my @a = .., my @b = ...; my @c = |@a, |@b; foo(@c)). What is the idiomatic way to do that in perl6? 17:08
(Without a third variable.)
TreyHarr1 hmm... running 'perl6' with no arguments is the way to start the REPL, right? It used to work, certainly since I installed this rakudo, but now it hangs forever. (Not even responsive to typing some code and EOF'ing, have to ^C to get out.) 17:09
Skarsnik foo((|@a, |@b)) does not work?
timotimo TreyHarr1: you may have a perl6 process in the background that potentially has the CompUnitRepo locked, so it can't try to load Linenoise or Readline?
just a guess
TreyHarr1 timotimo: a good one. lol, yes, a 'panda look' that I'd forgotten was a panda look and was treating as a normal shell :) 17:11
i was trying to run it inside itself, in fact.
rudi_s Skarsnik: It does, thanks. I was just curious in which ways this could be done and which is the shorted/best/recommended. 17:12
(I didn't think about (..) and would've used foo([|@a, |@b]).)
kjs_ Skarsnik: ok. I suppose one would do that with valgrind? I’ve got 2 types of data: the first set is about 100 files each with 100 entries, and the second is 10000 files each with one entry. The second one seems to be easier to process than the 100 files with 100 entries each. But maybe that’s due to my perl scripts. 17:15
Skarsnik just look like at top 17:16
Skarsnik or with ps 17:16
lizmat_ m: Buf.new; say now - INIT now # wow, the first time we create a Buf is *very* expensive! 17:19
camelia rakudo-moar 95069c: OUTPUT«0.3498912␤»
Skarsnik duh
it's not just a 'simple' malloc? 17:20
timotimo m: say now - INIT now
camelia rakudo-moar 95069c: OUTPUT«0.0016866␤»
timotimo o_O
lizmat_ no, it isn't
lizmat it's punning the role into a class 17:20
after that, it's ok
timotimo oh
lizmat feels to me, this punning should probably be done during the setting already
timotimo what happens if we just ... yeah
lizmat *compiling the setting
lizmat tries 17:21
Skarsnik m: role R {}; R.new; say now - INIT now 17:22
camelia rakudo-moar 95069c: OUTPUT«0.0023991␤»
lizmat Buf and Blob are no small roles 17:23
timotimo i wonder what part actually takes all that time 17:24
Skarsnik why are they role and not class?
timotimo because Blob and Buf are parametric 17:25
japhb Skarsnik: Because they can parameterize on element size
Skarsnik: e.g. buf8
lizmat timotimo: is there some punning method in the MOP that I could use ??
timotimo i think make_pun exists 17:26
lizmat m: Buf.^make_pun; say now - INIT now # the expensive part 17:30
camelia rakudo-moar 95069c: OUTPUT«0.3362993␤»
timotimo i wonder how many parts that has 17:33
lizmat well, adding it to the mainline of the setting, makes compilation die in pretty mysterious ways 17:34
timotimo ohgen/moar/m-Metamodel.nqp:2586 17:35
hm. a profile of that shows it's spending about half-half in "specialize" and "apply", gen/moar/m-Metamodel.nqp:2586
^- that's specialize
gen/moar/m-Metamodel.nqp:2734 - this is apply
and most of compare_multi_sigs is actually spent inside "gistperl" 17:36
gen/moar/m-CORE.setting:19074 - gistperl
lizmat what's being gisted ???
timotimo when we make a pun, do we actually have to be comparison of multi functions?
lizmat timotimo: no idea... 17:37
my question is really: why isn't this done during core setting, so that we have ready to use punned roles after startup ?
timotimo you mean only for roles that have default values for all their parameters? 17:38
lizmat I can't imagine a punned role taking so much more space that it will slow down bare startup
well, I would argue all of the possibilities should probably be punned
but at least Buf or Blob 17:39
timotimo hunts through the call graph
lizmat *and*
timotimo the eqv operator on Signature uses gistperl 17:41
lizmat this would at least shave 33 x .34 = 10 CPU seconds off the spectest
timotimo it may be a good idea in general to improve the eqv operator on Signature 17:42
lizmat timotimo: ok, will take that on first
timotimo i'm not sure that's really correct, but apparently gistperl takes up 95.7% of the total time of Buf.^make_pun 17:44
it's potentially already easy enough to add a fast-fail for different arities, for example
lizmat yeah, ok
timotimo hm, no. 17:47
maybe all the invocations to eqv are actually coming out true
timotimo checks that
lizmat looks like Signature.ACCEPTS(Signature) could use some speedup as well 17:50
timotimo oh my. they all come out False
timotimo so with a check for .count equality i can get 59 eqv's to abort early, and 127 still do the full check 17:57
timotimo sadly that only takes the run time on my end from 0.46 to 0.33 17:59
so more work is clearly needed
ugexe however i handled bufs with net::http is nearly twice as slow with HEAD than 2015.12 :x 18:00
skids Coincidentally I was working on a patch for the metamodel signature comparator.
timotimo oh! 18:01
lizmat: ^- skids has something for us!
:P
skids Not for eqv.
The thing below it.
timotimo oh
timotimo well, that just uses gistperl + eq + gistperl 18:01
so whatever you had in mind for eqv would likely also apply there 18:02
lizmat ugexe: are you saying Buf handling slowed down since 2015.12 ? 18:02
skids gist.github.com/skids/b7db42fc7d029e5c0f9e was the first, 6.c-compatible part of that.
timotimo how much faster is that for Buf.^make_pun? 18:03
skids Well, I don't have two rakudos to compare. 18:05
timotimo mhm, fair enough
how fast does Buf.^make_pun run on your machine?
skids eqv should probably do likewise but not use the :where thing
timotimo i find it strange that you have +sa.params over and over again 18:06
skids Yeah I was trying to avoid making that a Routine.
Though, I don't know why.
(Can't use return or last otherwise) 18:07
timotimo routine?
skids Or can't use return. Was also trying to avoid last to avoid control exceptions.
timotimo yeah
but you misunderstand me 18:08
timotimo why is \sap and \sbp in the inner loop and why not +sap or even put the result of +sap into another variable? 18:08
lizmat so what is exactly the function of set_multi_sig_comparator ? 18:10
is that the code that determines if two signatures are identical ?
timotimo it registers a comparison function that the metamodel can use
yeah, looks like
skids It is newer than most of the metamodel, hasn't been fully promulgated yet.
timotimo using your code makes Buf.^make_pun run in 0.21s 18:11
skids timotimo: yeah I hadn't PR'd that yet because it needed some massaging, just got it working, so probably could use some massage.
lizmat and how does this relate to Signature.ACCEPTS(Signature) ?
skids timotimo: is that better, or worse (just logged in, haven't backlogged much) 18:12
timotimo Parameter.perl is now at 59.96% inclusive time
that's two times better than what we had in the beginning
i.e. takes half as long 18:13
skids What I've been trying to psych myself up to do is extract the logic from is_narrower/sort_dispatchees_internal into that comparator. But that will be 6.c-breaking. 18:15
timotimo inside Parameter.perl, 25% time is spent inside a/the calls to .map, 11.8% from .sink, 8.72% of time spent inside the curly block following the first # XXX
another 8.6% is spent inside .ACCEPTS of a Regex 18:16
Skarsnik really eqv just compare the gist? xD 18:16
timotimo the curly block from the else-branch of "if $name" is next at 7.37%
after that is much smaller fish 18:17
lizmat timotimo: did you work on Parameter.perl already ?
skids Skarsnik: yes, which is a bit hacky and causes some issues, but you know, "first ake it work" :-)
timotimo no, just analyzing it so far
timotimo hm, so the most expensive part is the type captures part 18:18
rebuilding takes quite a little while on my laptop :| 18:19
skids One note is that in sort_dispatchees_internal a hash is built for each sig, mostly because not all the methods from Parameter.pm are available at that point, but it has the effect of caching results for future comparisons.
timotimo but i just guarded that for with a "if nqp::elems($!type_captures)", since type captures are rather rare
ugexe lizmat: in some cases, yes (at least i dont think another change is causing it). looking at --profile it seems to be twice as many allocations. lots of new calls to `perl`, `sink-all`, `new`, `sequential-map`, and `push-exactly`. or should i look at something else? 18:20
timotimo what question was that an answer to? 18:20
lizmat ugexe: ok, that's caused by the punning then: there are many more methods/candidates now for punning
timotimo ah, interesting 18:21
lizmat about the slowdown in net::http since 2015.12
timotimo so we'll be improving the performance of that code with this work right here
lizmat yes 18:22
timotimo i really wonder why the type_captures method boxes an Int for the index of the type captures
it's not like we support more than 2^64 type captures on a single parameter?
just got answer from the GPW admins; i'm too late for GPW this year ;( 18:23
TreyHarris is file glob just gone from Perl 6?
timotimo it's in the ecosystem
TreyHarris timotimo: thanks, didn't see it for some reason 18:24
timotimo :)
timotimo with that for loop guarded by an if, i'm down to 0.18s 18:25
RabidGravy woah, that's epic poddery, nearly half this module is POD now :-\ 18:28
better get it out the door
timotimo i'm not entirely sure why the check for "Callable" looks like $type ~~ / ^^ Callable >> /, but i guarded it with a $type.starts-with
lizmat
.oO( podding along )
timotimo: nqp::istype(,Callable) should be fine ?
timotimo i think the type is probably a string? 18:29
skids timotimo: for Callable[Int] etc I think.
lizmat ah, then starts-with should be ok :)
TreyHarris how about fork/exec? I'm not finding it in ecosystem :)
TreyHarris (it's probably there too, I'm just getting the wrong name...) 18:29
timotimo ah
mst TreyHarris: that's non-portable, you can get it from your OS via NativeCall
timotimo i can compare $!nominal_type instead 18:30
mst TreyHarris: however, the first question is, why do you -want- to fork?
perl6 already has concurrency, and it already has process running
Skarsnik Fork does not work great x)
TreyHarris mst: completeness. i'm trying to port one of my cpan modules and get it testing correctly before making it more p6-y 18:30
Skarsnik mst, I needed fork to run code that leak
timotimo m: "Callable[Foo]".index("[").say
camelia rakudo-moar 95069c: OUTPUT«8␤»
timotimo m: "CallableFoo".index("[").say
camelia rakudo-moar 95069c: OUTPUT«Nil␤»
mst I fully expect we'll end up with an exec() eventually, because that exists on win32 as well 18:31
but fork() is *n?x specific, so using NativeCall to get it from the OS is, if anything, more elegant design-wise than having it supported directly as such
TreyHarris mst: sorry, exec is what I need, I just said "fork/exec" because that's like one word to an old Unix hack like me :)
Skarsnik I mean what are the other way to start another process?
mst TreyHarris: what do you need exec for?
Skarsnik not just a thread
TreyHarris mst: "Perl, stop execution immediately and replace yourself with this other program" 18:32
mst TreyHarris: so, basically, at this point you do the moral equivalent of 'exit system(...)'
skids TreyHarris: maybe use NativeCall?
mst or try and NativeCall in exec(), which I'm probably going to end up doing at some point myself
TreyHarris mst: no, exec() is a specific thing, because it frees all resources the prior process is using. doing a system() postpones releasing those resources until the system() finishes, even if it's the last thing in the program. 18:33
mst TreyHarris: please don't treat me like an idiot when I'm trying to help you. 18:34
timotimo making the thing inside the check for [Foo] faster didn't matter at all, seems like.
mst I know what exec does. that's why I gave you both options.
skids
.oO(exec might be kinda fugly from an evalserver-like setup)
18:35
mst skids: yes. but in the long run we need it anyway, because leaving an unnecessary extra process lying around is pretty gross
OTOH for the moment it *does* work, basically
timotimo skids: do you think we can figure out a nice fast-fail condition for the equivalence of parameters in our signature comparator? 18:36
TreyHarris mst: i'm sorry, i wasn't trying to, i've done enough coding interviews of supposed "system programmers" to know that the fork/exec process is surprisingly esoteric even to non-idiots. my apologies for misunderstanding and for implying you didn't understand. 18:37
timotimo skids: actually, Parameter has an ACCEPTS, is that potentially right for our use case?
skids timotimo: Both will be a bit tediuous, but harder for 6.c copatibility than not. Haven't considered ACCEPTS. 18:38
timotimo hm
mst TreyHarris: yeah, so, NativeCall will totally let you get at the systemcall 18:38
skids For 6.c you basically have to go by what gistperl does.
timotimo anyway, anything that makes this faster would be helpful :)
lizmat Set($other.named_names) (<=) Set($.named_names) # pretty bad, because it first builds to entire Sets 18:39
mst TreyHarris: while I was resisting the urge to try and set you on fire with my mind, I also came up with an alternative, which is to do an 'exit system()' of a program that forks, execs your real thing in the child, and exits the parent, but of course then you lose the exit code and have the usual other problems
timotimo perhaps we have to look at this from a higher vantage point. like, what exactly does the metamodel expect the comparator to consider equivalent and what not? does that have to be 1:1 the same as eqv on two Signature objects?
mst TreyHarris: also, sorry, I assumed since you had perl5 code you'd probably already know I tend to work on fairly low level stuff - I mean, I did do most of the design for e.g. p3rl.org/Daemon::Control - but I do understand that lots of people don't get it. saying "yes, but I want the exec() resource freeing behaviour" is what I'd do, then the people that know will go "yeah, I know" like I did, and if you get a blank look, ... 18:41
... *then* you explain
timotimo lizmat: good point; also the eqv we've had so far wouldn't be just subsets, it'd require both to exactly match
ugexe fwiw its in the s29 design doc as `runinstead`
mst bah. I'm doing the "debug your communications protocol as well as your problem" thing again. hope it's clear I mean it constructively :D
skids timotimo: unless we want eqv to be True for tiebreakables, the two will have to be different.
TreyHarris mst: Yes, it is. Again, I really do apologize. To put it in context, I'd say that at Google, folks we brought in for onsite SRE interviews had a 50% hit rate on being able to explain fork/exec, and at that point 99% of applicants had already been weeded out. (I've learned that pretty much anything you'd think is a litmus test for a good system programmer, a bunch o good system programmers can't pass.)
skids timotimo: What needs to happen eventually is in sort_dispatchees_internal, obscured a bit by that fact it is bootstrap code. 18:43
(and sort_dispatchees_internal could probably use some improvements as well)
timotimo skids: tbh i don't feel up to wrangling the metamodel right now ... i'm trying to work up the courage to improve spesh by finding out what makes it not analyze my "white noise" example code properly
TreyHarris mst: Yes. Sorry, I didn't /whois you until now and I'm terrible with remembering initials. We were both in the kilt squad at YAPC CMU '09 and had several meals together. 18:44
mst I thought it was you, that was part of why I was so confused :P
skids timotimo: if I can manage to get my head clear enough today I'll try to PR something, no guarantees, I've been feeling down all week. 18:45
mst TreyHarris: anyway. those are your options for the moment. note that if you do get exec via NativeCall going I'd love to see the resulting code, because I'm going to be wanting to do that sometime soon myself
timotimo no worries, i appreciate any effort! :)
otherwise, you can let lizmat work on it instead/in addition 18:46
mst because currently the shim scripts that are used to invoke installed scripts via modules suffer from exactly the suckage you describe because they're doing 'exit system(...)'
so the path forwards seems to me to be 'get a cross-platform NC exec, use it in those for a bit to shake it out, then petition to add it for 6.d'
TreyHarris mst: i'll let you know but since it was a marginal feature to start with I only brought it up now because I was surprised I couldn't find an implementation. It just happened to be the next thing in the test file I was porting. 18:47
jnthn m: use NativeCall; sub execv(Str $path, CArray[Str] $args) is native returns int { * }; execv('/usr/bin/uname', CArray[Str].new('foo', Str)); say 'not here';
yoleaux 10:49Z <lizmat> jnthn: there's something strange with reading a 2.5MB file with slurp: with nqp::readallfh it takes about 80ms, with nqp::readfh with the size of the file as a buffer, it takes 350 msec (like 4x as long)
camelia rakudo-moar 95069c: OUTPUT«Linux␤»
yoleaux 10:49Z <lizmat> jnthn: I would expect the unicode handling to make things *slower*, but instead it's 4x faster than binary ?
jnthn That's how to call exec with NativeCall, btw
lizmat jnthn: I think we found out what that was: Buf.^make_pun
jnthn lizmat: OK. I'm headachey and sick today, so don't know I'll be figuring out much... :( 18:48
lizmat jnthn: we're figuring out many a things atm...
any suggestions would be welcome...
jnthn lizmat: Does the binary path copy all it gets into another buffer though?
lizmat jnthn: yeah, but the delay is in the first occurrence of Buf in a run 18:49
mst TreyHarris: well, sure, which is why I suggested you did 'exit system(...)'
TreyHarris: because I figured it was probably a marginal feature
lizmat m: Buf.^make_pun; say now - INIT now # that's a lot of CPU there
camelia rakudo-moar 95069c: OUTPUT«0.3490704␤»
lizmat jnthn: ^^^
mst TreyHarris: I assumed the exec 101 lecture meant it was important :P
jnthn Sure, but it's amortized
timotimo ohey jnthn :)
jnthn m: Buf.^make_pun for ^10; say now - INIT now
camelia rakudo-moar 95069c: OUTPUT«2.9059790␤»
jnthn Uh...it should be, at least. 18:50
timotimo hah
well, .^make_pun probably doesn't cache the result
jnthn m: Buf[].^make_pun for ^10; say now - INIT now
camelia rakudo-moar 95069c: OUTPUT«2.89013790␤»
timotimo whereas whatever uses .^make_pun probably does
jnthn Oh, wait...
m: Buf[].^pun for ^10; say now - INIT now
camelia rakudo-moar 95069c: OUTPUT«0.334182␤»
jnthn Right :-)
That's the one that should be used :)
mst TreyHarris: also, damnit, I suppose that means I'll actually have to write the code myself at some point ;) 18:51
dalek kudo/nom: 2098186 | lizmat++ | src/core/Buf.pm:
Make Blob.AT-POS a few percent faster

And hopefully better inlineable
18:52
kudo/nom: 4fbedcc | lizmat++ | src/core/Range.pm:
Fix typo

Found when doing Int.Range.rand. Instead of generating an LTA error, this now hangs because it is building the infinite list. This probably needs some extra attention :-)
TreyHarris mst: like I said, I was porting feature-for-feature, and I got to the one that used exec(). So it was important insofar as doing something other than exec() would no longer be porting feature-for-feature. 18:53
timotimo should we optimize .map on ().list ? 18:56
as in: special-case?
jnthn Don't think the code to do it is worth the bloat or, worse, slowing every other case down for.
timotimo 'k 18:57
timotimo in this case, which is Parameter.perl, it's probably worth looking at nqp::elems() of $!type_captures 18:58
flussence was runinstead() removed from the spec? not sure why we need to wait for 6.d to fix it.
TreyHarris jnthn: thanks, that works. a stringifiable list-to-CArray[Str] wrapper is easy enough, but is the idiomatic way to do it by putting coercion logic in the sub exec (Str $path, *@args) which calls execv? 19:02
sorry, *conversion* logic. not *coercion*
thinko
b/c a coercion milti could work as well, no? 19:03
jnthn TreyHarris: If you stick it in a module then yeah, you could write a sub that does the coercion, named it exec, and export *that* rather than the native sub itself.
mst that was roughly what I was expecting to be the sensible approach
mst given perl6 being perl6 couldn't you put the 'sub execv is native' inside the 'sub exec' and not need a module? 19:04
jnthn mst: Yes
mst: But also subs are lexical anyway
mst: So hiding the native one from the outside world is as simple as not exporting it.
mst you're thinking the wrong way round 19:05
jnthn Oh, if you don't want a module at all, just to stick it in a script
mst I was thinking that I wouldn't want to have to wrap a block around the outside of the 'sub exec' definition to avoid leaking the execv out into the script
jnthn Yes, then it makes sense.
mst exactly. the words 'and not need a module' were a clue :P
jnthn What, I'm meant to read??? 19:06
TreyHarris jnthn: but mst is right that I probably should just eliminate the feature, as I don't want to port a pure perl 5 module into an impure perl6 module.
mst TreyHarris: given the way NativeCall works, I would argue it isn't really impure as such 19:07
this is not like Inline::C or XS
TreyHarris mst: guess I need to look at exec's p5 implementation. i'm guessing it's not portable just by doing jnthn's incantation alone. 19:08
jnthn May not quite work out on Windows without a tweak
dalek osystem: 67735d7 | RabidGravy++ | META.list:
Add XML::Class

see github.com/jonathanstowe/XML-Class
19:10
jnthn grmbl, headache returns...bbl, or tomorrow
RabidGravy there, that took longer than anticipated but what larks
Skarsnik ah nice module 19:11
RabidGravy I wouldn't say it's perfect but it should get some tire kicking 19:12
dalek kudo/nom: bc0070f | lizmat++ | src/core/Mu.pm:
Make BUILDALL/BUILD_LEAST_DERIVED about 10% faster

Benchmarked on a class with 3 public attributes not being initialized
19:20
TreyHarris whee... looking at p5. exec is defined separately for each OS. so i guess unless you already have an OS dependency, defining it inline would be a bad idea.
japhb lizmat: Do you have any of your benchmark code (that you used to time all these changes you've been making over the past weeks) laying around? It would be nice to get them into perl6-bench ... 19:22
lizmat japhb: I basically used one liners, run them at least 3 times with 10 second intervals, run one "empty" loop for a baseline, and do the math 19:23
japhb: so, no, I don't really have code as such :-(
will keep that in mind in the future, though 19:24
$ 6 'class A { has $.a; has $.b; has $.c }; for ^10000 { my $a = A.new }
$ 6 'say (285 - 132) / (299 - 132)' 19:25
0.916168
mst lizmat: turning that into a small shell script (or whatever) called 6bench would likely be pretty trivial 19:27
mst I mean, FVO trivial, but still 19:27
azawawi hi 19:45
RabidGravy rarr! 19:46
azawawi regarding "is cached" trait doc.perl6.org/routine/is%20cached , does it have a cache eviction strategy?
moritz nope
japhb lizmat: perl6-bench has a *lot* of one-liners, and handles empty loops, and can do any subset of the tests in the run, and does the "run N times" work, and ... :-)
mst it's actually 'is memoized', but with a stupid name. 19:47
japhb mst: github.com/japhb/perl6-bench
mst but 'cached' is more familiar to people so
azawawi moritz: we can override it right? 19:47
lizmat japhb: point taken :-)
azawawi mst: yup en.wikipedia.org/wiki/Memoization
lizmat azawawi: it's experimental as it is, anyways :-) 19:48
mst azawawi: you can write your own trait with an eviction strategy, yes 19:49
azawawi mst: thanks
mst lizmat: actually, I sort of wonder if 'is cached' should take (a) an args mangler, the way memoize does, (b) a cache constructor 19:49
then it would both fit it's name and be configurable
lizmat mst: I implemented it as it was vaguely specced 19:50
azawawi lizmat: could you please link its design spec?
lizmat S06:2081 19:51
azawawi thinks it will give him something to do it this evening :)
azawawi lizmat: thanks ... design.perl6.org/S06.html#is_cached 19:54
mst lizmat: right. I've been tending to regard the synopses as "it must do the things they say, but there's no reason you can't do a few extra bits as well"
that's going to be completely necessary for CUR over time, certainly 19:55
but then again, in general I don't really write code where an unbounded cache is useful, and I can see a bunch of scripty uses where it would be
lizmat mst: the extra bits are what gives me the top position in most reverted :-)
japhb lizmat: Just shows you're taking a proper amount of risk taking ... and also that roast is a bit thin still. :-) 20:08
*you're doing
japhb left his tea in the freezer to cool a little too long. Yipes that's cold. 20:09
lizmat just has a fresh cuppa (hot) 20:14
Hotkeys Just leave it in a bit longer and have a teasicle 20:15
japhb Hotkeys: not entirely a bad idea ... except the part about needing the caffeine now. :-) 20:21
lizmat japhb: I seem to have misplaced the benchmark repo... what was it again? 20:33
mst 19:47 < japhb> mst: github.com/japhb/perl6-bench 20:35
lizmat mst++
lizmat japhb: so, if I only have a P6 benchmark, I could just leave the perl5 tag empty ? 20:40
japhb lizmat: Yeah, exactly
The perl5 and nqp entries are only there for when you want to do cross-language comparisons. 20:41
lizmat what does the "scale" parameter mean
?
moritz lizmat: the harness tries to run each benchmark with a number the determines the amount of work to be done 20:42
lizmat: that is, number of iterations, length of strings to be regexed, stuff like that
lizmat: that's the scale 20:43
japhb lizmat: Just checked, you already have a commitbit, btw
moritz so that stuff like quadratic string concatenation becomes obvious
lizmat so 1<<7 means number of iterations to be done ?
japhb lizmat: That's the starting value. 20:44
It will automatically ratchet it up until the runtime of the test is long enough to get out of the noise
(plus a bit more to see the scaling effects)
And I tended to do it in binary, because the default ratcheting behavior is to double the scale each run. 20:45
dalek kudo/nom: add25c7 | lizmat++ | src/core/Parameter.pm:
Make Parameter.sigil about 20x faster
japhb But there's nothing intrinsically correct about that scaling factor; it just seemed like it would be a good default.
lizmat so, the benchmark for this was: $ 6 'sub a(\) {}; my $p = &a.signature.params[0]; for ^100000 { my $a = $p.sigil }' 20:46
japhb (There's also a linear scaling mode for tests like man-or-boy or ackerman that have their own super-linear scaling based on an opaque parameter.)
lizmat japhb: how would you put that in microbenchmarks.pl ? 20:47
japhb hold on, lemme pull that
up
japhb lizmat: something like gist.github.com/japhb/f15b1a9779d8e89ddf4c perhaps 20:52
RabidGravy gah, one more module and I will have made 40 - I may have to pause for a while before it gets embarassing 20:53
japhb I wonder if we should add tags for test authors so that people can see how much a particular person's favorite test cases were improving 20:54
RabidGravy: s/embarassing/awesome/ 20:55
lizmat japhb: are the tags that we don't use (like perl5 and nqp in this case) really necessary ? 20:56
japhb They were mostly there as a subtle reminder to people to make cross-language testing possible wherever it made sense.
japhb ISTR I fixed the bug where it would be unhappy if the key wasn't even there, but I'm not 100% positive. 20:57
lizmat perhaps it would make more sense if there were a separate file for perl6 benchmarks only ?
japhb There is a set of autogenerated tags for tests, so you can choose tests via e.g. --tests-tagged=has-lang:perl6 21:00
lizmat: For tests that are not one-liners, there are separate directories for each language.
japhb I collected these in one big file largely because I didn't want to repeat all the meta data, and because I wanted to reduce the chance of a refactoring making different language implementations no longer comparable. 21:01
these == microbenchmarks
lizmat still not seeing how I would indicate the empty loop case 21:04
japhb To be clear, you may never see a case of `perl6 => undef,` in microbenchmarks.pl, because then what's the point? There shouldn't be anything you can express in NQP that you can't just as easily express in Perl 6, and for Perl 5 only tests ... well, write a Perl 6 version. :-)
lizmat in my example: $ 6 'sub a(\) {}; my $p = &a.signature.params[0]; for ^100000 { my $a }'
japhb test "empty" 21:05
japhb The compile and constant overhead times of your test will be checked with a special run of SCALE = 0. 21:05
There's also a for_empty, IIRC
yep 21:06
Which is specifically an empty for loop
lizmat well, but in the above example, if the empty loop case takes 400 msecs, and the one with a payload does 450 msecs
and before my change, with payload did 500 msecs 21:07
japhb lizmat: After subtracting startup, compile time, and constant overhead?
lizmat you would see only a 20% improvement, rather than 2x
well, the amount it would take to do everything except the very thing you're benchmarking
japhb I'm saying, how much time does this take: 'sub a(\) {}; my $p = &a.signature.params[0]; for ^0 { my $a }' 21:08
lizmat so you would include the overhead of the loop in the benchmark ? 21:09
japhb lizmat: So if (say) that took 200 ms, then perl6-bench would by default compare (400-200) = 200 versus (450-200) = 250ms
But yes, that's why there are variants of tests as while, for, etc.
japhb Because whether for ^N {...} is super-optimized changes between Rakudo versions 21:09
japhb At one point, it was wicked fast. 21:10
(I haven't checked recently if it still was.)
But I *do* see your point.
lizmat it is again, afaik
japhb The biggest remaining feature unimplemented in perl6-bench is being able to compare e.g. for_empty and for_foo_bar directly.
I ran out of tuits to do that comparison (which would go in analyze, with options to enable it available in bench) 21:11
But all the raw data you need should be in the timings files, which are ... verbose.
japhb Still, you're right that currently perl6-bench doesn't get allow you to easily claim "operation X is N times faster" but rather "operation X running in a for loop is M times faster" 21:12
lizmat atm I'm simply trying to quickly add more tests, without actually running perl6-bench myself 21:13
if that's ok with you
jnthn There are daily automated runs on perl6-bench at www.moarvm.org/measurements/perl6-bench/ fwiw
*of 21:14
japhb A legacy of it being used to compare the overall performance of compiler builds, rather than improvements to a single Callable in the setting.
lizmat: It's more than OK. I'm ecstatic! :-)
lizmat++
jnthn Though for some reason viewing the reports in whatever Chrome I currently have is incredibly slow... 21:16
timotimo jn is back :)
feeling a little better?
jnthn Well, I had some dinner, and the headache receded a bit...
Brane still feels like it's a big heap of mush. 21:17
japhb jnthn: The JS code got modified a few times since I last touched it, I think. I haven't gone back and checked that it's being JS-compiler-friendly still. 21:17
dalek rl6-bench: 04d82d3 | lizmat++ | microbenchmarks.pl:
Add micro-benchmark for Parameter:D.sigil
jnthn At the moment, those daily runs I'm doing spit out a Perl5/NQP/Rakudo comparison 21:17
jnthn Any suggestions on a good no-maint-needed thing I can do for comparing Rakudo versions? 21:18
I guess I could run a Christmas release vs. today...
japhb jnthn: history mode?
jnthn japhb: Yeah, I guess that. :) 21:19
jnthn japhb: I guess it has no smarts along the lines of "the last month's release"? 21:19
I can calculate that in whatever scripting I do though, I guess. 21:20
japhb Unfortunately, it only knows about things that can `git rev-parse`
jnthn OK
japhb You can certainly use a moving tag or something if you like. 21:20
jnthn Well or I can just plot Christmas, HEAD, and 20XX.XX by just talking the current year/month and subtracting one month. 21:21
It'll lag the actual monthly releases a little, but still be useful for comparing things before the next monthly :) 21:22
japhb We might also want to consider tagging a particular set of tests as "version 123 of the perl6-bench test suite", so that if you're watching the overall performance means, it doesn't change as the test list changes.
Yeah, makes sense.
japhb If you use a particular rev of perl6-bench itself over time, then you don't have to rerun old tests, you can just keep checking out a new latest (by date) and creating more timings files for it. 21:24
Analyze can handle a fair number of timings files, but again, don't know how the HTML will handle that much data.
jnthn japhb: Yeah. At the moment I have to manually git pull perl6-bench itself, but the rest is automated 21:29
japhb goes back to trying to decide whether it's time to just write a clean re-implementation of Evject etc., and if so, what exactly he wants to accomplish with that. 21:32
vendethiel Evject? 21:34
japhb vendethiel: gist.github.com/jnthn/da27ded3fbf06df7c54a
(I have a local hacked up version) 21:35
Guest98765 I'm getting an odd error message from REPL about some code. Will I get flamed if I post the sequence? 21:36
japhb Oh, that reminds me: jnthn, I recently had to stop using OO::Monitors with InMemoryEventStore, because the wrapped methods weren't invokable during domain processing.
japhb I don't know if you'd ever gone back and tried that old code (with s/use Monitor/use OO::Monitors/ of course) since Christmas. 21:37
Guest98765: use a pastebin or gist.
Guest98765 OK
mst Guest98765: fpaste.scsys.co.uk/perl6 21:38
since shadowpaste just rejoined :D
japhb mst: Is there a way to make it prefill *both* the channel and nick? So people can bookmark a personal variant? 21:39
RabidGravy right, in the interests of science it took 31 minutes to run all the tests of all my modules, now rebuild and see
japhb RabidGravy: You mean, "rebuild Rakudo"? 21:40
RabidGravy yes
mst japhb: I'm not actually sure, but what I'm running is p3rl.org/Bot::PasteBot
japhb metacpan fail
RabidGravy I'm hoping that some of lizmat++s recent changes will improve this
japhb mst: 'Bot::Pastebot' perhaps? 21:41
RabidGravy: That would be awfully nice. :-) 21:42
dalek kudo/nom: b0b2fb0 | lizmat++ | src/core/Parameter.pm:
Optimize Parameter.named_names a bit

Not sure how to benchmark this, but allocating beforehand rather than pushing, should make things faster. I'm not sure why this is actually needed, apparently something somewhere in the stack needs the strings to be boxed, rather than native strings.
Guest98765 Thanks, mst
shadowpaste "Guest98765" at 217.168.150.38 pasted "Odd error message" (17 lines) at fpaste.scsys.co.uk/506406
mst japhb: oh, I *always* miscapitalise it 21:43
jnthn tries to work out the incantation to give bench to get the history plots out of it 21:45
japhb Guest98765: It's because successive lines of REPL are treated as inner scopes, and when you said 'my @list[0]' you declared a new @list with a 0-length first dimension -- and that's what all future lines in that run saw.
jnthn: See line 427 and following of bench 21:46
jnthn japhb: Seems like I just s/compare/history/ in the invocation 21:47
japhb 'bench --format=html_plot history ...
yeah
jnthn Nice
japhb wonders why JSON::Tiny no longer exists in his local Rakudo 21:48
Ah! Because panda now ships JSON::Fast instead of JSON::Tiny 21:50
japhb fixes his update-rakudo script and uses this as an excuse to rebuild with lizmat++'s improvements 21:52
Guest98765 Thanks, japhb; I'm now trying to relate the message to your explanation.
timotimo dinner time \o/ 21:52
jnthn timotimo: Enjoy :) 21:53
flussence wonders (as a curious and totally incompetent observer) if it'd be possible to spesh away unnecessary lexical scopes, instead of manually removing them
japhb Guest98765: An N-long dimension has indices 0..(N-1). In the degenerate N=0 case, you get the nonsense you paid for. Mind you, that's LTA.
jnthn flussence: Yes 21:54
(On the todo list)
flussence that'll be fun to have :D
jnthn japhb: ooc, is perl6-bench smart enough to not re-build tags? 21:56
I'll probably just cope with the wasted CPU for now if not, though :)
japhb jnthn: The build, time, and analyze phases are separate *specifically* so that you can avoid redoing work. But the expectation is that the driving script does the work of preventing rebuilds -- if bench is told to do a rebuild, it will, because it assumes you had a reason to do that. 22:04
jnthn japhb: That's totally fair enough 22:06
japhb: Given the machine I'm running this on is pretty much idle otherwise at the time, I've little incentive to save some minutes of CPU time, though. ;)
jnthn Anyways, think I'll be able to add history plots to the measurements 22:07
japhb heh
And cool!
jnthn Need to get the NQP leak check valgrinding in there too
dalek kudo/nom: efed541 | lizmat++ | src/core/Parameter.pm:
Round #1 of Parameter optimizations

  - add some more constants for clarity
  - create internal method for p6boxing strings (why is this needed??)
  - use ternaries where possible
  - use nqp:: ops where possible
22:19
jnthn lizmat: Why indeed o.O 22:20
lizmat doublechecks 22:21
jnthn lizmat: ooc, are you optimizing this because role composition is costly because it compares signatures which is currently implemented by .perl-ing them? :)
lizmat yes, and to get the lay of the land of that code area 22:22
jnthn *nod* 22:23
Then you perhaps already realized this, but there will be faster ways of doing the comparison :)
A short-circuit that checks if the number of things in the signature are different, or just checks nominal types, before doing The Full Thing will rule out lots of non-matches 22:24
lizmat oh, yes, I know
jnthn ok, coo
*cool
lizmat getting to that later...
jnthn :)
lizmat++
lizmat hmmm... apparently it just expects an Array back, rather than a List 22:26
but I guess we want to prevent action at a distance, so I can't just transplant the native attribute into an Array 22:27
RabidGravy I should optimise the order of my "all my modules smoke test" so that it does the ones with the most dependencies earlier 22:30
Skarsnik damn getting an error in a react block sucks :( 22:34
Odd number of elements found where hash initializer expected
in block <unit> at Ferrel.p6 line 36
line 36 is react { x) 22:35
RabidGravy yeah, I usually put additional taps on to see which is the offending supply 22:36
japhb sortiz: I'm getting a fail-to-install for DBIish; no such file for .../lib/DBDish/Role/Connection.pm6
dalek kudo/nom: 9dc21a0 | lizmat++ | src/core/Parameter.pm:
Turns out we need an Array only, no need to box
22:37
Skarsnik The issue, it's maybe an error a module
is that LTA or it's just not possible to get the proper line in a react context?
jnthn Skarsnik: I think we should be able to do better
Please file it 22:38
Async error reporting is always a bit "fun"... :)
RabidGravy yeah, when I was fixing up Net::AMQP I think I actually took longer to remove all the debugging instrumentation than actually fixing it 22:40
Skarsnik hm, should $disc.send-message($qnb-channel, ) be catched at compile time?
the missing argument 22:41
RabidGravy so running the tests again as the first time was inconclusive due probably to module recompilations 22:49
timotimo Skarsnik: we can never catch missing arguments on method calls 22:51
timotimo earlier than runtime, i mean 22:51
Skarsnik I mean, it's not even a parse error here?
or it's see as a List ?
timotimo final comma is allowed 22:56
if only to make "one argument per line, every line ending in a comma" allowed 22:57
Skarsnik will that be possible to have pragmas that allow perl6 to check method/routine sig at compile time? 22:58
timotimo routine sig checking can and will happen at compile time already
Skarsnik I get that the idea it's because with Meta programming it's not easy to be sure, but I am pretty sure in lot of code, there is no added/changed method 22:59
timotimo when we can mark classes as "closed", then we can perhaps do that, but we'll still have to make sure we don't miss any roles being mixed into instances 23:02
in any case, with objects, the receiving object is responsible for deciding how method calls are supposed to be treated
that goes back to the fundamental idea of method calls as "sending signals"
timotimo er 23:05
"sending messages", of course
dalek kudo-star-daily: 4f7fef4 | coke++ | log/ (8 files):
today (automated commit)
23:08
kudo-star-daily: d4acb8a | coke++ | log/ (8 files):
today (automated commit)
RabidGravy lizmat++ # totally unscientific this, but the second run of the modules test was 17 minutes 23:10
so more of that please
lizmat ah, so overall almost 2x as fast? cool 23:11
timotimo "modules test", as in rakudo star? 23:11
RabidGravy as in my own modules
timotimo 17 minutes is super long; how many modules was that?
RabidGravy 52 23:12
RabidGravy er no 23:12
44
there are quite a few very I/O intensive ones, some even with sleeps in 23:13
timotimo hm, ok 23:16
RabidGravy for reference the Audio::Encode::LameMP3 tests take approximately 1.75 minutes
Skarsnik I should h:p:x to see if there is any speed up since 4 months x)
timotimo how much time did it take before those changes?
how did lizmat get to "2x as fast"?
RabidGravy 31 minutes previously 23:17
or thirty something minutes
RabidGravy the LameMP3 test encodes a file completely ten times in different ways readiing it off the disk each time 23:19
so it really does benefit from faster Bufs 23:20
lizmat jnthn: nqp::existskey is documented to return non-0 on existence 23:25
but in practice, I've seen it always only return 0 or 1
could I depend on that behaviour, or do you see that changing at some point in the future ? 23:26
lizmat sets off a spectest and goes to bed 23:35
good night, #perl5!
sigh
#perl6!
:-)
timotimo gnite lizmat, good work today!
jnthn lizmat: Probably OK to depend on it 23:37
RabidGravy erk 23:40
I should probably try *installing* my modules every once in a while too
timotimo they don't install fine any more? :( 23:45
RabidGravy a couple of dodgy Build.pm in there
timotimo mhm 23:46
dalek osystem: 6267dbf | RabidGravy++ | META.list:
Switch to META6.json while I'm at it
23:47
jnthn Fingers crossed, there'll be a couple of extra files per day in the perl6-bench runs on moarvm.org now. We'll find out if I screwed it up in the morning, I guess... :-) 23:50
'night o/
timotimo neato :) 23:51
good night, jnthn!
rest well, get well :)