🦋 Welcome to Raku! raku.org/ | evalbot usage: 'p6: say 3;' or /msg camelia p6: ... | irclog: colabti.org/irclogger/irclogger_log/raku Set by ChanServ on 14 October 2019. |
|||
jnthn | Ah, the macro bit I didn't play with, alas | 00:01 | |
stu002 | I posted a mailing list question on custom roles, built-in types and monkey typing: www.mail-archive.com/perl6-users@p...09037.html I'd appreciate any feedback on how to approach this issue in idiomatic Raku. | 00:08 | |
tbrowder | jnthn, as long as i can get one host working that can be macroized pretty easily. | 00:10 | |
guifa | codesections: hmm, good question. The problem is since expensive-calculation might have sideeffects that effect the next line of code. Maybe there’s a way to toss everything in a sub that does it delayed | 00:11 | |
like sub delayed(Callable foo) { sub slow() { foo() }; return lazy gather { take slow } or something ? | 00:12 | ||
might be missing some brackets and haven’t tested | |||
rypervenche: the methods should always be acting on a single instance | 00:13 | ||
jnthn: I’m revisiting my DateTime format code because Timezones. Is there any particular way i can structure things that will leave me better equipped for adopting RAST ? | 00:16 | ||
00:18
zacts left
|
|||
rypervenche | guifa: Wouldn't I need to use >>.made instead of .made on some of my $/ though in my actions? This is what I'm working on right now: gist.github.com/rypervenche/773835...61df79e21d | 00:23 | |
guifa | m: my $a = 5; say $a>>.Str | 00:24 | |
camelia | (5) | ||
guifa | The joy of scalars is that they listify into single items lists :-) | ||
so when in doubt, just treat everything as a list | |||
rypervenche | Huh...do you do that in your code as well? | 00:25 | |
timotimo | guifa: there's a module for your "delayed", i think it's got "lazy" and "catchup"? | ||
modules.raku.org/dist/Object::Dela...:ELIZABETH | 00:26 | ||
00:26
zacts joined
|
|||
timotimo | slack and catchup actually | 00:26 | |
guifa | rypervenche: I don’t think I’ve had many where it’s not really clear but I keep my tokens extremely tiny. | 00:28 | |
The general rule (actually, the only rule) is if there’s a quantifier of any type, or a named capture appears twice anywhere, it automatically becomes a list match and you can’t work on it as a scalar | |||
rypervenche | Hmmm, ok. I'll look at some code that others have written to try to get some ideas. Thanks. | 00:32 | |
Ahhhh, I must have been doing it wrong previously. I can add .WHAT to the level that I want and it will tell me if it's an Array. Perfect. | 00:37 | ||
00:39
aborazmeh left
|
|||
guifa | cleaner than using WHAT would be | 00:39 | |
$foo ~~ Array | |||
but .WHAT works too | |||
rypervenche | Ahh, I'm just going through each level manually. | 00:40 | |
cpan-raku | New module released to CPAN! App::Mi6 (1.0.2) by 03SKAJI | 00:46 | |
rypervenche | It looks like I was overthinking everything. The solution was just to loop through the array. Is there a cleaner way that I might do what I did in method TOP? gist.github.com/rypervenche/773835...61df79e21d | 00:57 | |
guifa | what’s the best way to ignore an argument in a ^ twigiled subroutine? sink? | ||
rypervenche: ah okay, I see probably the issue | 00:58 | ||
Don’t try to do too much on any given level | |||
method query-string { my %queries; for $<query> { … }; make %queries; } | 01:00 | ||
and then | |||
method TOP { make $query-string.made } | |||
rypervenche | Ooooh | ||
guifa | Trust me when I say your life will be much easier if you never try to jump a level :-) | ||
and the ‘make $<foo>.made’ is very common | 01:01 | ||
rypervenche | So I'll essentially need to add actions for each/most level/s then. | ||
I thought I'd be saving code/space by skipping them, but I see how much easier that is to read. | |||
guifa | It’s much cleaner. When you break them down small enough, most of them are one lines, are easy to immediately grok | ||
If you’re looking for places to save… “make ~$/“ is definitely one of them | 01:02 | ||
you can replace $<type>.made with $<type>,Str or ~$<type> and then avoid having a type method (ditto for value) | 01:03 | ||
rypervenche | Ah, do the stringification in one place (at least in this case). Very nice. Thanks so much for the help. | 01:04 | |
Much cleaner now. | 01:07 | ||
guifa | of course, I love how I said “you can avoid the make $/.Str” stuff and then I looked over an old actions class | 01:09 | |
github.com/alabamenhu/Intl-CLDR/bl...plurals.p6 | |||
lol | |||
sure enough, there’s one for <value> | |||
01:14
zacts left
01:15
sena_kun joined
01:16
Altai-man left
01:54
melezhik joined
|
|||
melezhik | .tell demostanis: "Also security doesn't seem to be that important as it's supposed to be running locally." I am not sure what you mean locally, sparrowdo could run over ssh as well | 01:55 | |
tellable6 | melezhik, I'll pass your message to demostanis | ||
01:58
melezhik left
02:06
Manifest0 left,
Manifest0 joined
02:35
stu002 left
|
|||
codesections | fun | 02:49 | |
rw | 02:53 | ||
03:03
defaultxr joined
03:10
cpan-raku left
03:14
Altai-man joined
03:16
sena_kun left
03:17
cpan-raku joined,
cpan-raku left,
cpan-raku joined
04:03
gordonfish- is now known as gordonfish
|
|||
guifa2 | whoa | 04:26 | |
class A { method morph($self is rw:) { $self = A.new } }; my $a = A.new; say $a.WHICH; $a.morph; say $a.WHICH; | 04:27 | ||
evalable6 | A|94104662207584 A|94104662207904 |
||
guifa2 | apparently you *can* replace an object during a method call | 04:28 | |
I don't know who had the insane idea to allow that but… bless you | 04:31 | ||
Whoa, and if you make morph a multi, you can even determine if the $self is writable or not | 04:49 | ||
m: class A { multi method a ($self is rw:) { say "Read/write" }; multi method a ($self:) { say "Read-only" } }; A.new.a; my $a = A.new; $a.a | 04:50 | ||
camelia | Read-only Read/write |
||
05:03
evalable6 left,
linkable6 left
05:06
linkable6 joined,
evalable6 joined
05:15
sena_kun joined
05:17
Altai-man left
05:40
rindolf joined
|
|||
xinming | Yesterday, I'm thinking, wether raku would allow to replace a function definition directly in another module | 05:59 | |
Let's say, module A has function base-function, and it exports an api which is do-sth, where do-sth will call the base-function. in our code, Is it possible that we replace the base-function to a new one, when we call do-sth, the do-sth function will pick up the new function? | 06:00 | ||
It's a bit like temp $var = "sdfsdfsf" | |||
After we go out of the scope, the base-function is restored to old one. | 06:01 | ||
06:01
sno left
|
|||
guifa2 | xinming: eh....almost | 06:07 | |
If you can reference the sub/method, you can wrap and unwrap it | 06:08 | ||
That effect is global, though and not lexically scoped. The trick I've used is to use a dynamic variable as a flag to decide whether I want to call the original or do something else. | 06:09 | ||
06:11
bocaneri left
|
|||
guifa2 | ModuleA::<&basefunction>.wrap( method (|c) { if $*REPLACEMENT { …… } else { callsame } ) | 06:13 | |
in the lexical scope you want to use the method, my $*REPLACEMENT = True; | 06:14 | ||
06:17
stu002 joined
|
|||
guifa2 | xinming: I hope that gives you a good starting point. I'm about to go to bed now, it's quite late here | 06:20 | |
06:21
bocaneri joined
06:22
bocaneri left
06:23
bocaneri joined
06:46
xinming left
06:47
xinming joined
06:49
Sgeo left
06:53
satori__ left
06:54
stoned75 joined
06:56
wamba joined
07:27
reach_satori joined
07:31
silug7 joined,
silug left,
silug7 is now known as silug,
vrurg_ joined
|
|||
Geth_ | doc/supply-split: 3757cf86dc | (Stoned Elipot)++ | doc/Type/Supply.pod6 Add Supply.split #3187 |
07:32 | |
07:32
vrurg left
|
|||
Geth_ | doc: stoned++ created pull request #3552: Add Supply.split #3187 |
07:32 | |
linkable6 | DOC#3187 [open]: github.com/Raku/doc/issues/3187 [big][docs][help wanted][versions] Checklist for version 2020.01 | ||
07:45
JJMerelo joined
07:50
sjm_uk joined
|
|||
JJMerelo | New 20th anniversary calendar entry raku-advent.blog/2020/08/09/rfc-5-...-comments/ | 07:55 | |
07:56
molaf joined
|
|||
Geth_ | advent: 3be31cb6f8 | (JJ Merelo)++ | 20th/articles/rfc54.md Adds links, eliminates whitespace, gets ready to upload @p6steve |
08:05 | |
08:09
stu002 left
08:14
Altai-man joined
|
|||
JJMerelo | .tell p6steve I've made some small changes and scheduled your post for tomorrow AM. I would need you to send me your email so that I can invite you to the site and assign authorship of the article to you | 08:14 | |
tellable6 | JJMerelo, I'll pass your message to p6steve | ||
JJMerelo | .seen p6steve | ||
tellable6 | JJMerelo, I saw p6steve 2017-10-29T08:02:09Z in #perl6: <p6steve> thanks! | ||
JJMerelo | uh-oh | ||
Geth_ | advent: 0157b09847 | (JJ Merelo)++ | 20th/articles/rfc54.md Some small corrections to publish Please @p6steve send me your email address so that I can invite you to the WordPress blog and assign authorship of the article once you've accepted. |
08:16 | |
08:16
sena_kun left
08:23
stu002 joined
|
|||
Geth_ | doc: a4d4b2263c | stoned++ (committed using GitHub Web editor) | doc/Type/Supply.pod6 Add Supply.split #3187 (#3552) |
08:24 | |
linkable6 | Link: docs.raku.org/type/Supply | ||
linkable6 | DOC#3187 [open]: github.com/Raku/doc/issues/3187 [big][docs][help wanted][versions] Checklist for version 2020.01 | ||
DOC#3552 [closed]: github.com/Raku/doc/pull/3552 Add Supply.split | |||
08:42
Kaiepi left
08:45
defaultxr left
|
|||
xinming | guifa2: Thanks, But I'd say, wrap is globally, I mean, if we can restore it automatically when we go out of scope will be best. | 09:00 | |
09:03
Kaiepi joined
09:08
JJMerelo left
09:21
sjm_uk left
09:26
xinming left
09:27
Kaiepi left,
xinming joined
09:31
JJMerelo joined
09:34
Kaiepi joined
10:01
sjm_uk joined
10:15
sena_kun joined
10:16
ensamvarg3 joined,
Altai-man left
10:31
stu002 left
11:27
JJMerelo left
|
|||
Geth_ | ¦ problem-solving: CIAvash assigned to jnthn Issue Destructuring infinite ranges and sequences github.com/Raku/problem-solving/issues/218 | 11:44 | |
advent: ab5tract++ created pull request #58: RFC 43 |
11:58 | ||
12:00
mscha joined
12:02
sno joined
|
|||
mscha | Quick Q: what's the equivalent of this Perl 5 construct? my ($y, $m, $d) = '20200809' =~ /(\d{4})(\d{2})(\d{2})/ | 12:03 | |
m: my ($y, $m, $d) = ('20200809' ~~ /(\d**4)(\d**2)(\d**2)/)[*]; say "$d-$m-$y"; | 12:04 | ||
camelia | 09-08-2020 | ||
mscha | That does the trick, but it won't work without the `[*]` | 12:05 | |
12:13
ab5tract joined
|
|||
ab5tract | .tell JJMerelo can you ping me in private when you get online? In the end I could use a new advent invite to a different email address | 12:15 | |
tellable6 | ab5tract, I'll pass your message to JJMerelo | ||
12:16
gnufr33dom left
|
|||
CIAvash | m: my ($y, $m, $d) := '20200809' ~~ /(\d**4)(\d**2)(\d**2)/; say "$d-$m-$y"; | 12:17 | |
camelia | 09-08-2020 | ||
CIAvash | mscha: ↑ | 12:19 | |
mscha | Thanks, CIAvash! | ||
12:25
sno left
12:27
sno joined
12:32
wamba left
12:35
lichtkind joined
12:46
xinming left
12:47
xinming joined
13:12
oddp joined
13:14
Altai-man joined
13:16
sena_kun left
13:25
mscha left
|
|||
guifa | xinming: You can unwrap when out of scope. my $wrapper = ModuleA::<&baseFunction>.wrap( … ); ……; ModueA::<&baseFuncion>.unwrap($wrapper) | 13:32 | |
13:32
wamba joined
|
|||
guifa | However, if your code is asychronous at all, you can’t guarantee that outside of the scope the wrapped version won’t be called. | 13:33 | |
13:48
ab5tract left
14:07
MilkmanDan left
14:08
stoned75 left,
MilkmanDan joined
14:32
domidumont left
14:56
Kaiepi left
15:00
Kaiepi joined
15:02
Kaiepi left
15:03
Kaiepi joined,
Kaiepi left
15:14
sena_kun joined
15:16
Altai-man left
15:35
Sgeo joined
15:39
Kaiepi joined
15:40
stoned75 joined
|
|||
codesections | Is this idiomatic code for flattening a nested Hash? It feels clunky/like I'm missing a better way: | 15:41 | |
m: my %h = a => [1,2,3], b => [7,8,9]; dd %h.values.map(*.flat).flat | 15:42 | ||
camelia | (7, 8, 9, 1, 2, 3).Seq | ||
codesections | Oh, the Array docs suggest the following, which still isn't *great*, but is much better | 15:44 | |
m: my %h = a => [1,2,3], b => [7,8,9]; dd %h.values».List.flat | |||
camelia | (7, 8, 9, 1, 2, 3).Seq | ||
codesections | never mind, then :) | ||
15:45
[Sno] joined
15:46
sno left
|
|||
Geth_ | advent/master: 4 commits pushed by ab5tract++, (Juan Julián Merelo Guervós)++ | 15:48 | |
stoned75 | q | 15:49 | |
15:50
[Sno] left
15:58
wamba left
16:16
demostanis joined
|
|||
demostanis | Hello people, is there a way to (like in JavaScript) give a default value to a variable defined with my (...) in case it's Nil? | 16:17 | |
tellable6 | 2020-08-09T01:55:05Z #raku <melezhik> demostanis: "Also security doesn't seem to be that important as it's supposed to be running locally." I am not sure what you mean locally, sparrowdo could run over ssh as well | ||
demostanis | Example: my ($a, $b = "default value) = (1) # $a = 1, $b = Nil | 16:18 | |
rypervenche | m: my $var = Nil // "blah"; say $var; | ||
camelia | blah | ||
demostanis | Yeah, but what if I define it with my (...)? | ||
rypervenche | Oh sorry, I misunderstood. | 16:19 | |
demostanis | melezhik: What I meant is that the sparrowfile is executed locally, and isn't being fetched from an untrusted somewhere else? Am I right? | ||
tellable6 | demostanis, I'll pass your message to melezhik | ||
demostanis | I'm doing this in a proto subroutine | 16:20 | |
my ($thing1, $thing2 = "might not exist so should give a default value") = {*} | |||
codesections | demostanis: interesting, I'm surprised that this vvvv doesn't work | 16:21 | |
m: my ($a, $b = 42) = (1,) | |||
camelia | ( no output ) | ||
codesections | m: say my ($a, $b = 42) = (1,) | ||
camelia | (1 (Any)) | ||
demostanis | Do I have to do $b = "default value" if !$b.defined | ||
Isn't there a cleaner way? And why won't Rakudo throw any error if my ($a, $b = "...") isn't correct? | 16:22 | ||
guifa | You can use the default trait | ||
demostanis | What is it? | ||
guifa | m: my $a is default(‘default’); my $a = “set”; say $a; $a = Nil, say $a; | 16:23 | |
camelia | Potential difficulties: Redeclaration of symbol '$a'. at <tmp>:1 ------> 3my $a is default(‘default’); my $a7⏏5 = “set”; say $a; $a = Nil, say $a; set default |
||
guifa | err | ||
m: my $a is default(‘default’); $a = “set”; say $a; $a = Nil, say $a; | |||
camelia | set default |
||
demostanis | m: my ($hello, $world is default("John")) = ("hello ") | 16:24 | |
camelia | ( no output ) | ||
demostanis | m: say my ($hello, $world is default("John")) = ("hello ") | ||
camelia | (hello (Any)) | ||
demostanis | Nope? | ||
guifa | m: say my ($hello, $world is default("John")) = ("hello “, Nil) | ||
camelia | 5===SORRY!5=== Error while compiling <tmp> Unable to parse expression in double quotes; couldn't find final '"' (corresponding starter was at line 1) at <tmp>:1 ------> 3ld is default("John")) = ("hello “, Nil)7⏏5<EOL> expectin… |
||
guifa | er stupid quote replacement on Colloquy | ||
codesections | I was trying that too. Doesn't work | 16:25 | |
m: say my ($hello, $world is default("John")) = ("hello ", Nil) | |||
camelia | (hello (Any)) | ||
demostanis | Okay, thanks, I didn't know about it! | ||
guifa | Oh duh. Trait needs to go with declarator. Compare | 16:27 | |
m: (my $hello, my $world is default("John")) = (Nil, Nil) | |||
camelia | ( no output ) | ||
guifa | m: say (my $hello, my $world is default("John")) = ("hello ", Nil) | ||
camelia | (hello John) | ||
codesections | demostanis: one note that doesn't help solve your problem but that you might want to know (it's tripped me up before): in Raku `("Hello")` doesn't create a 1-element List. You need `("Hello", )` or just `"Hello",` | ||
guifa | m: say my ($hello, $world) is default('John') = (Nil, Nil) | ||
camelia | (John John) | ||
guifa | You’ll just have to content yourself with repeating my once or twice :-) | 16:28 | |
demostanis | codesections: Oh yeah, sorry, I often do this mistake | 16:31 | |
codesections | Me too :) | ||
guifa | The nice thing about the commas making the lists is that you can remove sooo many parentheses | 16:35 | |
16:38
poohman joined
16:39
leah2 left
|
|||
poohman | hello all, I was searching for using grammars in Binary streams - as far as I could find there were a few searches for this earlier and it seems like Raku does not support this as of now | 16:40 | |
I have seem some excellent work by dwarring in the pdf grammar module - he has done something like that | 16:41 | ||
should I go for something like Katai Structs or can I try in Raku | 16:42 | ||
we have Perl bindings for Katai Structs | |||
any suggestions or ideas? | 16:43 | ||
guifa | poohman: I’m working on binary grammars but I don’t have them ready yet, but you can check out the project here | ||
github.com/alabamenhu/BinexObjex | |||
poohman | hi guifa, thanks, Ill have a look | 16:44 | |
guifa, just curious - have you looked at Katai Structs? | |||
guifa | Be warned there’s probably lots of bugs, I haven’t touched it in a bit as I’m waiting for RakuAST to be released | ||
poohman | sure thanks for the heads up | 16:45 | |
guifa | Yeah, Binex is designed to be similar, except run more like Raku grammars with mostly the same syntax. | ||
If you’re familiar with Katai already | |||
I’d look into just using the Perl module in Raku | 16:46 | ||
poohman | ok thanks | 16:47 | |
codesections | m: my ($hello, $world) = ([Z] ("hello", Nil), ((), 'John')).map({.head // .tail}) | ||
camelia | ( no output ) | ||
codesections | m: say my ($hello, $world) = ([Z] ("hello", Nil), ((), 'John')).map({.head // .tail}) | ||
camelia | (hello John) | ||
guifa | o.O | ||
That is one of the ugliest lines of code I’ve seen in a while ;-) | |||
codesections | demostanis: ^^^ alternate syntax that's probably less useful than `in default` but might be better in some cases | 16:48 | |
:D | |||
16:49
leah2 joined
|
|||
codesections | well, it lets you do something like `my ($a, $b) = ([Z] get-values, $defaults).map({.head // .tail})` if you already have defaults defined | 16:49 | |
(and I just like zipping lists, what can I say?) | 16:50 | ||
I know `when` and using a literal regex will automatically smartmatch against the topic if no other smartmatch is provided. Is there any other case where Raku does that auto-aginst-the-topic behavior? | 16:52 | ||
rypervenche | In a sink context. | 16:53 | |
From the regexes doc: In case a Regex object is used in sink context, or in a context in which it is coerced to Bool, the topic variable $_ is automatically matched against it: | 16:54 | ||
codesections | Right, that's a better/more technical way to say what I meant. I know regex will auto-match against the topic (in sink contexts). And I know `when` will too. Are there any other catigories besides those two? | 16:55 | |
guifa | I can’t think of any off the top of my head | 16:56 | |
codesections | Thanks | ||
guifa | It’s sort of a very Perl-esque way to do things | ||
(and one of the few that Raku moved slightly away from) | |||
codesections | Oh? How so? I don't know Perl | 16:57 | |
guifa | So in perl, the topic was reset with each operation | ||
demostanis | codesections: I think I'm too new to Raku to understand your piece of code | ||
guifa | my $a = 5; # now $_ = 5 | ||
my @b = 1,2,3; # now $_ is 1,2,3 | |||
16:58
domidumont joined
|
|||
guifa | pop | 16:58 | |
16:58
domidumont left
|
|||
guifa | # now b is 1,2; and $_ is 3 | 16:58 | |
codesections | Ah, interesting | ||
guifa | I don’t think either way is per se better, but it’s important to be consistent with either one | ||
That said | 16:59 | ||
I wonder if I can catch the topic variable | |||
in a sub, I mean | |||
17:00
zacts joined
|
|||
guifa | Yup | 17:00 | |
sub foo { say CALLER::<$_> }; for ^3 { foo } | |||
m: sub foo { say CALLER::<$_> }; for ^3 { foo } | |||
camelia | Cannot access '$_' through CALLER, because it is not declared as dynamic in sub foo at <tmp> line 1 in block <unit> at <tmp> line 1 |
||
guifa | hmmmm | ||
codesections | Raku lets you do chained assignment, so you could do $_ = my $a = 5 | 17:01 | |
guifa thinks this is a (relatively) recent change. It’s working on TIO | |||
But it makes sense for $_ to not be dynamic | |||
17:02
stoned75 left
|
|||
guifa | That said, $/ is dynamic. So you can totally much with it if you want | 17:02 | |
17:04
demostanis left
17:14
Altai-man joined
17:16
sena_kun left
17:18
wamba joined
17:20
melezhik joined
|
|||
melezhik | .tell demostanis: "sparrowfile ... isn't being fetched from an untrusted somewhere else" - correct | 17:21 | |
tellable6 | melezhik, I'll pass your message to demostanis | ||
17:29
natrys joined
17:30
melezhik left
17:43
lichtkind left
|
|||
guifa | I wish it using the $^args were a bit more forgiving on number of arguments — basically, ignoring additional ones | 17:45 | |
17:49
poohman left
17:52
aluaces left
17:53
mowcat joined
18:08
ensamvarg3 left,
zacts left
18:09
zacts joined
18:13
lichtkind joined,
xinming_ joined
18:14
mowcat left,
mowcat joined
18:16
xinming left
|
|||
codesections | you mean so that you could do something like `my &f = { say $^a }; f(1, 2)` without getting an error? | 18:21 | |
guifa2 | yeah | ||
I have a giant hash of callables and all of them need $a, most need $b, and a small handful need $c | 18:22 | ||
I was using {sink $^b; $^a.foo } for those that didn't need $b | |||
but once I realized I needed $c… it just feels wasteful | 18:23 | ||
using @^foo defeats the naming advantage. ah well | 18:24 | ||
I'll just give them all a signature. It's just already a huuuuuuuuge hash with long lines because I'm trying to do one line per entry | |||
codesections | is there a way to do named formal args? something like `%^:a`? | 18:25 | |
18:25
cpan-raku left
|
|||
codesections | Probably not, "named formal arguments" sounds like a contradiction | 18:26 | |
Altai-man | codesections, yeah. | 18:27 | |
m: { say $:hehe }(hehe => 42) | |||
camelia | 42 | ||
Altai-man | codesections, ^ | ||
m: { say $^foo }(42) | |||
camelia | 42 | ||
Altai-man | ^ positional formal one | ||
codesections | guifa: Would the named variant ^^^ solve your use case | 18:28 | |
? | |||
guifa2 | WHOA | 18:29 | |
I had no idea you could twiggle with colons | |||
although it is clearly documented so I s'pose I should have | 18:30 | ||
That's perfect for me, actually since it helps for self documenting on the calling side | 18:31 | ||
codesections | m: my &f = {say $:a }; f(a=>0, b=>2) | 18:32 | |
camelia | Unexpected named argument 'b' passed in block <unit> at <tmp> line 1 |
||
codesections | Do you run into that error ^^^ ? | ||
guifa2 | ouch | ||
guifa2 hadn't tried it yet | 18:33 | ||
18:33
domidumont joined
|
|||
guifa2 | formal signature it is then | 18:35 | |
codesections | This is a bit sloppy/less safe, but you could use dynamic formal variables: | ||
m: my &f = {say $:a }; f(a=>0, b=>2) | |||
camelia | Unexpected named argument 'b' passed in block <unit> at <tmp> line 1 |
||
codesections | m: my &f = {say $*a }; { my $*a = 0; f} | 18:36 | |
camelia | 0 | ||
codesections | (sorry, wrong paste the fist time) | ||
18:36
domidumont left
|
|||
xinming_ | my $c = \(1, 2, 3, :a<b>, "a" => 1); [$c.list, $c.hash].raku.say; | 18:36 | |
evalable6 | [(1, 2, 3, :a(1)), Map.new((:a("b")))] | ||
CIAvash | guifa2: If understood you correctly, you can use `@_ ` inside your sub to refer to parameters | 18:37 | |
xinming_ | Inthis example, what if both :a<b>, and "a" => 1 are in a scalar, How can we let raku DWIM? | ||
the quoted "a" => 1 will be put into list, while :a<b> will be in hash. What if we use slip, and they are all in an array, where the array contains list of pairs? | 18:39 | ||
guifa2 | CIAvash: indeed, but using @_ means you lose the semantic connection to the variables. (%_ is a possibility, but this is a hot enough loop that hash access is a major slowdown). I'll try with the dynamics | ||
codesections | CIAvash: ooh, I knew about @_, but you saying that made me realize that there's also `%_` | ||
xinming_ | That makes me quite curious, wether this is handled in syntax level | ||
codesections | Wow, that's a pretty hot loop – *Hash access* is too slow? Does Raku do something weird where Hash access isn't O(1), or is it just the time of dereferencing the pointers that's too slow? | 18:41 | |
guifa2 | m: my $c = \(1, 2, 3, "a" => 1, :a<b>, ); [$c.list, $c.hash].raku.say; | ||
camelia | [(1, 2, 3, :a(1)), Map.new((:a("b")))] | ||
timotimo | where can i see the code? :) | ||
guifa2 | codesections: it's O(1), but hash access compared to attribute access is hugely different. I can't imagine hash access being faster than access bound arguments | 18:43 | |
When you have %hash<a><b><c><d><e><f><g><h><i><j> over and over again haha | |||
codesections | Yeah, that *is* a lot of indirection :) | 18:44 | |
18:44
bocaneri left
|
|||
guifa2 | When I mentioned needing a $c, it's because I've been passing in something around, say, level E up there to avoid a few levels of calls, but suddenly I needed a sister element of E that I can only access from C level. | 18:45 | |
timotimo: you can see the old monstrosity code here: github.com/alabamenhu/Intl-CLDR/bl...teTime.pm6 | 18:46 | ||
18:46
raku-bridge1 joined,
cpan-raku joined,
cpan-raku left,
cpan-raku joined
|
|||
guifa2 | I'm converting the giant given/when into a single hash whose keys are <a aa aaa aaaa aaaaa A AA AAA AAAA AAAAA>, etc, which should be a good bit faster | 18:46 | |
but then have to deal with passing vars into the callable values | 18:47 | ||
timotimo | the "for @pattern" loop? | 18:48 | |
codesections | Makes sense. Dynamic variables enclosed in a lexical block to limit their scope otherwise seem like a good fit for that usecase | 18:50 | |
guifa2 | Yeah. What I was thinking about doing is in the pattern parsing action, just return a list of callables. | ||
codesections | Even though I don't love dynamic variables for many use cases | ||
guifa2 | @pattern».(args…).join | 18:51 | |
(the current version can only generate a handful of patterns a second which is… awful lol) | |||
s/generate/format | 18:52 | ||
18:56
Geth joined
18:58
raku-bridge1 left,
raku-bridge2 joined
19:00
wamba left
19:01
raku-bridge2 left
19:02
[Sno] joined,
Geth_ left,
raku-bridge3 joined
19:03
raku-bridge3 left,
raku-bridge4 joined
19:06
raku-bridge4 left
19:07
raku-bridge5 joined
19:08
raku-bridge5 left
19:09
raku-bridge6 joined
|
|||
timotimo | oof | 19:11 | |
did you try to --profile it, or run any other kind of profiler at it? | |||
guifa2 | timotimo: the html profiler can't locate a file for me. Is there a way to cleanly view the SQL file generated? I couldn't find info on that but I probably just missed them | 19:14 | |
timotimo | moarperf will display all the info from the sql for you | ||
19:15
sena_kun joined
19:16
molaf left,
Altai-man left
19:17
raku-bridge6 left
|
|||
timotimo | github.com/Raku/nqp/pull/354#issue...-296382898 - also check this out; it will need a rename or two of the variables, though | 19:18 | |
19:18
raku-bridge7 joined,
raku-bridge7 left,
raku-bridge7 joined
|
|||
guifa2 | timotimo++ | 19:19 | |
There's a LOT of perf tuning I need to do for Intl | |||
19:26
raku-bridge7 left,
raku-bridge8 joined,
raku-bridge8 left
19:27
Geth_ joined,
Geth left,
cpan-raku left
19:28
raku-bridge1 joined
19:35
raku-bridge left,
raku-bridge1 is now known as raku-bridge,
sjm_uk left
19:44
cpan-raku joined,
cpan-raku left,
cpan-raku joined
19:47
raku-bridge left
19:48
Geth_ left,
cpan-raku left
19:49
Geth joined
19:50
raku-bridge joined,
raku-bridge left,
raku-bridge joined
20:06
ab5tract joined
20:07
raku-bridge left,
raku-bridge joined
20:08
cpan-raku joined,
cpan-raku left,
cpan-raku joined
|
|||
guifa | codesections timotimo here’s a quick mockup of the speed difference between arguments and dynamics | 20:10 | |
bit.ly/2XKD38D | |||
dynamics are ~5x slower | 20:11 | ||
timotimo | even with our dynamic variable cache, they aren't extremely fast | ||
arguments, on the other hand, tend to be extremely well optimized | 20:12 | ||
guifa | Yeah, so that definitely pushes me to making all of my little code blocks get a signature | ||
Actually interesting | 20:16 | ||
20:17
Kaiepi left
|
|||
guifa | It’s FASTER to pass containers | 20:17 | |
I would have thought binding everything and passing in contextless/sigiless vars would have been faster | 20:18 | ||
timotimo | optimizer performance can be a bit "bumpy" | 20:19 | |
guifa | But consistently it’s about a 1 : 2.5 : 5 performance ration between $args, \args and $*args | ||
yeah, I know stuff isn’t crazy optimized yet, so I swear I’m not trying to prematurely optimize | 20:20 | ||
20:20
rir joined
|
|||
timotimo | unexpected things can prevent some optimizations, is what i mean | 20:20 | |
so the impact can be surprising | |||
20:21
Geth left
20:22
aluaces joined
|
|||
guifa | indeed | 20:22 | |
20:22
aluaces is now known as alberto
|
|||
guifa | More testing actually shows that… it’s having an explicit signature | 20:22 | |
ab5tract | .tell JJMerelo if you could send the invite to my email in CONTRIBUTORS that would be awesome. if not, no worries -- the post will be live and pre-published for Tuesday mid-morning tomorrow no matter what | ||
tellable6 | ab5tract, I'll pass your message to JJMerelo | ||
20:23
Geth joined,
raku-bridge left,
alberto is now known as Guest2056
|
|||
guifa | -> $a, $b, $c { $a + $b + $c } vs { $^a + $^b + $^c } | 20:23 | |
I would have thought that they were functinoal identical but that’s not the case, it turns out | |||
err s/functionally identical/compile identically | |||
20:23
raku-bridge joined,
raku-bridge left,
raku-bridge joined
|
|||
timotimo | that's the speed difference? | 20:26 | |
guifa | yeah | 20:27 | |
20:27
raku-bridge left,
raku-bridge joined,
raku-bridge left,
raku-bridge joined
|
|||
guifa | Granted, I’m testing this on TIO, so I should probably go and do it on a newer version; one sec | 20:27 | |
same results on 2020.01 | 20:28 | ||
Although the ratio is now more like 1 : 2 : 3 | 20:29 | ||
codesections | very interesting | 20:30 | |
20:32
Kaiepi joined
|
|||
codesections | Here's the output I get from your Tio script on 2020.06: | 20:33 | |
arg in 0.04354408 | |||
dyn in 0.06789509 | |||
arg in 0.0064172 | |||
dyn in 0.0642456 | |||
arg in 0.0064169 | |||
dyn in 0.0639006 | |||
It looks like they're not *that* different to start with, but the dynamic variable prevents optimization in later calls (I bet it prevents the function inlined, though that doesn't entierly make sense) over time | 20:34 | ||
20:39
Geth left,
cpan-raku left,
raku-bridge left
20:41
Geth joined
|
|||
sena_kun | sourceable6, 1+2 | 20:41 | |
sourceable6 | sena_kun, No idea, boss. Can you give me a Code object? | ||
20:42
cpan-raku joined,
cpan-raku left,
cpan-raku joined,
raku-bridge joined,
raku-bridge left,
raku-bridge joined
|
|||
sena_kun | sourceable6, &infix:<+>; | 20:42 | |
sourceable6 | sena_kun, github.com/rakudo/rakudo/blob/7986...c.pm6#L208 | ||
AlexDaniel` | sourcable6: 1 + 2 | ||
sourceable6 | AlexDaniel`, github.com/rakudo/rakudo/blob/7986...t.pm6#L335 | ||
coverable6 | AlexDaniel`, and I oop! Backtrace: gist.github.com/10ebb3922e67f2a5af...2bc74e004d | ||
20:43
rindolf left
|
|||
AlexDaniel` | sena_kun: seems like it wants spaces | 20:43 | |
sena_kun | So be it, could trigger it anway. ;) | ||
20:44
ab5tract left
20:47
Black_Ribbon joined
|
|||
AlexDaniel | sena_kun: yes but that particular candidate is in a different file :) | 20:49 | |
sena_kun | Oh, you are right. To be honest, I was expecting to find where `is assoc` is set, but I suspect it is somewhere deeper in the guts, really, and I don't want to increase size of my article which is already pretty big. | 20:50 | |
guifa2 | codesections: the first run is the slowest, but once they heat up, you can see it's an order of magnitude. Although when I got the 1:2:3 I upped the repetition count by an order of magnitude too | 20:54 | |
AlexDaniel | sena_kun: github.com/rakudo/rakudo/blob/7986....nqp#L3666 | ||
sena_kun: and also: github.com/rakudo/rakudo/blob/7986....nqp#L4106 | 20:55 | ||
rir | Could not @Demostanis have just used `my $v = something() // default;` in his proto function. (I'm late for reading the docs and interruptions.) | 20:56 | |
sena_kun | AlexDaniel, what a nice low-levelness. | ||
AlexDaniel | sena_kun: I don't know why it's there | 20:57 | |
maybe jnthn has a long explanation | |||
codesections | Well, I guess I'm curious about the "once they heat up" part. I assume a lot of that is from warming the cache or giving the JIT more info to work with. Which is what I mean by saying that the dyn variable seems not to prevent inlining or something | ||
guifa ^^ | 20:58 | ||
sena_kun | Well, it's no wonder fundamental operators to run things are implemented using low-level bits. | ||
AlexDaniel | sena_kun: it's not fundamental operators, it's all operators | ||
sena_kun: maybe it has something to do with the penalty involved when defining new operators | |||
codesections | rir: If I remember that conversation correctly, no, that's what they wanted to be able to do but that isn't valid syntax (though I'd love to be wrong if you have a working example!) | ||
sena_kun | AlexDaniel, fair enough. | 20:59 | |
guifa2 | codesections: Replace the dynamic would with a &explicity = -> $a, $b, $c, $d, $e, $f, $g { $a+$b+$c+$d+$e+$f+$g }; there shouldn't be a problem inlining that one though, which is weird | ||
21:01
molaf joined
|
|||
AlexDaniel | m: sub foo{ multi infix:<+>(42, 42) { ‘yes’ } }; say 42 + 42 | 21:02 | |
camelia | 84 | ||
AlexDaniel | hmmmm | ||
cool | |||
guifa2 | AlexDaniel: meh, kind of. But it also means defining operators for new classes sucks :-( | 21:03 | |
AlexDaniel | guifa2: why? | ||
guifa2 | Lemme put together an example of when it can go awry | 21:04 | |
AlexDaniel | I always thought that it is actually as good as it can be because someone's custom operators can never affect my code | 21:05 | |
some may be surprised to hear that but it's part of Raku that I truly like :) | |||
sena_kun | guifa2, you are very welcome to provide an example. :) | 21:06 | |
AlexDaniel | sena_kun: why tho, lemme have something I like xD | 21:09 | |
guifa2 | tio.run/##K0gtyjH7/78gMTk7MT1VwS0/...QCIQxv//AA | ||
rir | p6: proto p(Any $x |) { my $v = $x // 'Default' } ; sub nil { return Nil } ; sub one { return 1 } ; p( nil()).say; p( one()).say; | ||
camelia | 5===SORRY!5=== Error while compiling <tmp> Malformed parameter at <tmp>:1 ------> 3proto p(Any $x7⏏5 |) { my $v = $x // 'Default' } ; sub ni expecting any of: constraint |
||
rir | p6: proto p(Any $x, |) { my $v = $x // 'Default' } ; sub nil { return Nil } ; sub one { return 1 } ; p( nil()).say; p( one()).say; | 21:10 | |
camelia | Default 1 |
||
sena_kun | AlexDaniel, I am writing an article about operators applied to objects right now and that'll suck to suggest it to get people tell me "Bah, this is just wrong and bad". | ||
AlexDaniel | right | 21:11 | |
codesections | rir: oooh, I see what you mean! That *is* a nice solution, even compared to the `is Default` idea guifa had – and *especially* compared to the ugly zipping code I produced :D | 21:12 | |
sena_kun | So input on the topic is very helpful, I guess. | ||
guifa2 | Compare the difference to making something Associative by just defining AT-KEY, etc, and violà any object handles the built in post circumfixes as they feel is correct | 21:13 | |
AlexDaniel | guifa2: isn't it a bug? I'm not sure | ||
guifa2 | No, that's how it's supposed to work | ||
AlexDaniel | guifa2: not exactly | 21:14 | |
guifa2 | The infix sub isn't in the scope, so the object's math isn't handled correctly | ||
AlexDaniel | guifa2: put it into two different files, slap `is export` on your custom operator | ||
and it will work | |||
guifa2 | AlexDaniel: right, but now imagine I pass those to *another* module that I don't have control over its imports | ||
math goes bad, even though I'm not expecting it to | |||
AlexDaniel | hm… actually good point, it's hard to tell if it's imported or not… | 21:15 | |
guifa2 | I don't really know if there's a great solution, TBH | ||
AlexDaniel | so it's better to create a new op instead of using a multi on + | ||
guifa2 | Actually | 21:16 | |
I wonder | |||
Is it possible to wrap an infix? | |||
guifa2 has evil thoughts in his head | |||
AlexDaniel | guifa2: well, there are plenty of tools for evil thoughts, operator wrappers is just one of them | 21:17 | |
so yeah, every included module is a potential security issue for your data | |||
but I guess that's true in most languages, so 🤷 | 21:18 | ||
codesections | I'm kind of surprised more operators aren't implemented as methods (instead of subs) the way `{}` is | ||
Before looking, I expected `1 + 2` to desuggar into `1.ADD(2)` instead of (effectively) `add(1, 2)` | 21:19 | ||
guifa2 | AlexDaniel: I may have just gotten done doing some massive (but cool) hacking into DateTime to add TZ support | ||
It's actually quite hard to do things with guaranteed global effect, I've found, which is sometimes what we want | 21:20 | ||
AlexDaniel | guifa2: … how do I export a custom operator? | ||
codesections | (I know it's really `infix:<1>(1, 2)`, but that's still calling a sub with arguments) | 21:21 | |
21:21
natrys left
|
|||
codesections | If 1 + 2 *was* 1.ADD(2), then the owner of a class would never have to worry about operators not working the way they want – if they're concerned, they could overwrite any method they'd inherited | 21:22 | |
AlexDaniel | codesections: unless the object of their class is on the right hand side | 21:23 | |
:) | |||
codesections | haha, fair point! | ||
guifa2 | This is actually getting close to the issue of coercions | ||
Which is one we almost had solved but it never got implemented for some reason | 21:24 | ||
let's say I have a custom class Foo. I can write its coercer to Str by just doing method Str { … }, so if someone's elses signature is (Str() $bar), my class can be used | 21:25 | ||
But I can't write a signature like (Foo() $bar) and have someone pass in a Str to be coerced, even if it's possible | |||
I mean, there's augmenting, but that requires monkey typing, breaks precompilation, etc | 21:26 | ||
21:27
bocaneri joined
|
|||
guifa2 | github.com/Raku/problem-solving/issues/137 | 21:27 | |
AlexDaniel | guifa2: how do you solve that without monkey typing? | ||
ah, okay, I see the discussion | 21:28 | ||
guifa2 | Without monkey tying … Str.^add_fallback( -> $a, $b { $b eq 'MyClass' }, -> $a, $b { anon method (-->MyClass) { … } } ) | 21:29 | |
lol | |||
where … is the actual coercion method | 21:30 | ||
Like I said, I've been digging deep to pull off DateTime without monkey type haha | |||
rir | It seems like it might be possible to augment early once. Somthing like a special case for `use X; augment X { ... }`. | 21:34 | |
This is to conflate the two statements into one. | |||
I mean as a language enhancement. So no joy to guifa2 today. | 21:39 | ||
guifa2 | rir: theoretically, I suppose, one could do that in a BEGIN statement | 21:43 | |
But again, it would require a recompile of any module that uses that class | 21:44 | ||
AlexDaniel: as to the rest of my solutions, I'm saving it for a giant advent day post in December ;-) | 21:45 | ||
21:49
vike left
|
|||
gfldex | lolibloggedalittle: gfldex.wordpress.com/2020/08/09/whereceptions/ | 21:53 | |
guifa2 | gfldex++ | 21:56 | |
21:57
mowcat left
|
|||
Geth | advent: 6f001c633f | Altai-man++ (committed using GitHub Web editor) | 20th/README.md Resign an article One's will to live was clearly overestimated with this. |
22:01 | |
22:02
rir left
22:04
stu002 joined
22:14
Altai-man joined
22:16
sena_kun left
|
|||
raku-bridge | <stu002> I'm looking for examples of custom numeric types implemented in Raku, especially the idiomatic ways of coercing built-in ints, nums, rats etc into the custom numeric type. | 22:17 | |
22:19
zacts left
|
|||
raku-bridge | <stu002> This is to avoid monkey typing the built-in numeric types as described in www.nntp.perl.org/group/perl.perl6...g9054.html | 22:19 | |
22:37
zacts joined,
zacts left,
zacts joined
|
|||
guifa | stu002: let me type up a soution for you | 22:43 | |
raku-bridge | <stu002> guifa: that would be wonderful | 22:46 | |
guifa | It’s semi-hacky | ||
raku-bridge | <stu002> At the moment I'm using custom classes "class MyInt is Int does AddMagma ...". But it made me wonder about support for wrapping or delegating to a class in a standard way. | 22:47 | |
<stu002> And FWIW I've been using infix operators like this: sub infix:<⊙>(Magma:D \x, Magma:D \y) of Magma:D is export { x.op(y) } | 22:52 | ||
22:52
leont left
|
|||
raku-bridge | <stu002> But when I (wrongly) made that multi sub infix:<⊙>(Magma:D \x, Magma:D \y) of Magma:D is export { x.op(y) } the raku compiler segfaults | 22:52 | |
<stu002> SO I | 22:58 | ||
guifa | stu002: gist.github.com/alabamenhu/1b60015...4d112678e1 | ||
raku-bridge | <stu002> guifa: that's very insightful, many thanks | 23:00 | |
<stu002> I need to stop thinking in Haskell and Rust where implementing a trait for a built-in type is not the same as in Raku. | 23:02 | ||
guifa | stu002: in theory, there shouldn’t be a problem with augmenting so long as you don’t have any overlapping methods, etc. | 23:06 | |
so you could feel free to just say augment Int { method Percent { … } } | 23:07 | ||
raku-bridge | <stu002> guifa: is augmenting "global" in scope -- i.e. would someone use-ing a module that has augments get a surprise when their built-in numeric types have methods and attributes not in the standard docs? | 23:09 | |
guifa | Yes | ||
Whether that’s a good thing or not depends on how badly you’re messing with their built ins ;-) | 23:10 | ||
raku-bridge | <stu002> That alone is probably good reason not to augment the built-in types I guess. If I could augment just in some example or test modules and not globally I would do it. | ||
guifa | So you can use that fallback method I just sent you | 23:11 | |
It’s also global BUT notice the condition method | |||
raku-bridge | <stu002> guifa: I'll try and come up with a minimal working example of the compiler segfault issue | ||
guifa | You can always insert a dynamic variable check | ||
raku-bridge | <stu002> guifa: yes, that example is very neat. I feel like I'm not even scratching the surface of what Raku can do. | 23:12 | |
guifa | $*ALLOW-PERCENT-COERCION && $method-name eq ‘Percent’ | ||
tio.run/##hY7NCoJAFIX3PsWBREtMbFEL...mJudd0rOs3 | 23:16 | ||
You could do similar with the augment method approach, btu this way it will appear as if the method isn’t there if you’ve not enabled it | |||
raku-bridge | <stu002> guifa: very neat. | 23:18 | |
guifa | (otoh, it also won’t appear if they do .^methods, but you win some, you lose some) | ||
23:19
lichtkind left
|
|||
rypervenche | Oh, I was going to submit a PR to have the .perl changed to .raku in the examples on raku.org, but it seems there's already one there from May. | 23:25 |