🦋 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.
00:02 japhb left, japhb joined 00:12 brtastic joined 00:24 JRaspass left 00:27 japhb left, japhb joined 00:37 squashable6 left 00:39 squashable6 joined 00:49 neshpion left 00:53 frost-lab joined 00:58 pecastro left 01:11 guifa joined 01:15 lucasb left 01:54 mowcat left, gnufr33dom joined 01:55 frost-lab left 02:03 sortiz left 02:07 ________1 joined 02:09 _________ left 02:16 timlegge_ left 02:17 timlegge joined 02:20 kst joined 02:21 kst left 02:22 kst joined 02:39 brtastic left 02:41 kvw_5 joined 02:43 kvw_5_ left 03:11 Garbanzo joined 03:49 squashable6 left 03:51 wamba joined 03:52 squashable6 joined 04:17 wamba left 05:17 notable6 left, statisfiable6 left, bloatable6 left, squashable6 left, quotable6 left, bisectable6 left, linkable6 left, tellable6 left, sourceable6 left, evalable6 left, committable6 left, benchable6 left, unicodable6 left, nativecallable6 left, coverable6 left, releasable6 left, shareable6 left, greppable6 left 05:18 evalable6 joined, quotable6 joined, committable6 joined, linkable6 joined 05:19 notable6 joined, bloatable6 joined, releasable6 joined, bisectable6 joined 05:20 statisfiable6 joined, shareable6 joined, coverable6 joined, sourceable6 joined, tellable6 joined, nativecallable6 joined, squashable6 joined, benchable6 joined, unicodable6 joined, greppable6 joined 05:40 Benett joined 05:52 rindolf joined
japhb Is there an idiom for calling 'submethod TWEAK' for all *roles* composed into a class? Right now I've got a hack role that I compose into some class in my inheritance hierarchy -- role RoleTweaking { method TWEAK_ROLES(|c) { for self.^roles { my $method = .^lookup("TWEAK"); self.$method(|c) if $method; } } } -- and then call self.TWEAK_ROLES from that class's submethod TWEAK. 05:53
But that feels like a workaround for something I would expect to Just Work. 05:54
Plus there's no guarantee that I will remember to only call TWEAK_ROLES from *one* class in the hierarchy, unless I make some convention like only ever calling it from the base class -- but that means it will be called before any other class TWEAKs in the inheritance tree, even if the TWEAKed roles are only composed into a leaf class. 05:55
(Only ever calling it from *leaf* classes has the problem that leaf classes don't always stay that way -- inherit from one and forget it was once a leaf that called TWEAK_ROLES, and suddenly you're likely to call it twice again.) 05:56
05:58 frost-lab joined
japhb Ugh, it occurs to me that RoleTweaking has yet another problem -- it assumes that no class in the hierarchy only composed *ONE* other role, and thus called its TWEAK normally because it was composed in without conflict. 06:03
GAH
06:15 frost-lab left 06:25 ________1 is now known as _________ 06:41 frost-lab joined 07:00 kaiwulf left 07:03 db48x left
japhb After some more thought, it occurs to me that there's no conflict if role submethods have a name extension based on the role name. So for example: role Foo { submethod TWEAK-Foo { ... } }; role Bar { submethod TWEAK-Bar { ... } }. Then it is certain that these TWEAK-related submethods will not be called automatically, which means they can be called from a TWEAK_ROLES that looks up methods to call as 07:09
follows: for self.^roles { my $method = .^lookup('TWEAK-' ~ .^name); ... }
I suppose you could even do that with the class-defined TWEAK submethods, and then walk the .^mro and .^roles(:local) from each to force the whole thing to happen in C3 order. 07:11
Still really feel like I'm overthinking this though ....
07:15 frost-lab left 07:22 berber44 left 07:39 parabolize left 07:58 k-man left 08:13 frost-lab joined 08:26 berber44 joined 08:33 gnufr33dom left 08:39 jmerelo joined 08:51 k-man joined 09:10 frost-lab left 09:13 epony left 09:24 wbiker joined 09:25 Discipulus joined 09:40 Doc_Holliwood joined 09:42 elcaro left 09:44 elcaro joined 09:45 jmerelo left
wbiker Hello all 09:45
Anyone familiar with Test::Mock? I want to use a mock of a class where a method is called twice from the code under test. Is there a way to configure the returning that for each method call another string is given back?
This returns an array instead:
my $mock = mocked MyClass::Client, returning => { get => "Return String One", "Return String Two" };
09:56 epony joined 10:01 brtastic joined 10:04 jmcgnh left 10:22 Sgeo left, ensamvarg left 10:25 ensamvarg joined 10:35 nine_ is now known as nine 10:47 brtastic left 11:27 domidumont joined 11:35 wamba joined
CIAvash wbiker: in that line your'e saying that method `get` on `MyClass::Client` returns list `"(Return String One", "Return String Two") ` (should be in parens) 11:46
wbiker: I don't know what you're doing or how you're testing but you can do `my $strings = ("Return String One", "Return String Two").iterator; my $mock = mocked MyClass::Client, computing => { get => { $strings.pull-one }};` 11:47
wbiker Cool. Thanks @CIAvash I think that it what I was looking for. Using a iterator here! 11:49
12:00 leont joined 12:15 Black_Ribbon left 12:43 pecastro joined 12:45 xelxebar_ left 12:47 xelxebar joined 12:53 shlomif joined 12:55 rindolf left 12:58 shlomif2 joined 12:59 shlomif left 13:08 wamba left 13:19 mowcat joined 13:35 rindolf joined 13:43 wamba joined 13:52 mowcat left 14:03 xinming_ left 14:06 xinming_ joined 14:43 Doc_Holliwood left 14:46 a3r0 left 15:12 patrickb joined
uzl[m] m: .say for &comb.candidates>>.signature 15:39
camelia (Regex $matcher, Cool $input, $limit = *, :$match)
(Str $matcher, Cool $input, $limit = *)
(Int:D $size, Cool $input, $limit = *)
tellable6 2020-05-30T08:15:37Z #raku-dev <JJMerelo> uzl[m] OK, done, but please include closing statements in the PRs and/or commits you're doing for them in the future. 15:40
uzl[m] m: .say for &base.candidates>>.signature
camelia 5===SORRY!5=== Error while compiling <tmp>
Undeclared routine:
base used at line 1
uzl[m] How do I get a method's candidates' signatures?
15:41 parabolize joined 15:43 gnufr33dom joined, vike left
uzl[m] m: .say for Real.^methods.first(*.name eq 'base').candidates>>.signature 15:44
camelia ($?CLASS: Int:D $base, $digits? is copy, *%_)
uzl[m] Oh found it haha
15:50 Doc_Holliwood joined
codesections can anyone explain these results? I'm confused: 16:01
m: use nqp; my int $a = 0; say nqp::isint(nqp::unbox_i($a)); say nqp::isint($a)
camelia 0
0
16:20 vike joined 16:23 neshpion joined 16:33 maggotbrain left 16:35 maggotbrain joined 16:54 Doc_Holliwood left 16:57 natrys joined 16:59 epony left 17:02 epony joined
MasterDuke it only work in real nqp-land 17:23
nqp: my int $a := 0; say(nqp::isint(nqp::unbox_i($a))); say(nqp::isint($a))
camelia 1
1
17:34 JRaspass joined 17:39 sena_kun left 17:40 sena_kun joined 17:52 gnufr33dom left 17:57 Altai-man_ joined, sena_kun left 18:09 Doc_Holliwood joined 18:14 berber44 left
xinming_ m: (<x y> => "test").raku.say; 18:18
camelia ("x", "y") => "test"
xinming_ m: Pair.new(:key(<x y>), :value<test>).raku.say; 18:19
camelia $("x", "y") => "test"
xinming_ How can we use Pair.new syntax to create a pair which the key is a List?
I mean, without the $() 18:20
summerisle m: Pair.new(:key<x y> :value<z>).key.WHAT
camelia ( no output )
summerisle m: Pair.new(:key<x y> :value<z>).key.WHAT.say
camelia (List)
summerisle m: Pair.new(:key<x y> :value<z>).key.say 18:21
camelia (x y)
summerisle m: Pair.new(:key(<x y>) :value<z>).key.WHAT.say
camelia (List)
summerisle m: Pair.new(:key(<x y>) :value<z>).key.say
camelia (x y)
summerisle seems fine to me
18:25 domidumont left, xinming_ left, xinming_ joined
xinming_ summerisle: What I mean is, the output should be the same as ("x", "y") => "test" :-) 18:26
18:26 Sgeo joined
uzl[m] m: Pair.new(:key(<x y>) :value<z>).key.raku.say 18:27
camelia ("x", "y")
uzl[m] m: Pair.new(:key(<x y>) :value("test")).key.say
camelia (x y)
summerisle on rakudo v2021.02, :key(<x y>) and :key<x y> (which should be directly equivalent) both seem to create a pair with a non-scalar key, so
i'd say it's working as you expect
codesections xinming_: you can use positional args: 18:28
m: Pair.new(<x y>, 'z').raku.say
camelia ("x", "y") => "z"
codesections MasterDuke: Thanks. I'd forgotten about *real* nqp land :D 18:29
18:45 __jrjsmrtn__ left 18:46 __jrjsmrtn__ joined 19:02 mowcat joined 19:05 maggotbrain left 19:07 maggotbrain joined 19:17 eseyman left 19:18 maggotbrain left 19:19 maggotbrain joined 19:21 eseyman joined 19:25 aborazmeh joined 19:31 jmcgnh joined 19:34 MasterDuke left 19:37 MasterDuke joined 19:47 MasterDuke left 19:50 MasterDuke joined 20:38 rindolf left 20:50 Doc_Holliwould joined, Doc_Holliwood left 20:51 Objective_Releas joined, aborazmeh left 20:52 Objective_Releas left 21:00 natrys left 21:03 neshpion left, neshpion joined
codesections m: sub f( --> (Int, Int)) { 42, 47 } 21:04
camelia 5===SORRY!5=== Error while compiling <tmp>
Malformed return value
at <tmp>:1
------> 3sub f( -->7⏏5 (Int, Int)) { 42, 47 }
21:04 aindilis left
codesections is there any way to dwim ^^^^? 21:04
21:06 pierrot_ is now known as pierrot, pierrot left, pierrot joined, patrickb left
codesections Or is that the usecase that needs to wait for lizmat's work on tuples? 21:08
21:13 xinming_ left 21:14 xinming_ joined
gfldex m: subset ListOfInt of List where { .all ~~ Int }; sub f( --> ListOfInt ) { 42, 47 } 21:24
camelia ( no output )
gfldex m: subset ListOfInt of List where { .all ~~ Int }; sub f( --> ListOfInt ) { 42, 47 }; f;
camelia ( no output )
gfldex m: subset ListOfInt of List where { .all ~~ Int }; sub f( --> ListOfInt ) { 42, 47 }; say f;
camelia (42 47)
gfldex codesections: ^^^ you can make the subset as strict as you need
codesections Hmmm, yeah. But that's not really in the spirit of what I want -- `f(--> Int)` is a constraint, but it's also using types as concise API documentation that &f always returns a single Int. I'd like to be able to say "f always returns a pair of two Ints" in the type system, but that's only worth doing if the syntax is there to say it naturally 21:29
but thanks, gfldex, that's helpful & appreciated 21:31
gfldex codesections: subsets can be exported. That way you can allow the user of your API to use them in their code. This can be quite helpful to avoid typos and bad copy pasta. 21:42
codesections Yeah, I get that :-) And I like and use subsets
But that's a different usecase than "function signature as documentation" 21:43
(though with some overlap, to be sure)
21:52 kaiwulf joined 21:53 xinming_ left 21:54 xinming_ joined 22:02 tejr left 22:03 tejr joined 22:09 neshpion left 22:10 neshpion joined 22:28 finsternis joined 22:30 gnufr33dom joined 22:38 aindilis joined 22:39 kerframil joined 22:45 xinming_ left
lizmat codesections: I don't think this has anything to do with my Tuple module ? 22:45
22:46 xinming_ joined
codesections Oh, ok. I wasn't sure/haven't followed that module closely. In some languages, you'd say that a function with the signatur of f(Int --> (Str, Int)) "takes an Int and returns a Tuple of one Str and one Int". So I was wondering if better support for tuples would be related somehow. But I guess my guess was wrong :) 22:49
lizmat I guess my Rake module gets closer to that 22:54
modules.raku.org/dist/Rake 22:55
22:55 dogbert17 joined 22:56 dogbert11 left 23:03 zolferino joined, zolferino left
guifa Oof 23:17
One good thing about me now creating all of these moduels based around the CLDR is I’m finding how some of my earlier modules sucked :-)
Namely the LanguageTag which needs … a lot of work
23:25 neshpion left 23:30 Altai-man_ left, xinming_ left 23:31 xinming_ joined 23:33 sena_kun joined
codesections .tell vrurg I just had my first occasion to use the new COERCE method, and it's *really* nice. Thanks for your work adding that :) 23:46
tellable6 codesections, I'll pass your message to vrurg
23:46 neshpion joined
vrurg codesections: you're welcome! :) 23:46
23:46 gnufr33dom left
vrurg can't still believe it all started as a fix for an old github issue... 23:47
23:50 pecastro left