| psch wonders if something about freenodes anti-spam policy changed | 07:23 | ||
| nine__ | My server was banned on freenode this night :( I guess it's because I host camelia | ||
| psch | yeah, camelia was killed by some anti-spam/network-hammer-abuse-protection plugin | 07:24 | |
| but the immediately preceeding output doesn't look particular in any way, so i'm wondering if freenode changed something... :) | |||
| nine__ | Sucks big time :( I already wrote them an email, but no idea how long it's gonna take and how they'll react | ||
| psch | i mean, it's just 6 replies in a 2 minute window vOv | 07:25 | |
| timotimo | "bots are forbidden!!!!" | 07:34 | |
| psch | i did at first think it might be a net op, that Sigyn | 07:36 | |
| but it's just a plugin, so *probably* no drama coming :) | |||
| nine | psch: do you have a rakudo-j at hand and can give me the output of: module Foo { our %h := class :: does Associative { method AT-KEY($name) { "foo" } }.new; %Foo::h<bar>.say; }; | 08:02 | |
| psch | nine: i get (Any) | 08:05 | |
| nine | ok, thanks! | ||
| Maybe I should send this interaction to freenode admins as example for why camelia is invaluable ;) | 08:06 | ||
| psch | hehe | ||
| nine | Suddenly the solution was so obvious: PROCESS::<%PERL5> := class :: does Associative { multi method AT-KEY($name) { Inline::Perl5.default_perl5.global($name) } }.new; | 08:55 | |
| I mean, I've written PROCESS::<$REPO> := ...; a hundred times :) And the variable should be available everywhere once a Perl 5 module is loaded. | 08:56 | ||
| lizmat | nine: I think you could even make that lazy | 09:29 | |
| nine | Wonder if it would be worth it as you already have the cost of loading Inline::Perl5. | 09:30 | |
| lizmat | yeah, probably :-) | 09:31 | |
| nine | Now that I think of it, I wonder how this actually works with precompilation. Are those PROCESS:: variables part of the GLOBALish that gets merged on module loading? | ||
| lizmat | oooh... eh... | 09:32 | |
| no, because they're PROCESS:: | |||
| nine | I mean it does obviously work. I'm just not sure how :) And that after spending quite some time in this part ouf our code base... | ||
| lizmat | not GLOBAL:: or SETTING:: or whatever | ||
| PROCESS:: is out of everything and the final place where we look for dynamic vars before giving up | 09:33 | ||
| dalek | kudo/nom: 131cad2 | lizmat++ | src/core/ (2 files): Streamline dynamic variables setup/initialization - write in all nqp ops - create a Failure in INITIALIZE-DYNAMIC so we don't need to check for it in DYNAMIC Looks like this shaved off 1msec of bare startup time |
10:32 | |
| timotimo | lizmat: i wonder if the X metaop can be optimized at all? :) | ||
| lizmat | timotimo: it's on my list :-) | 10:33 | |
| meanwhile, in other news, TheDamian alerted me to some really strange behaviour wrt postcircumfix | |||
| timotimo | just because larry showed that particular function in his "it's the end of the world ..." talk | ||
| oh crap! | |||
| lizmat | $ 6 'multi postcircumfix:<< ⦋ ⦌ >>($a, $b) { }' | 10:34 | |
| real0m0.178s | |||
| $ 6 'multi postcircumfix:<< ⦋ ⦌ >>($a, $b) { $a } | |||
| real0m0.462s | |||
| timotimo | ... huh | 10:36 | |
| lizmat | try creating --profile-compile with these :-) | 10:37 | |
| timotimo | actually ... i think i need to take a little nap before i do anything anywhere | 10:38 | |
| lizmat | hehe,,, | ||
| anyways, the first has about 19K NQPArray allocations, the latter has about 10x as many NQPArray allocations | |||
| timotimo | o_O | ||
| NQPArray could very well be from regex NFAs | |||
| lizmat | why would the *body* of the postcircumfix make that change ? | 10:39 | |
| mergesubstates in NQP seems to be the largest user | |||
| anyways, having multiple ones seems to make things O2 worse | 10:40 | ||
| jnthn: could you shed light on gist.github.com/lizmat/7243e7abd32...c0a6f65025 ? | 10:47 | ||
| psch | oh boy, i gotta run that on perl6-j :) | 10:48 | |
| real 0m23.483s | 10:49 | ||
| that's lots better than i feared | |||
| lizmat | the slowdown is really in NQP, so... | 10:50 | |
| it feels as a worst case of needing to rewrite the P6 grammar 4 times | 10:51 | ||
| anyways, if I --profile-compile the gist, I get a file so large my browser won't eat it before my patience runs out | 10:52 | ||
| psch | right, still i'd have expected a somewhat comparable scaling | 10:53 | |
| and "perl6-j -e'1'" takes almost 5 seconds | |||
| whereas on moar that's probably at around .5 or so seconds? | |||
| so r-j only taking twice as long as moar on a given piece of slow code is surprising to me | 10:54 | ||
| lizmat | psch: about .115 for me | 10:57 | |
| psch | right, and .115 : 5 != 11 : 23 | 10:58 | |
| that's all, just a bit of a surprise :) | |||
| timotimo | lizmat: would it be enough to --target=parse? | ||
| for the profile, i mean | 11:00 | ||
| in theory, we could put in a --profile-compile=STAGE flag that'll only run profiling for a part of the compilation process | |||
| because the difference is just when you call nqp::startprofile and nqp::endprofile | |||
| lizmat | well, --target=parse apparently generates a lot of output | 11:01 | |
| timotimo | oh, yeah, that's true | ||
| maybe --output=/dev/null :) | |||
| lizmat | several GB's worth, by the look of it | ||
| it builds it all in memory, I killed it at 1.5GB | 11:02 | ||
| timotimo | oh crap. | ||
| lizmat | timotimo: get a nap first :-) | ||
| this has been sitting there possibly for years already :-) | 11:03 | ||
| timotimo | mhh | ||
| i don't have time for a nap, i have some place to be real soon >_< | |||
| and then i'll spend all the rest of the day on my feet | |||
| lizmat | at least since Christmas, as the problem also exists in 2015.12 | ||
| timotimo | and my legs are already mad at me for running around town this morning, and also sprinting to catch a tram | ||
| dalek | kudo/nom: 79f9be1 | lizmat++ | src/core/ (3 files): More of the same of a37cd221210bf242b5ad - Bag.total - Mix.WHICH/total - Set.WHICH/total |
11:19 | |
| jnthn | lizmat: I suspect that it's somehow failing to realize it already added the postcircumfix to the grammar the first time, so re-derives. Probably some kind of bug in name canonicalization. | 12:18 | |
| lizmat: And of course that combines badly with us completely re-computing the NFAs for the Perl 6 grammar rather than trying to only figure out the impacted ones. | 12:19 | ||
| lizmat | and when we had a smaller Perl 6 grammar, that wasn't such an issue maybe ? | 12:20 | |
| MasterDuke | jnthn, lizmat, timotimo: fwiw, i looked at a profile-compile of that gist in the QT profiler viewer | ||
| top by exclusive time: mergesubstates (gen/moar/stage2/QRegex.nqp:617) | |||
| mergesubrule (gen/moar/stage2/QRegex.nqp:514) | |||
| find_method (gen/moar/stage2/nqpmo.nqp:1296) | |||
| optimize (gen/moar/stage2/QRegex.nqp:780) | |||
| jnthn | Yup, mergesub* is all NFA computation | 12:21 | |
| And probably optimize too | |||
| lizmat: Well, less of one perhaps | 12:22 | ||
| lizmat: But it's always been a known thing that we're putting off until somebody wants to do the kinda tricky work to improve it :) | |||
| lizmat | hehe, so, should I make a ticket for it with TheDamian's original mail? | ||
| and this conversation ? | 12:23 | ||
| jnthn | Well, there's two issues | ||
| One is that we seemingly re-compute the grammar for the very same postcircumfix. | |||
| We should only be doing it once. | |||
| e.g. I'd only expect a big delay between Compiling... and First after | 12:24 | ||
| I'd expect it to be nearly nothing from then on. | |||
| lizmat | ah, ok, yes, that makes sense | ||
| jnthn | So that's a fairly clear-cut bug and that one should be comparatively easy to fix. | ||
| Then there's the second issue of adding new operators wanting a smarter NFA invalidation (or re-use) approach | 12:25 | ||
| Which is more a missing optimization than a bug. And a headache for one of us some day. :-) | |||
| To be fair it's not really *that* bad. | |||
| I just fear there'll be corner cases hiding. :) | 12:26 | ||
| lizmat | will it disappear in precomp ? | ||
| psch | i had thought a bit about canonicalization of categorical, but there doesn't seem to be a great solution | ||
| +s | |||
| i mean, we always have at least one grapheme that has to have different delimiters, and that makes it all a bit annoying | 12:27 | ||
| especially considering ::() lookup | |||
| jnthn | I think if you precomp a module defining a new operator then yeah, you should pay for it only during the compile | ||
| Of course if you *export* such an operator then the thing importing it will need its local languge tweaked and so have to pay | |||
| lizmat | but of course, if that gets precompiled, then we shouldn't have that issue during runtime, right ? | 12:28 | |
| jnthn | Right | 12:30 | |
| Noting though that lack of NFA re-use implies the precomp files will be sizable which may impact initial load time. | |||
| dalek | kudo/nom: e5c909c | lizmat++ | src/core/Hash.pm: Make Hash[Any,Any].ASSIGN-KEY about 15% faster - rewritten using nqp ops - smarter handling of empty typed hashes Almost not worth it, but such a basic functionality can use all the optimization it can get |
12:31 | |
| lizmat | afk& | 12:55 | |
| psch | well, add_categorical seems to bail correctly for the multi test case above | 13:25 | |
| at least it doesn't reenter the postcircumfix branch | |||
| gfldex | camelia has fallen, can someone help her up please? | 13:57 | |
| psch | gfldex: not really, no. the server hosting camelia got banned | 13:58 | |
| AlexDaniel | here too, evalable will be doing the job of camelia for now, just kick it when camelia comes back | 14:55 | |
| gfldex | jnthn: if you want to dig into problems with threading, you can pull the docs, edit Makefile to have --threads=2 and run `make bigpage` a few times. You can also add --no-cache to rule out precomp interactions. | 15:04 | |
| jnthn: i got about a 20% chance to get all sorts of errors, including segfaults | 15:05 | ||
| jnthn: you would greatly improve my productivity if you could make them go away :) | |||
| jnthn | gfldex: Does it use race/hyper? Those are certainly near the top of my list of things to look at | 15:07 | |
| (Basically, top once I have a day when my brane is up for concurrency work :)) | |||
| MasterDuke | gfldex: do you mean --parallel=2? | 15:08 | |
| jnthn: if that's what he means then no, it's using start and Proc::Async | 15:11 | ||
| mst | possibly stupid question - let's say I install moar, then nqp, then rakudo, all separately | 15:27 | |
| if I install a newer version of moar to the same prefix, should I expect the things on top of it to still be happy? | 15:28 | ||
| gfldex | jnthn: just `do await start {}` | 15:29 | |
| gfldex: no, I did not mean parallel | |||
| MasterDuke: no, I did not mean parallel | 15:30 | ||
| jnthn | mst: NQP will be; Rakudo, thanks to its current use of extension ops, will *usually* be, but can't be relied on (e.g. it's useful in development to avoid rebuilding all the things all the time, but there are MoarVM changes that need a re-comp of the extension ops). | 15:38 | |
| *are some MoarVM... | 15:39 | ||
| I'm aiming to kill of our need for ext op stuff and that'll mean the answer can be a straight "yes" in the future. | |||
| *kill off | |||
| mst | jnthn: hmm. ok, let me /achieve myself | ||
| it seems like the --gen-foo options to configure scripts do an install of whatever the foo was | |||
| which is totally fine for "I'm doing a build into ~/local" or whatever | 15:40 | ||
| but | 15:42 | ||
| if I can't configure nqp without moar installed, then I need to split the packages really | |||
| and if I can't configure rkaudo without nqp, same | |||
| OTOH if I could get rakduo to configure against an nqp build dir and nqp to configure against a moar build dir | |||
| *that* I could work with | 15:43 | ||
| jnthn: so, basically, it seems like my options are (a) bend the build system or (b) make it three packages | |||
| and you're saying that (b) is currently 'mostly', moving to 'yes' later | 15:44 | ||
| so I wonder if that means that's the best idea? | |||
| jnthn | mst: I'm guessing --prefix is not useful? | ||
| mst | hrm? | ||
| --prefix is already involved and not really the point I don't think | |||
| jnthn | Yeah, I suspected not because you're talking about configuring against an NQP build dir rather than the install dir... | 15:45 | |
| ...which gives me the slight problem that I can't figure out what you're trying to do. | |||
| But yeah, 3 separate packages has been the more typical way so far. | |||
| mst | lemme /achieve myself harder then | ||
| (when I say that, it's short for | |||
| step back. explain what you're trying to achieve. | |||
| jnthn | Though at present they're forced to be exactly in step with each other. | ||
| mst | which is an irssi alias of mine) | 15:46 | |
| fundamentally | |||
| I am trying to achieve "nothing gets installed into the prefix except during 'make install' time" | |||
| if that means I need to have three 'make install' phases, that's what I'll do | |||
| but if I can do it so I only have one at the end, that would be moar awesome | 15:47 | ||
| jnthn | Ah...yeah, the build system assumes that you have an installed Moar before doing NQP, and so on. | ||
| mst | right, which, boo :) | 15:48 | |
| and I'm guessing that 'install to scratch dir, move it later' will run into relocatability issues and fun | 15:49 | ||
| (my *eventual* goal here is to revive the Rakudo::Star cpan dist) | |||
| jnthn | Right | ||
| mst | I think Alien::MoarVM, Alien::NQP, then Rakudo::Star as separate dists | 15:50 | |
| is going to be least confusing for the moment | |||
| jnthn | Ah, and you want one "make install" for everything rather than things being able to fail part way through and have only some of it installed? | ||
| mst | I want to honour the principle that any given cpan dist only installs things during 'make install' time | ||
| I am completely open as to how toa chieve that | |||
| '3 dists' is fine | |||
| jnthn | Yeah, which is fair enough. But does imply 3 packages that depend on each other. | ||
| At the moment, anyway | |||
| Getting relocation to work would solve this various other things. | 15:51 | ||
| mst | yeah. I have no problem with doing that, especially since you said basically "it'll mostly work now, and become totally reliable later" | ||
| just before I went and tried the 3 dist thing I figured I'd check | |||
| like, if I'd done it and then you'd gone "but why didn't you just X?" I'd've facedesked hard | |||
| TimToady back home from Rome | 15:52 | ||
| yoleaux2 | 22 Jul 2016 14:48Z <unmatched}> TimToady: would you offer comments on whether my Int:D $i = Nil; should be accepted? There's a ticket for it: rt.perl.org/Ticket/Display.html?id...et-history and discussion: irclog.perlgeek.de/perl6-dev/2016-0...i_12889080 | ||
| mst | jnthn: so, basically, "given the constraints, 3 dists makes sense" ? | 15:53 | |
| jnthn | mst: Yes, it's how I'd do it | 15:55 | |
| mst | cool. I'll get round to that at some point then | 15:56 | |
| jnthn | TimToady: Hope you had a nice trip :) | ||
| TimToady | the catacombs were nice and cool when it was 39℃ on the surface :) | 15:57 | |
| jnthn | Ouch...that's hot | ||
| jnthn was in Rome last October and it felt like half of things he wanted to see were undergoing reconstruction... | 15:58 | ||
| TimToady | Curry On was a good conference | ||
| lotsa smartfolk doing cool stuff there | |||
| jnthn | I saw the video of your talk already made it online...didn't see it yet :) | 15:59 | |
| TimToady | well, it's mostly the release talk rewarmed | ||
| jnthn | ah, OK :) | ||
| TimToady | when I'm outside the echo chamber, I don't have to make up as much new stuffs :) | ||
| next year is in Barcelona, would encourage anyone to go and talk there | 16:01 | ||
| jnthn | Hm, that'll be hot too :P | ||
| TimToady | that's the problem with going to cheap conferences | ||
| mst | I dunno, the less cheap ones keep moving to Austin | 16:07 | |
| that's not really cool either | |||
| TimToady | oscon also moved up to May | 16:25 | |
| gfldex | jnthn: i left it running in a loop and produced the following output. It seams not to segfault anymore. gist.github.com/gfldex/8beab4e4025...538178398d | 19:04 | |
| jnthn | gfldex: Interesting, looks like an occasional bogus multi-dispatch fail | 19:12 | |
| pmichaud | hello perl6-dev | 19:14 | |
| yoleaux2 | 12 Jul 2016 17:57Z <[Coke]> pmichaud: - I thought the SYN were not the spec, why are you opening tickets citing the syn as the source of truth? | ||
| 22 Jul 2016 12:53Z <unmatched}> pmichaud: is there a possibility of adding several trusted users to twitter.com/rakudoperl Twitter account, so we could post announcements such us weeklies and R* releases? | |||
| jnthn | evening, pmichaud o/ | 19:15 | |
| gfldex | jnthn: there is a 2nd file in the gist where i put the outlier in | ||
| pmichaud | unmatched}: Sure, we can add trusted users to the twitter account. Umm.... how do I do that? | 19:16 | |
| TimToady | I was just offered the perl6 twitter account, which we might maybe could do something with | 19:17 | |
| timotimo | hey pm | 19:19 | |
| what should the sub that turns a uni codepoint's name into the char be called in p6? | |||
| lizmat | mst: we've already let O'Reilly know that we're not going to go to OSCON in Austin on account of some stupid laws that have been passed recently in TX | 19:20 | |
| pmichaud | Coke: In your yoleaux message of 12 Jul, I think you're referring to RT #128586. If so, it's not so much that I'm citing S03 as authoritative as that I think I prefer S03's description to what Rakudo is actually doing. | ||
| synopsebot6 | Link: rt.perl.org/rt3//Public/Bug/Displa...?id=128586 | ||
| pmichaud | evening, jnthn o/ | 19:22 | |
| TimToady | pmichaud: first undefined doesn't work so well for purposes of list comprehensions | 19:26 | |
| and that bit of spec was written before Slip even existed | |||
| pmichaud | TimToady: sure, I can go with that. | 19:28 | |
| TimToady | plus we now have the with/else construct when you really care about the undef | ||
| pmichaud | I was mainly looking for a way to have a test that returned the left-hand-side if it's a Failure | 19:29 | |
| to be able to help with the Str.Int issue that came up a couple of weeks ago | |||
| andthen looked promising, but if that's not the way to do it, I'm curious as to what is the way :) | 19:30 | ||
| with/else doesn't really do waht I wanted either | 19:31 | ||
| TimToady | how 'bout notandthen | 19:32 | |
| pmichaud | well, here's the issue | ||
| originally the Int method of class Str had the following: | |||
| return self.Numeric.Int; | |||
| (or something like that) | 19:33 | ||
| the problem was that for a non-numeric string, the exception would be immediately thrown | |||
| so "a".Int would throw an exception, while "a".Numeric would return an unthrown Failure | |||
| so, one could potentially do something like return self.Numeric andthen .Int | |||
| but only if infix:<andthen> returned its LHS | 19:34 | ||
| TimToady | with self.Numeric { return .Int } else { .return } | 19:35 | |
| pmichaud | Feels "heavy", especially for a built-in. | ||
| what I *really* wanted was to be able to say self.Numeric.¤Int | 19:37 | ||
| lizmat | pmichaud: is this about changing the code that now lives in the setting, or is this more about the functionality in genetal | ||
| *general | |||
| ? | |||
| pmichaud | lizmat: functionality in general | ||
| lizmat | ok, *phew* :-) | ||
| pmichaud | I'm fine with the nqp:: stuff that lives in the setting now | ||
| but being able to pass-through Failures is something we perhaps should address | |||
| what I *really* wanted was to be able to say self.Numeric.¤Int | 19:38 | ||
| where .¤ really meant "invoke this method if the invocate is not failure, otherwise return the invocant" | |||
| *invocant | |||
| also, I think that with self.Numeric { return .Int } else { .return } might have the effect of marking the Failure as handled | 19:39 | ||
| m: my $a = "a".Numeric; with $a { 1 } else { 0 }; say $a.handled; | |||
| evalable | pmichaud: |«HEAD»: WARNINGS for /tmp/ZOJXe9RSjI:Useless use of constant integer 0 in sink context (line 1)Useless use of constant integer 1 in sink context (line 1)True | ||
| pmichaud | the best I came up with was given self.Numeric { when Failure { $_ }; .Int } | 19:41 | |
| TimToady | m: say "a".Numeric.?Int | ||
| evalable | TimToady: gist.github.com/fed73dd2a70004922e...5e9f832e33 | ||
| pmichaud | I believe .?Int means "invoke Int if it exists" | 19:42 | |
| in this case, .Int definitely exists on both Failure and Str | |||
| (and Numeric) | |||
| TimToady | m: say Failure ~~ Nil | ||
| evalable | TimToady: |«HEAD»: True | ||
| TimToady | m: my $a = "a".Numeric.?Int; say $a.WHAT | 19:43 | |
| evalable | TimToady: gist.github.com/0bf8426ad6df2c3b31...c3c6ac66b7 | ||
| TimToady | what's up with the gists? | ||
| lizmat | TimToady: camelia got banned from freenode | ||
| geekosaur | this isn't camelia (which apparently got klined or something?) | ||
| TimToady | ah | ||
| pmichaud | ...but I'm not getting gists for my requests. Does it have to do with length of output? | 19:44 | |
| timotimo | dont we already return self from any method called on failures, but .Int and other coercers throw? | 19:45 | |
| pmichaud | timotimo: possibly, but that doesn't help in this case. | ||
| my $a = "a".Numeric; say ($a.xyz).WHAT | |||
| m: my $a = "a".Numeric; say ($a.xyz).WHAT | |||
| evalable | pmichaud: gist.github.com/d9348c3b0edfa7c0cf...3780583a1a | ||
| timotimo | bengoldberg also just got killed by the same antispam thing | ||
| TimToady | remind me not to be too productive :) | 19:46 | |
| pmichaud | timotimo: doesn't look like the failure got pass-throughed | ||
| mst | timotimo: antispam thing? | ||
| lizmat: wait, what? | |||
| you have a bot banned and nobody bothered telling me? | |||
| lizmat | it's banning people now as well, apparently | 19:47 | |
| BenGoldberg (~BenGoldbe@ool-457214ac.dyn.optonline.net) left IRC (Killed (Sigyn (Spam is off topic on freenode.))) | |||
| just now on #perl6 | |||
| pmichaud | m: my $a = "a".Numeric; say $a.WHAT; say ($a.?xyz).WHAT | 19:48 | |
| evalable | pmichaud: gist.github.com/f71d89e868002cbc98...c92e10b324 | ||
| pmichaud | I think my general off-the-top-of-my-head thoughts on Failure passthrough are at irclog.perlgeek.de/perl6/2016-07-09#i_12813298 | 19:49 | |
| and the difference between (if unless with) and (&& || //) discussed at irclog.perlgeek.de/perl6/2016-07-09#i_12813421 | 19:50 | ||
| TimToady | perhaps .fail on a handled failure should return the unhandled version | 19:51 | |
| pmichaud | the if/unless/with work well for comprehensions, returning slips when the condition isn't met. whereas the && || // forms return the last evaluated operand (that didn't meet the test) | ||
| so that andthen, passthen, defthen are like && || // but topicalize the LHS | 19:52 | ||
| and test for truth, failure, and definedness | |||
| dalek | kudo/nom: 78915a8 | lizmat++ | src/core/Hash.pm: Make my %h{Any}; (%h<a> = 42) = 666 work Not sure if this ever worked before, but it should, as my %h; (%h<a> = 42) = 666 and: my Int %h; (%h<a> = 42) = 666 have always worked. |
||
| pmichaud | It just really felt like there ought to be a concise way to pass Failure objects through a sequence of method calls without having to do a lot of smartmatching and testing along the way | 19:53 | |
| and without them automatically being thrown | |||
| but perhaps it's not common enough to worry about. | 19:54 | ||
| TimToady | there could maybe be a .? variant that checked for ~~ Nil | ||
| pmichaud | right, that's where I was going with .¤ | ||
| TimToady | that's why we made failure derived from Nil | ||
| pmichaud | Failure derived from Nil is new to me... I'll have to think about that. But yes, at first blush that feels more "generalized" than explicitly testing for Failure. | 19:55 | |
| TimToady | Nil is just the most mild form of Failure, as it were | ||
| pmichaud | Nil sure has morphed a lot in the development of this language. :) | 19:56 | |
| But "Nil is the most mild form of Failure" doesn't raise any alarm bells for me. | |||
| I won't take exception to it. :) | 19:57 | ||
| timotimo | pm, yes, those methods are special cased iirc | ||
| pmichaud | timotimo: which methods are special cased? | ||
| timotimo | Int and such, on Failure | 19:58 | |
| i seem to recall | |||
| pmichaud | I think they're just defined for Failure | ||
| I don't think there's anything really "special" about them. | |||
| essentially, if you ask a Failure for its value, you throw its underlying exception | 19:59 | ||
| timotimo | defined, yes | ||
| all others go through fallback | |||
| pmichaud | I didn't see that. | ||
| m: my $a = "a".Numeric; say $a.WHAT; say ($a.xyz).WHAT | |||
| evalable | pmichaud: gist.github.com/013b6cf05c15345010...fb817bc2b1 | ||
| pmichaud | in that one, the Failure gets thrown -- it's not passed through (i.e., no fallback) | 20:00 | |
| anyway, these are all food-for-thought notions. | 20:03 | ||
| I have to get back to $dayjob, so bbl | |||
| dalek | kudo/nom: 944e439 | lizmat++ | src/core/Hash.pm: Make Hash[Any,Any].BIND-KEY about 15% faster - rewrite in nqp ops - be smarter about handling uninitialized hashes |
20:11 | |
| kudo/nom: 60100c9 | lizmat++ | src/core/Hash.pm: Make Hash[Any,Any].EXISTS-KEY about 10% faster On an initialized hash. Again, not much, but basic functionality. |
20:39 | ||
| kudo/nom: 1724f8d | lizmat++ | src/core/Hash.pm: Make Hash[Any,Any].DELETE-KEY 10% faster - rewrite in nqp::ops - actually 25x faster when checking hash without storage well, could be more, because this is now not doing an unneccesary .WHICH |
21:14 | ||
| kudo/nom: 32c08b1 | lizmat++ | src/core/Hash.pm: Streamline Hash[Any,Any].keys|value|kv|pairs|antipairs - the MappyIterator role already handles uninited / empty hashes so no need to check for definedness here as well - rewrite pull-one's in nqp::ops which should specifically help .kv - this now returns Seq for uninited / empty hashes (before: List) as it should have from the beginning |
21:48 | ||
| gfldex | m: my Int:D @a; @a[0] = 1; @a[0]:delete; dd @a; | 21:55 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Array[Int:D] @a = Array[Int:D].new()» | ||
| gfldex | what should that do? | ||
| awwaiid | I guess that's the problem with types only being checked at assignment time. Maybe :delete should similarly raise an exception | 21:59 | |
| lizmat | gfldex: I'm not sure what you think the problem is ? | 22:00 | |
| gfldex | may be related to: github.com/rakudo/rakudo/pull/829 | ||
| lizmat | m: my @a = 1; @a[0]:delete; say @a.elems # deleting from the end reduces size | 22:01 | |
| camelia | rakudo-moar 1724f8: OUTPUT«0» | ||
| lizmat | m: my Int:D @a = 1; @a[0]:delete; say @a.elems # deleting from the end reduces size | ||
| camelia | rakudo-moar 1724f8: OUTPUT«0» | ||
| gfldex | lizmat: it's all good then | ||
| lizmat | yeah, :delete "removes" value, Nil assigns the default value | ||
| but keeps the element alive | 22:02 | ||
| gfldex | m: my Int:D @a; @a[0,1] = 1,1; @a[0] = Nil; dd @a, @a.elems; | ||
| camelia | rakudo-moar 1724f8: OUTPUT«Array[Int:D] @a = Array[Int:D].new(Int:D, 1)2» | ||
| lizmat | m: my Int:D @a = 1; @a[0] = Nil; say @a.elems # deleting from the end reduces size | ||
| camelia | rakudo-moar 1724f8: OUTPUT«1» | ||
| gfldex | well ... | ||
| lizmat | m: my @a is default(42) = 666; dd @a; @a[0] = Nil; dd @a | 22:03 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Array @a = [666]Array @a = [42]» | ||
| lizmat | m: my @a is default(42) = 666; dd @a; @a[0]:delete; dd @a | ||
| camelia | rakudo-moar 1724f8: OUTPUT«Array @a = [666]Array @a = []» | ||
| lizmat | m: my @a is default(42) = 666; dd @a; @a[0]:delete; dd @a[0] | 22:04 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Array @a = [666]Int @a = 42» | ||
| lizmat | m: my @a is default(42); dd @a[0] # also when not assigned to begin with | 22:05 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Int @a = 42» | ||
| lizmat | m: my @a; dd @a[0] # same, without default | ||
| camelia | rakudo-moar 1724f8: OUTPUT«Any @a = Any» | ||
| lizmat | m: my Int:D @a; dd @a[0] # same, but typed | ||
| camelia | rakudo-moar 1724f8: OUTPUT«Int:D @a = Int:D» | ||
| gfldex | m: my Int:D @a = 1; dd @a; @a[0] = Nil; for @a { .say }; | 22:06 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Array[Int:D] @a = Array[Int:D].new(1)(Int:D)» | ||
| awwaiid | m: my Int:D @a = 1, 2; @a[0]:delete; dd @a | 22:07 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Array[Int:D] @a = Array[Int:D].new(Int:D, 2)» | ||
| lizmat | so, afaics, it's all good | ||
| awwaiid | m: my Int:D @a = 1, 2; @a[0] = Int:D | ||
| camelia | rakudo-moar 1724f8: OUTPUT«Type check failed in assignment to @a; expected Int:D but got Int:D in block <unit> at <tmp> line 1» | ||
| gfldex | m: my Int:D @a = 1; dd @a; @a[0]:delete; for @a { .say }; | 22:08 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Array[Int:D] @a = Array[Int:D].new(1)» | ||
| gfldex | m: my Int:D @a = 1; dd @a; @a[0] = Nil; for @a { .defined.say }; | 22:09 | |
| camelia | rakudo-moar 1724f8: OUTPUT«Array[Int:D] @a = Array[Int:D].new(1)False» | ||
| gfldex | I do not agree on that one. I asked for an Array of defined values and when I iterate over it, I get a undefined value. Not what I asked for. | 22:10 | |
| awwaiid | gfldex: I think this has been a long-running confusion of mine, that you can assign Nil | ||
| but I asked a while back and was told that it's expected. I think this was an explicit decision at some point about how the type system works | 22:11 | ||
| gfldex | I'm fine that you can assign Nil, but I do not agree that you can assign Nil to a :D-typesmilied container. | ||
| mst | must admit, that seems a trifle odd to me as well | ||
| gfldex | That bug report will be rereported over and over again. | 22:12 | |
| lizmat | well, Nil is defined as returning a container to its default state | 22:13 | |
| m: my Int:D $a = 42; dd $a; $a = Nil; dd $a | 22:14 | ||
| camelia | rakudo-moar 32c08b: OUTPUT«Int $a = 42Int:D $a = Int:D» | ||
| lizmat | and that's exactly what it is doing | ||
| gfldex | that doesn't change the fact that I asked for a defined value, what means I want an exception if something undefined is assigned to it. | ||
| lizmat | m: my Int:D $a = 42; dd $a; $a = Int; dd $a | ||
| camelia | rakudo-moar 32c08b: OUTPUT«Int $a = 42Type check failed in assignment to $a; expected Int:D but got Int (Int) in block <unit> at <tmp> line 1» | ||
| awwaiid | m: my Int $x where * > 3 = 7; $x = Nil; say $x # similar thing I noticed | ||
| camelia | rakudo-moar 32c08b: OUTPUT«(<anon>)» | ||
| gfldex | lizmat: if :D is not the way to guard against undefined values, what is the proper way then? | 22:15 | |
| lizmat | but that's the whole thing | ||
| Nil is a sort of Failure | |||
| it is *not* an undefined value as such | |||
| awwaiid | my $n where *.defined = 7; $n = Nil; say $n; say Nil.defined | 22:16 | |
| lizmat | when assigning Nil, it should return the container to its default state | ||
| awwaiid | m: my $n where *.defined = 7; $n = Nil; say $n; say Nil.defined | ||
| camelia | rakudo-moar 32c08b: OUTPUT«(<anon>)False» | ||
| lizmat | well, one could argue that Nil.defined should return Bool rather than False | 22:17 | |
| gfldex | The problem is then the contradiction of a :D-typesmilied container and it's default value. | ||
| awwaiid | but since it returns false, seems like the guard should fail. I have no idea why it works. In general Nil does unintuitive things -- so far I've just avoided it altogether, but it scares me that it could pass so many safety checks | 22:18 | |
| gfldex | awwaiid: you can't avoid Nil as any sub/method call can return it | ||
| awwaiid | yeah. exactly what makes me nervous :) | 22:19 | |
| gfldex | m: sub f(Int:D $i where * !=:= Nil){ say 'glad' }; sub niler{Nil}; f(niler()); | 22:20 | |
| camelia | rakudo-moar 32c08b: OUTPUT«Type check failed in binding $i; expected Int but got Nil (Nil) in sub f at <tmp> line 1 in block <unit> at <tmp> line 1» | ||
| lizmat | m: say Int:D.defined | ||
| camelia | rakudo-moar 32c08b: OUTPUT«False» | ||
| gfldex | so if you really mean Int:D you have to write `Int:D where * !=:= Nil` | ||
| m: sub f(Int:D $i where .defined){ say 'glad' }; sub niler{Nil}; f(niler()); | 22:21 | ||
| camelia | rakudo-moar 32c08b: OUTPUT«Type check failed in binding $i; expected Int but got Nil (Nil) in sub f at <tmp> line 1 in block <unit> at <tmp> line 1» | ||
| gfldex | that's even more absurd | ||
| small Python children will point with fingers at us :( | 22:22 | ||
| awwaiid | But at least JS will continue to admire our prowess | ||
| lizmat | m: sub a(Int:D $a) { }; a Nil # what's wrong with this then ? | 22:23 | |
| camelia | rakudo-moar 32c08b: OUTPUT«Type check failed in binding $a; expected Int but got Nil (Nil) in sub a at <tmp> line 1 in block <unit> at <tmp> line 1» | ||
| awwaiid | hm! | 22:24 | |
| m: my Int:D $a = Nil # but this | |||
| camelia | ( no output ) | ||
| lizmat | m: my Int:D $a := Nil | ||
| camelia | rakudo-moar 32c08b: OUTPUT«Type check failed in binding; expected Int:D but got Nil (Nil) in block <unit> at <tmp> line 1» | ||
| lizmat | because that's assignment, not binding | 22:25 | |
| awwaiid | oh | ||
| I get so confused between assignment and binding when it comes to things like this. I guess I should figure it out more deeply | 22:26 | ||
| generally I feel like bindings are a smell of me doing something abnormal or fancy to some degree, so I avoid it | |||
| lizmat | m: my $a := 42; $a = 666 | 22:27 | |
| camelia | rakudo-moar 32c08b: OUTPUT«Cannot assign to an immutable value in block <unit> at <tmp> line 1» | ||
| gfldex | m: sub niler{Nil}; my Int:D @a; @a[0] = niler(); for @a -> Int:D $i { say $i } | ||
| camelia | rakudo-moar 32c08b: OUTPUT«Parameter '$i' requires an instance of type Int:D, but a type object was passed. Did you forget a .new? in block <unit> at <tmp> line 1» | ||
| awwaiid | lizmat: ya, that one makes sense | ||
| gfldex | m: sub niler{Nil}; my Int:D @a; @a[0] = niler(); for @a { say $i } | ||
| camelia | rakudo-moar 32c08b: OUTPUT«===SORRY!=== Error while compiling <tmp>Variable '$i' is not declaredat <tmp>:1------> Int:D @a; @a[0] = niler(); for @a { say ⏏$i }» | ||
| gfldex | m: sub niler{Nil}; my Int:D @a; @a[0] = niler(); for @a { .say } | 22:28 | |
| camelia | rakudo-moar 32c08b: OUTPUT«(Int:D)» | ||
| awwaiid | oh well. I'm off to whatch Ghostbusters! C'y'all later | ||
| gfldex | that makes it really hard to reason about values for @a. A novice programmer will almost always get it wrong. | ||
| lizmat | gfldex: what is your expected outcome of that ? | 22:30 | |
| gfldex | I would prefer any Nil or Failure to blow at the assignment, rather on useage of the value. Because between the two 10 minutes could pass, given I work with big datasets. | ||
| lizmat | but that's the entire point of Failures: that they *don't* blow on assignment | ||
| and since Nil is a form of Failure, the same goes for that | 22:31 | ||
| gfldex | I agree that this is a good idea for any container but the ones that explicitely ask for defined values. | 22:32 | |
| lizmat | well, I suggest you make a rakudobug @LARRY for this | 22:34 | |
| complete support for the type smileys were added quite near Christmas, and maybe we haven't thought this out well enough | 22:35 | ||
| gfldex | m: sub niler{Nil}; my Int:D $i1 = niler(); my Int:D $i2 where .defined = niler(); dd $i1, $i2; | ||
| camelia | rakudo-moar 32c08b: OUTPUT«Int:D $i1 = Int:D<anon> $i2 = <anon>» | ||
| lizmat is tired and goes to bed | 22:36 | ||
| good night, #perl6-dev | |||
| gfldex | lizmat: there is one already and also a PR by skids | ||
| i was just wondering what Int:D @a does. | |||
| pmurias | lizmat: good night | ||
| yoleaux2 | 21 Jul 2016 10:56Z <jnthn> pmurias: it seems you forgot to commit t/nqp/019-chars.txt in 3f34d27f95 | ||
| travis-ci | Rakudo build errored. Elizabeth Mattijsen 'Make Hash[Any,Any].DELETE-KEY 10% faster | 22:38 | |
| travis-ci.org/rakudo/rakudo/builds/146909422 github.com/rakudo/rakudo/compare/6...24f8d7a813 | |||
| gfldex | m: sub niler{Nil}; my Int:D $i where .defined = niler(); say $i; say $i.WHAT; | 22:40 | |
| camelia | rakudo-moar 32c08b: OUTPUT«(<anon>)(<anon>)» | ||
| gfldex | this really seams to need more thinking | ||
| filed as #128710 | 22:58 | ||
| synopsebot6 | Link: rt.perl.org/rt3//Public/Bug/Displa...?id=128710 |