01:04 colemanx left, colemanx joined, getimiskon left 02:31 hexology joined 02:49 parv joined 08:52 dakkar joined 10:11 discord-raku-bot left 10:12 discord-raku-bot joined 10:21 pelai joined 10:37 pelai left 12:08 A26F64 joined 12:40 getimiskon joined
A26F64 I'm wondering about a somewhat obscure error. docs.raku.org/type/Set states: "you can create Set masquerading as a hash"; "this syntax also allows you to specify the type of values you would like to allow". 12:41
m: class Foo1 { has %.f is Set; }; my $foo = Foo1.new(f => <a b>); say $foo.raku;
camelia Foo1.new(f => Set.new("b","a"))
A26F64 m: class Foo2 { has %.f is Set[Str]; }; my $foo = Foo2.new(f => <a b>); say $foo.raku; 12:42
camelia ===SORRY!===
Object of type Set[Str] in QAST::WVal, but not in SC
A26F64 That type specification does not work for attributes within class definitions? 12:43
lizmat m: my %s is Set[Str] = <a b>; dd $s 12:50
camelia 5===SORRY!5=== Error while compiling <tmp>
Variable '$s' is not declared. Did you mean '%s'?
at <tmp>:1
------> 3my %s is Set[Str] = <a b>; dd 7⏏5$s
lizmat m: my %s is Set[Str] = <a b>; dd %s
camelia Set[Str].new("a","b")
lizmat A26F64: that'd be a bug :-)
m: class A { has %!f is Set[Str] }; A.new # golf 12:52
camelia ===SORRY!===
Object of type Set[Str] in QAST::WVal, but not in SC
lizmat m: class A { has %!f is Set[Str] }; A.CREATE # better golf
camelia ===SORRY!===
Object of type Set[Str] in QAST::WVal, but not in SC
lizmat A26F64: could you make a rakudo issue for that ? 12:53
A26F64 Would that be in one of the GitHub repositories? (Sorry; I haven't done so before and am not sure.) 12:56
(I also don't have a personal GitHub account, actually.)
Morfent m:``` 13:01
class A { has %!f is Set of Str }; A.CREATE
`&trait_mod:<is>` for attributes is kinda screwy. `&trait_mod:<of>` is the only way i'm aware of to give `Set` its type parameter with it 13:03
m:``` 13:05
class A { has Str $!f is Set }; A.CREATE
class A { has Str %!f is Set }; A.CREATE
while that works in this context, iirc precomp takes issue with it? 13:06
``` 13:07
bastille% cat lib/Foo.rakumod
use v6;
unit class Foo;
has Str %!foo is Set;
bastille% raku -Ilib -MFoo -e ''
===SORRY!=== Error while compiling -e
Missing serialize REPR function for REPR MVMContext (BOOTContext)
at -e:1
gfldex m:``` 13:20
class A { has %.f is Set[Str]; }
say A.new.f.WHAT;
That looks like a Rakudobug to me.
Morfent yeah 13:26
A26F64 I do have another question about types. (I'm accumulating a number of such questions.) I'm mostly assuming that this one isn't a bug. . . . 13:43
docs.raku.org/language/typesystem#subset states: "A subset declares a new type that will re-dispatch to its base type."
m: subset S of Int where * >= 0; my S $s = 616; $s.WHAT;
camelia ( no output )
A26F64 I didn't expect that, actually; my local instance returns `(Int)`. 13:44
m: subset S of Int where * >= 0; my S $s = 616; say $s.WHAT;
camelia (Int)
A26F64 There we are.
Does that result reflect the intention of the above statement from the documentation? 13:45
Because one might expect a result of "(S)".
getimiskon Hello. Is there anyone who understands how the MPD client module works like? 13:46
lizmat A26F64: the subset is only to constrain 13:50
in that context, not to coerce
A26F64 It seems that signatures do not accept subsets as type constraints for nonscalars, though? 13:52
sub foo1(Int @f) { say @f; }; my Int @s = <2 3>; foo1(@s); # This works
m: sub foo1(Int @f) { say @f; }; my Int @s = <2 3>; foo1(@s); # This works
camelia [2 3]
A26F64 m: subset S of Int where * >= 0; sub foo2(S @f) { say @f; }; my S @s = <2 3>; foo2(@s); 13:53
camelia Constraint type check failed in binding to parameter '@f'; expected S but got Array[S] (Array[S].new(IntStr....)
in sub foo2 at <tmp> line 1
in block <unit> at <tmp> line 1
lizmat m: subset S of Int where * >= 0; my S @a = 1,2,3,-4 13:54
camelia Type check failed in assignment to @a; expected S but got Int (-4)
in block <unit> at <tmp> line 1
lizmat looks to me that works ?
A26F64 My example was for constraints in a signature. 13:55
Nemokosch It works, I remember this 13:56
One has to give up on the sigil in these cases 13:57
I don't completely remember the syntax but it looked weird tbh
> <Altreus> m: my subset PosInt of Int where * >= 0; sub f(Array[PosInt()]() $array) { .say for @$array }; f([0,1,2,3,4,5]);
14 October
m: my subset PosInt of Int where * >= 0; sub f(Array[PosInt()]() $array) { .say for @$array }; f([0,1,2,3,4,5]); 13:58
if you are fine with immutable values passed, you can use \array for passing the value and then access it as array, without a sigil 14:08
but that means that you are really using the content directly, not a variable 14:09
lizmat m: subset S of Int where * >= 0; sub a(S @a) { }; a (1,2,-4) # A26F64 works in a signature ?
camelia Type check failed in binding to parameter '@a'; expected S but got List ((1, 2, -4))
in sub a at <tmp> line 1
in block <unit> at <tmp> line 1
A26F64 That composite form ("Array[PosInt()]()") does work but it seems like there should be a natural syntax for that.
lizmat should read the error message :-) 14:10
Nemokosch this was the best the guys could come up with back a month ago 14:12
maybe there is a better way, who knows
gfldex A26F64: Type constrains on @-sigiled containers are not well supported because they are often a bad idea. By nailing the types down you hinder composibility. 14:38
In fact, if you got a single @-sigiled argument you should alway consider a slurpy. 14:40
A26F64 I was thinking that by nailing the types down we would avoid functional inconsistencies and errors. 14:42
gfldex Raku is a dynamic language. Type constrains produce runtime errors. That can be desired and very helpful. But it can also lead to programs that don't try hard enough to DWIM. 14:43
Nemokosch > There are limits to what the REPL can do. Raku is not as dynamic as it looks at first. 14:45
gfldex, 2021. 11. 04.
gfldex A26F64: When you have a list of values, those values have to come from somewhere. Putting the type check on those values before they are composed into a list, is often a good place for it. 15:07
A26F64 gfldex Using the positional sigil for a variable in signatures might allow specification of types contained therein. But it almost seems simpler---and you seem to be implying that it's superior---in some cases to instead use a scalar sigil. 15:23
gfldex Actually not. You can't have a slurpy $-sigil. The idea is to place type checks - if possible - on the caller site. Lists migth get big and the compiler is not clever enough to remove expensive type checks while crossing from caller to callee. 15:27
A26F64 While I did employ (and even appreciate) the "slurpy" nature of function arguments in Perl I do also appreciate Raku's use (if I understand it correctly) of discrete elements in a signature, which is closer to arguments in other languages. 15:35
It seems that returning values is still a slurpy business, though. 15:36
m: sub f { return [4, 5], <a b>; }; my (@x, @y) = f; say @x; say @y; 15:37
camelia [[4 5] (a b)]
A26F64 Whereas: m: sub f { return [4, 5], <a b>; }; my ($x, $y) = f; say $x; say $y;
m: sub f { return [4, 5], <a b>; }; my ($x, $y) = f; say $x; say $y;
camelia [4 5]
(a b)
Nemokosch doesn't this disprove your point? 15:38
A26F64 In what way? I'm suggesting that one might expect each array of function f to map discretely to each element receiving the return values. 15:39
. . . Regardless of the type/sigil of variable. 15:40
Nemokosch m: [4, 5], <a b> andthen .raku
why does it not run 😠
anyways, the function returns _one list_
so when you are assigning it to a list, well, it will just take it big time 15:41
the point is exactly that this isn't "regardless of sigil" 15:42
A26F64 Thinking about it that way (the return value returns a single list) does allow that to make sense. But one might then expect that $x above would just consume the entire list as well. But I guess that `my ($x, $y)` as a convention allows that to be a list? 15:44
Nemokosch there is some asymmetry indeed btw 15:49
A26F64 (I was going to ask about specifying type constraints on complex return values like that. For example, we might want to indicate that f returns a List of an Array[Int] and an Array[Str]. But I feel like the response might be to dissuade me from bothering with such specificity in the first place.) 15:50
Nemokosch Ngl I wonder what keeps someone digging these type signatures at all 15:53
btw I really have no idea how my (@a, @b) = ... could work with _anything_ 15:55
A26F64 Regarding the intention: it seems like one would want to maintain an unbroken chain of type constraints throughout a program. From the initialization of a variable to a function signature to that function's return value to the receiving variable. I guess that you could check the type within a function but it seems to make sense to check it on the 15:56
call. (Disclaimer: maybe I'm not making a tremendous amount of sense with respect to Raku or program design in general.)
The feeling is that you wouldn't want the data to get polluted with unexpected types somewhere in there. 15:57
15:58 parv left 16:04 A26F64 left 16:21 getimiskon left 16:29 A26F64 joined 17:33 dakkar left 18:48 mybutterfliable joined 18:50 mybutterfliable left 19:09 A26F64 left 19:20 melezhik24 joined 19:29 melezhik24 left 21:01 p6steve joined 21:08 getimiskon joined 21:11 p6steve left 21:24 p6steve joined 21:29 p6steve left