🦋 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. |
|||
codesections | m: dd $*RAKU.compiler | 00:01 | |
camelia | Compiler rakudo = Compiler.new(id => "B0D6A0338B85BFBFE1C14B4AEDA60C0788BB2C25", release => "", codename => "", name => "rakudo", auth => "The Perl Foundation", version => v2020.07.66.g.2.db.92.e.04.f, signature => Blob, desc => Str) | ||
00:24
mowcat left
00:51
Altai-man joined
00:53
sena_kun left
01:03
_jrjsmrtn joined
01:05
__jrjsmrtn__ left
01:10
gugod left
01:13
gugod joined
01:17
gugod left,
gugod joined,
gugod left,
gugod joined
01:18
gugod left,
gugod joined
01:27
kotrcka joined
01:56
cpan-raku left
01:59
cpan-raku joined,
cpan-raku left,
cpan-raku joined
02:02
Noisytoot left
02:19
ilogger2 joined
02:20
go|dfish joined
02:35
fooist joined
02:38
Cabanossi joined
|
|||
fooist | Does anyone here know what the status/provenance is of the p6dists.json.gz file in CPAN (under /authors)? Sorry | 02:40 | |
Total raku #n00b | 02:41 | ||
Mostly wondering if it’s officially supported | 02:42 | ||
03:51
hungrydonkey joined
04:00
rockxloose joined
04:54
sena_kun joined
05:05
finanalyst joined
|
|||
moritz | fooist: iirc it's the file that package managers use to get a list of p6/raku distributions on CPAN | 05:08 | |
05:22
stoned75 joined,
epony joined
05:37
bocaneri joined
07:07
sjm_uk joined
07:10
sarna joined
07:12
hungrydonkey left
|
|||
sarna | o/ | 07:13 | |
Geth | ecosystem: 318bb77d0d | (Daniel Lathrop)++ (committed using GitHub Web editor) | META.list remove duplicate from META.list |
07:15 | |
ecosystem: 14877cef2d | (Juan Julián Merelo Guervós)++ (committed using GitHub Web editor) | META.list Merge pull request #526 from fooist/patch-1 remove duplicate from META.list |
|||
07:15
hungrydonkey joined
07:18
oddp joined
07:20
JJMerelo joined
|
|||
sarna | m: say join("hello ", "world"); say ("hello ", "world").join; # is there a viable use case for `sub join` when `*@list` has < 2 things in it? | 07:22 | |
camelia | world hello world |
||
JJMerelo | what's happened to "hello"? | 07:29 | |
tellable6 | 2020-08-16T21:06:49Z #raku <lizmat> JJMerelo github.com/Raku/advent/blob/master.../rfc200.md | ||
2020-08-17T22:52:12Z #raku <tbrowder> jjmerelo: how often are public-facing doc pages regenerated? do i need to trash my browser cache to see an update? | |||
JJMerelo | .tell tbrowder they are updated... from time to time. I'll do it today. | ||
tellable6 | JJMerelo, I'll pass your message to tbrowder | ||
sarna | JJMerelo: sub's signature is `sub join($separator, *@list)`, it thinks "hello " is the separator, and "world" is the list :( | 07:33 | |
it's very confusing when you first encounter it | |||
JJMerelo | Ah, right, of course... | ||
sarna | it could check the length of the list, but idk about performance loss/use cases I missed | 07:35 | |
07:44
stoned75 left
07:45
dakkar joined
07:48
xinming joined
07:54
stoned75 joined
|
|||
Geth | advent: 51018fd824 | (JJ Merelo)++ | 20th/articles/rfc265.md Minor modifications |
08:04 | |
08:11
hungrydonkey left
|
|||
Geth | ecosystem: 9f1c7aa568 | (JJ Merelo)++ | 2 files Rearranges test file So that it builds before testing for the existence of files. Closes #527 It also updates to use the latest version of the Docker container, which includes make and gcc |
08:32 | |
08:47
[Sno] joined
08:51
Altai-man joined
08:54
sena_kun left
09:02
rindolf joined
09:05
JJMerelo left
|
|||
tbrowder | .tell jjmerelo thnx, amigo | 09:56 | |
tellable6 | tbrowder, I'll pass your message to JJMerelo | ||
tbrowder | gracias | 09:57 | |
tellable6 | 2020-08-19T07:29:38Z #raku <JJMerelo> tbrowder they are updated... from time to time. I'll do it today. | ||
10:04
hungrydonkey joined
|
|||
sarna | is there really no way of preventing Nil propagation in method chains? I'd prefer it to fail fast :( | 10:13 | |
10:19
sjm_uk left
|
|||
sarna | can I maybe specify that I want to take `self:D`? not sure how to do that.. | 10:20 | |
oh no, that wouldn't work, since every method called on Nil returns Nil >.> | 10:21 | ||
10:25
[Sno] left
10:29
JJMerelo joined,
yangzq50 joined
|
|||
codesections | sarna: hmmm, you seem to be right, that doesn't work; I'm a bit surprised | 10:29 | |
m: class A { method n { Nil }; method non-nil(A:D $:) { 42}}; say A.new.n.non-nil | |||
camelia | Nil | ||
sarna | codesections: I've found this - stackoverflow.com/questions/601552...2#60155442 | ||
I don't find the reasoning (not having to insert null checks between chains) that convincing | 10:30 | ||
m: class A { method n { Nil }; method non-nil(A:D $:) { 42}}; my $foo = A.new.n; say $foo.non-nil | |||
camelia | No such method 'non-nil' for invocant of type 'Any' in block <unit> at <tmp> line 1 |
||
sarna | this dies (as it should), but you have to break up your method chains like this, every time.. | 10:31 | |
codesections | And that makes sense, given how assigning Nil works | 10:33 | |
sarna | yeah, but I'd say the default behavior is LTA - nothing less fun than hunting for a bug that propagated from something deep down the call stack | 10:34 | |
Nil carries absolutely no information | 10:35 | ||
codesections | m: class A { method n { Nil }; method non-nil(A:D $:) { 42}}; say (my $ = A.new.n).non-nil | ||
camelia | No such method 'non-nil' for invocant of type 'Any' in block <unit> at <tmp> line 1 |
||
codesections | that's pretty ugly, though | ||
sarna | it is, and the ugliness is O(n) where n is the number of methods in a chain | 10:37 | |
codesections | Yep! | 10:38 | |
Though, I think it'd work without the `my` which helps (very slightly) | |||
sarna | maybe raku has something like dart's cascade notation? that would help - stackoverflow.com/questions/494477...ot-in-dart | 10:40 | |
I may be onto something | 10:42 | ||
m: class A { method n { Nil }; method non-nil(A:D $:) { 42}}; $ = A.new.n; $ .= non-nil; .say | |||
camelia | No such method 'non-nil' for invocant of type 'Any' in block <unit> at <tmp> line 1 |
||
sarna | just replace all dots with `$ .=` et voila | 10:43 | |
codesections | Is that really less ugly than | 10:44 | |
m: class A { method n { Nil }; method non-nil(A:D $:) { 42}}; say ($ =A.new.n).non-nil | |||
camelia | No such method 'non-nil' for invocant of type 'Any' in block <unit> at <tmp> line 1 |
||
sarna | semicolons instead of parens? :D | 10:45 | |
mine would read better when splitted across multiple lines | 10:46 | ||
10:47
yangzq50 left
|
|||
codesections | oooh, I think I have something: | 10:47 | |
m: sub postfix:<‽>($a) { $ = $a}; class A { method n { Nil }; method non-nil(A:D $:) { 42}}; say A.new.n‽.non-nil | |||
camelia | No such method 'non-nil' for invocant of type 'Any' in block <unit> at <tmp> line 1 |
||
sarna | codesections: what's that? | 10:49 | |
oh darn it's your own operator | 10:50 | ||
I searched for it in the docs :DDD | |||
codesections | :D | ||
sarna | I love this | ||
also I hate this | |||
codesections | Agreed | 10:51 | |
sarna | noo you can't do ‽<newline>. :((( | 10:53 | |
all the methods have to be on one line | |||
10:54
[Sno] joined
|
|||
codesections | Hmmm, I've run into that problem with &.subroutine method calls too | 10:56 | |
tobs | it's probably better to extinguish that behavior at the source if you dislike it and don't want to change your entire code to a new method call operator: | 11:01 | |
m: Nil.^find_method("FALLBACK").wrap: -> $, $ { fail 'method call on Nil' }; class A { method n { Nil }; method non-nil (A:D $:) { 42 } }; say A.new.n.non-nil | 11:02 | ||
camelia | method call on Nil in block <unit> at <tmp> line 1 |
||
sarna | monkey patching Nil because I don't like a design decision? is that legal? | ||
tobs | by keeping the return value of that wrap call you can make the change lexical by unwrapping at scope exit | 11:03 | |
actually, I am not sure how stable wrapping core class's methods is | |||
sarna | that still seems heavy-handed, and confusing to whoever will come and look at my code | 11:04 | |
codesections | tobs: I like that approach. It strikes me that forgetting to unwrap that at the end of a scope could break … lots of things, though | ||
11:08
aluaces joined,
aluaces is now known as alberto
|
|||
codesections | sarna: I'm not getting an error when breaking the method chain across multiple lines with the new operator | 11:09 | |
11:09
alberto is now known as Guest47135
|
|||
sarna | codesections: where do you break it? I tried `foo?!<newline>.bar` and I kept getting "bogus operator" | 11:09 | |
tbrowder | hi, anyone use raku on win 10 as primary os? | 11:11 | |
11:12
xinming left
|
|||
tbrowder | if so, what is preferred raku installation method and editor? thnx | 11:12 | |
11:13
xinming joined
|
|||
tbrowder | win is not my cup of tea, but trying to wean grandson off python and such | 11:14 | |
as is taught in govt schools | 11:15 | ||
kawaii | Is there some way to switch the state of a Bool between True/False without doing some janky if statement saying `if $blah = True { $blah = False }`? :) | 11:22 | |
11:22
aborazmeh joined,
aborazmeh left,
aborazmeh joined
|
|||
Altai-man | kawaii, $blah = !$blah2? | 11:22 | |
kawaii | (implying I don't know the state of the Bool, I just want to switch it regardless) | ||
Altai-man | $blah = !$blah? | ||
kawaii | ah :D | ||
wait really | 11:23 | ||
this is a thing | |||
codesections | sarna: here's the code that was working for me with newlines gist.github.com/codesections/445e2...aac75d5462 | ||
kawaii | Altai-man++ | ||
11:23
xinming left
11:24
xinming joined
11:25
hungrydonkey left
|
|||
codesections | kawaii: and you don't really need the final `?`, though it might make the expression clearer, at least to some readers | 11:26 | |
kawaii | codesections: trust me, no one is capable of reading anything I write :) | ||
codesections | :D | 11:27 | |
sarna | codesections: repl.it/repls/OnerlookedAngryClimate#main.raku take a look here, without line 8 it works fine | 11:28 | |
codesections | hmm, odd. I *bet* that's something to do with the precedence/associativity of the operator, but I'm not sure. docs.raku.org/language/functions#Precedence | 11:31 | |
SmokeMachine | is there a way of getting the block that called the current block? | 11:35 | |
11:38
JJMerelo left
|
|||
codesections | SmokeMachine: I assume CALLER doesn't do what you want, because you want the actual _block_ and not a way to look up symbols in that block? | 11:42 | |
SmokeMachine | codesections: it would be... but it doesn't seem to work inside a Proxy's fetch block... :( | 11:46 | |
11:48
hungryd22 joined
|
|||
SmokeMachine | I was trying to do something like this to make rerun every block where the variable was used when it changes it value: | 11:50 | |
m: my %blocks is SetHash; my $a := Proxy.new: FETCH => sub fetch(|) { say CALLER; %blocks{CALLER} = True; 42 }, STORE => -> $, | { .() for %blocks.keys }; sub bla { say $a }; bla; $a = 13 | |||
camelia | (CALLER) Cannot invoke this object (REPR: Uninstantiable; CALLER) in block at <tmp> line 1 in block <unit> at <tmp> line 1 (CALLER) (CALLER) (CALLER) (CALLER) (CALLER) (CALLER) 42 |
||
11:54
hungryd22 left,
hungrydonkey joined
|
|||
Geth | doc/default-0: 421864a707 | (Stoned Elipot)++ | doc/Type/Baggy.pod6 Current and explicit Baggy.default signature |
12:01 | |
doc: stoned++ created pull request #3565: Current and explicit Baggy.default signature |
|||
12:12
aborazmeh left
|
|||
kawaii | Is there a clean way of removing a value from an @array if what we try to `push` already exists? | 12:25 | |
andinus | why push if it already exists? | 12:27 | |
moritz | you mean, moving an element to the end? | ||
12:27
lichtkind joined
|
|||
kawaii | andinus: because the $end-user doesn't know if it exists or not :) but you're saying I should check first before pushing in my code? | 12:28 | |
12:28
Maylay joined
|
|||
kawaii | I was just wondering if there was some built-in logic | 12:28 | |
moritz | kawaii: does the order of elements matter? | ||
kawaii | nope | ||
moritz | then maybe a Set is the better data structure | 12:29 | |
because there adding an element that's already in there is a no-op | |||
kawaii | I was thinking Hash | ||
moritz | and checking if an element is in a set is fast, compared to an array | 12:30 | |
kawaii: a Set is basically Hash without values | |||
do you need to store values? | |||
kawaii | I don't, so you're probably right about using a Set | ||
moritz | I use hashes a lot in p5, but python has taught me to take sets seriously :D | 12:31 | |
lizmat | and then the SetHash variety, if you want a mutable one | ||
12:32
finanalyst left
|
|||
moritz | lizmat++ good point, forgot that sets are immutable by default | 12:32 | |
kawaii | ah, yes I need to add and remove from it regularly :) | ||
moritz: `my SetHash[Str] $monitored-channels;`, so once I've defined it, how would I `push` a value here? :) | 12:35 | ||
It's basically storing just a few hundred strings | |||
(but by default will be empty) | 12:36 | ||
moritz | my SetHash[Str] $monitored-channels .= new(); $monitored-channels<stuff> = True; | ||
docs.raku.org/type/SetHash | |||
kawaii | www.irccloud.com/pastebin/C0xdswFQ/ | 12:39 | |
12:39
stoned75 left
|
|||
kawaii | moritz: hey this is really cool :D | 12:39 | |
thanks! | |||
moritz | my pleasure | 12:40 | |
12:52
sena_kun joined
12:53
skids joined,
Altai-man left
|
|||
lizmat | kawaiiL it you're using a SetHash, you can also use the .set and .unset methods | 13:03 | |
m: my %sh is SetHash; %sh.set(1,2,3,4); dd %sh; %sh.unset(2,3); dd %sh | 13:04 | ||
camelia | Too many positionals passed; expected 2 arguments but got 5 in block <unit> at <tmp> line 1 |
||
lizmat | hmmm | ||
kawaii | lizmat: `$monitored-channels{$message.channel-id} = !$monitored-channels{$message.channel-id};` I'm doing it like this to flip between adding and removing based on the user running a command :) | ||
13:04
stoned75 joined
|
|||
lizmat | m: my %sh is SetHash; %sh.set((1,2,3,4)); dd %sh; %sh.unset((2,3)); dd %sh | 13:04 | |
camelia | SetHash.new(4,3,1,2) SetHash.new(4,1) |
||
lizmat | hmmm... I guess that a. needs documentation, and b. another slurpy candidate | ||
codesections | I have documenting that (and BagHash.add) on my to-do list | 13:05 | |
lizmat | codesections: could you create an issue for the above problem> | 13:06 | |
tobs | m: my $b = True; $b .= not; say $b # kawaii: another way to toggle a boolean without mentioning it twice | 13:07 | |
lizmat | ? | ||
camelia | False | ||
codesections | lizmat: will do! | ||
lizmat | codesections++ | ||
kawaii | tobs: there are too many ways of doing these things, raku has spoiled me :) | 13:08 | |
codesections | tobs: the only inconsistency there is that $b != $b _looks_ like it should do the same thing, but that means something else entirely :) | 13:09 | |
13:12
aborazmeh joined,
aborazmeh left,
aborazmeh joined
|
|||
tobs | yeah, I guess Raku made a concession to the widespread use of != there. | 13:12 | |
13:13
gnufr33dom joined
|
|||
codesections | agreed. In retrospect (and with the knowledge of how many people will know at least a little JS, with its broken comparitors), I kind of wish we'd gone with `!==` | 13:14 | |
lizmat | codesections: but you can | 13:15 | |
m: say 42 !=== 666 | |||
camelia | True | ||
lizmat | m: say 42 !== 666 | ||
camelia | True | ||
lizmat | prefix ! is a meta op in that context | 13:16 | |
so if you want your code to be more readable in that respect, you can | |||
codesections | Ok, fair point. But I meant that we could have not had `!=` be a comparison operator, which would have freed it up to be the negation operator with assignment | 13:17 | |
to keep the parallelism with .= and other assignment meta ops | |||
jdv79 | =! isn't good enough for you;) | 13:19 | |
codesections | jdv79: ha, I didn't know you could put the whitespace like that! | 13:21 | |
lizmat | m: sub infix:<!=>(\a,\b) { a = !b }; my $a != True; say $a | 13:26 | |
camelia | False | ||
codesections | :D | 13:27 | |
tobs | for the original task we'd want this to be "prefix mutating unary metaop"-lookalike though | 13:30 | |
m: sub prefix:<!=>($a is rw) { $a .= not }; my $b = True; say $b; say !=$b; say $b | |||
camelia | True False False |
||
13:35
lucasb joined
|
|||
AlexDaniel | lizmat: != and ≠ are roughly the same in performance, !== is much slower | 13:40 | |
pretty much any uncommon syntax is several times slower | 13:41 | ||
rir | How to "redirect" $*ERR to $some-Str for a bit? | 13:42 | |
lizmat | AlexDaniel: nothing a "constant &infix:<!==> = &infix:<!=>" wouldn't fix | 13:44 | |
13:45
oddp left
|
|||
codesections | AlexDaniel: only "roughly the same"? I thought they _were_ the same operation | 13:45 | |
m: say &infix<!=> === &infix<≠> | |||
camelia | 5===SORRY!5=== Error while compiling <tmp> Undeclared routine: infix used at line 1. Did you mean 'index', 'indir'? |
||
codesections | m: say &infix:<!=> === &infix:<≠> | 13:46 | |
camelia | True | ||
rir | ^ s/for a bit/for more than one bit/ Ha! | ||
lizmat | codesections: they are the same | ||
AlexDaniel | lizmat: that's probably true | ||
lizmat: IIRC ≠ required a bit of wiggling to make sure it works right and is fast at the same time, I guess indeed the same can be applied to other ops | 13:47 | ||
lizmat | m: dd &infix:<≠>.name # they're aliased | 13:48 | |
camelia | "infix:<!=>" | ||
lizmat | so there is *no* runtime overhead | 13:49 | |
m: my $a = 42; for ^1000000 { my $b := $a != 666 }; say now - INIT now | |||
camelia | 0.02375516 | ||
lizmat | m: constant &infix:<!==> = &infix:<!=>; my $a = 42; for ^1000000 { my $b := $a !== 666 }; say now - INIT now | 13:50 | |
camelia | 0.0409685 | ||
lizmat | m: constant &infix:<!==> = &infix:<!=>; my $a = 42; for ^1000000 { my $b := $a !== 666 }; say now - INIT now | ||
camelia | 0.0269728 | ||
lizmat | m: my $a = 42; for ^1000000 { my $b := $a != 666 }; say now - INIT now | ||
camelia | 0.024267 | ||
lizmat | m: my $a = 42; for ^1000000 { my $b := $a != 666 }; say now - INIT now | ||
camelia | 0.0246294 | ||
lizmat | m: constant &infix:<!==> = &infix:<!=>; my $a = 42; for ^1000000 { my $b := $a !== 666 }; say now - INIT now | ||
camelia | 0.04128212 | ||
AlexDaniel | not enough iterations and possibly too much stuff optimized away | ||
lizmat | yeah, but anyway, in the same ballpark | ||
codesections | Is `note $msg; exit 1` (or other non-zero number) the preferred way to exit a CLI app when printing an error msg to the end user? I thought `die $msg` would be better, but it adds `===SORRY!===`, which the end user doesn't really need to see... | 13:56 | |
lizmat | codesections: that's how I would do it if it was a compile time error and I would want to get rid of the SORRY | ||
codesections | lizmat++ | 13:57 | |
(someday, I need to understand Raku's notion of "compile time" better. The error I encountered was based on calling EVALFILE on a file that the user passes in with a CLI flag... and yet that's a compile-time error? I guess because EVALFILE is "compiling" the file before/as it runs it? | 13:59 | ||
) | |||
lizmat | yup | 14:00 | |
moritz | yes, compile and run time can be nested in each other | ||
EVAL/EVALFILE nests a compile time inside run time | |||
lizmat | one of the cases of tormenting the implementor :-) | 14:01 | |
moritz | and BEGIN (and other constructs) nest in a run time during compile time | ||
tobs | rir: I think you would need to wrap a Str inside an IO::Handle like interface and `temp` assign that to $*ERR. There is a module for that: github.com/hoelzro/p6-io-string | 14:02 | |
14:02
aborazmeh left
|
|||
codesections | wow. That's all crazy powerful. But also makes some things a bit harder to reason about. I'm used to thinking of "it's done at compile time" as "it's free at runtime". But I guess that isn't always true with Raku | 14:02 | |
(Which might matter as we start doing more compile-time programming with RakuAST) | |||
rir | codesections: Tanstafl. tobs: Thanks. | 14:04 | |
codesections | rir: fair | ||
Geth | doc/baggy-bool-eg: 2ce6a8f169 | (Stoned Elipot)++ | doc/Type/Baggy.pod6 Fix example output |
14:09 | |
doc: stoned++ created pull request #3566: Fix example output |
14:10 | ||
14:10
sarna left
14:15
aborazmeh joined,
aborazmeh left,
aborazmeh joined
14:16
rockxloose left
14:17
mtj_ left,
MilkmanDan joined
14:18
wamba joined
14:19
aborazmeh left
|
|||
Geth | doc: 2ce6a8f169 | (Stoned Elipot)++ | doc/Type/Baggy.pod6 Fix example output |
14:21 | |
doc: 44df452c0b | (Will Coleda)++ (committed using GitHub Web editor) | doc/Type/Baggy.pod6 Merge pull request #3566 from Raku/baggy-bool-eg Fix example output |
|||
linkable6 | Link: docs.raku.org/type/Baggy | ||
14:44
guifa joined
|
|||
guifa | Um, wow. I figured this refactor would be a little bit faster but I wasn’t expeting it to be THAT much faster | 14:45 | |
tellable6 | 2020-08-18T21:26:41Z #raku <rir> guifa`: Thanks, I'll look at Comma. I've been mired in 'too much to learn' and forgot all about it. | ||
guifa | bit.ly/31bSRni | ||
14:46
wamba left
|
|||
guifa | Basically a three order of magnitude speed up. That should let loading of CLDR data be MUCH faster hopefully | 14:46 | |
15:00
gnufr33dom left
|
|||
xinming | m: my $x = "t"; class T { method t { "T v".say } }; (T."$x").raku.say; | 15:09 | |
camelia | 5===SORRY!5=== Error while compiling <tmp> Quoted method name requires parenthesized arguments. If you meant to concatenate two strings, use '~'. at <tmp>:1 ------> 3ss T { method t { "T v".say } }; (T."$x"7⏏5).raku.say; |
||
xinming | I know that T."$x"() works fine. Is it possible that in the future, raku can return the code for T."$x" kind of syntax? | 15:10 | |
guifa | I’ve always wondered about that requirement myself | 15:12 | |
moritz | what do you mean by "return the code for"? | 15:14 | |
return the method instead of calling it? | 15:15 | ||
codesections | and, relatedly, why does `T."$x"()` work, but T::("$x") does not? | ||
moritz | T.^lookup($x) | ||
codesections | moritz: I think xinming just meant "restore the functionality to be able to do" | ||
moritz | because methods live in a classes (or roles) method table, not in a scope | ||
and T::($x) is a lookup in a scope | 15:16 | ||
codesections: if you want the method object, and not call it, use T.^lookup($x) | |||
or T.^find_method($x); the two differ a bit when it comes to role and auto punning -- cannot remember which one is better for your use case right now | 15:17 | ||
codesections | yeah, I get all that :). I've been diving pretty deep into these introspection methods | ||
I'm saying that there's some special casing to get T."$x"() to work | |||
guifa | moritz: what’s the logic in requiring () though for calling? Obviously, normally you just need to do foo.call-method, and not foo.call-method(). It’s seemed odd to me to require the parentheses for the quoted method, though I’m sure there’s a reason | 15:18 | |
codesections | it has to resolve "$x" into `t`, and then lookup `t` in the T method table | ||
and it seems like the same special casing could just as easily apply to T::("$x"), and increase consistency by doing so | 15:19 | ||
moritz | guifa: that has to do with producing better error messages for accidentally using . as the concat operator (a common p5ism) | ||
guifa | perlisms strike again lol | ||
xinming | moritz: yes, I do mean return the method object with the specified name. | ||
hmm, Ignore me, I just realized, that calling method doesn't require the (). | 15:20 | ||
so, require $obj."$method-name"() is fine. ;-) | 15:21 | ||
guifa | The recent question on SO about adding a sub infix:«>>» keeps reminding me how catering to users from other languages can sometimes prevent fluent Raku users from doing certain things :-) | ||
moritz | on the one hand, I hate that so many p5isms shape current-day raku. OTOH I still use Perl 5 quite a lot, and those error messages often saved my butt | ||
guifa . o O ( although why anyone would really WANT to have a >> infix given how it already pulls at least double duty elsewhere… ) | |||
Geth | doc: 5ff724940a | stoned++ (committed using GitHub Web editor) | doc/Type/Baggy.pod6 Current and explicit Baggy.default signature (#3565) |
15:25 | |
linkable6 | Link: docs.raku.org/type/Baggy | ||
guifa | Also, random thought: andthen has basically a perfect precedence level | ||
linkable6 | DOC#3565 [closed]: github.com/Raku/doc/pull/3565 Current and explicit Baggy.default signature | ||
guifa | looser than commas so I can still use a colon method call, but tighter than postfix if | 15:26 | |
m: say “a”, “b” andthen say “c” if True | 15:27 | ||
camelia | ab c |
||
guifa | m: say “a”, “b” andthen say “c” if False | 15:28 | |
camelia | ( no output ) | ||
15:44
MilkmanDan left
15:51
MilkmanDan joined,
melezhik joined
16:01
mtj_ joined
16:20
dogbert11 joined
16:33
dakkar left
16:44
gabiruh joined
16:51
Altai-man joined
16:53
sena_kun left
|
|||
codesections | I mentioned this the other day, but I *really* like that this form works: | 17:07 | |
m: say 1 ==> {$_ + 1}() | 17:08 | ||
camelia | 1 | ||
codesections | m: say: 1 ==> {$_ + 1}() | ||
camelia | ( no output ) | ||
codesections | m: ( 1 ==> {$_ + 1}() ).say | 17:09 | |
camelia | 2 | ||
Geth | doc/list-eg-output: 7a0b5821fe | (Stoned Elipot)++ | doc/Type/List.pod6 Uniformize examples' output And while here, if we would like an example to produce an output, we might as well call `say` :) |
17:10 | |
doc: stoned++ created pull request #3568: Uniformize examples' output |
|||
codesections | (grr, getting the output to print correctly there made the syntax less pretty and undermined the point I was making. Oh well) | ||
17:19
Kaiepi joined
|
|||
xinming | m: class B { has $.a is rw; }; class T is B { method t () { $.B::a = 5 }; }; my $o = T.new; $o.t.say; | 17:21 | |
camelia | No such method 'B::a' for invocant of type 'T' in method t at <tmp> line 1 in block <unit> at <tmp> line 1 |
||
xinming | m: class B { has $.a is rw; }; class T is B { method t () { self.B::a = 5 }; }; my $o = T.new; $o.t.say; | ||
camelia | 5 | ||
xinming | In this case, Should $.B::a work as expected? | ||
hmm, ignore me, I think I realized, that $.meth is to mean $(self.meth) literally | 17:22 | ||
rypervenche | m: 1 ==> {say $_ + 1}(); | 17:37 | |
camelia | 2 | ||
rypervenche | codesections: Better? Or not what you wanted? | ||
codesections | Meh, close enough :) That's technically printing out the sum of $_ + 1 and then returning True from the block, and I was printing out the return value of the block. But I didn't really care about printing – I just like that we can pass args in from the left when it's clearer to do so! | 17:38 | |
17:40
sftp joined
|
|||
codesections | wait... it just occurred to me that we can also do 1.&{$_ + 1} | 17:41 | |
rypervenche | You win. | 17:44 | |
17:46
stoned75 left
|
|||
CIAvash | codesections: you can do `==> say()` too | 17:48 | |
17:58
Guest47135 is now known as aluaces
18:23
finanalyst joined,
bocaneri left
18:27
rindolf left
|
|||
brass | Hey, is there a way to limit floats to 2 decimal places when printing? | 18:28 | |
Or I guess it's a Num, not a float | 18:29 | ||
codesections | m: say '%.2f'.sprintf(20.sqrt) | 18:30 | |
camelia | 4.47 | ||
codesections | brass ^^^ | ||
docs are here: docs.raku.org/language/independent...ne_sprintf | 18:31 | ||
tobs | or 20.sqrt.fmt('%.2f') | ||
brass | Oh awesome, thank you | ||
codesections | tobs: oh, I didn't know about that one. Any idea why we have two such similar subs? Just for TIMTOWTDI? | 18:32 | |
tobs | pretty sure that fmt uses sprintf internally, but one is a method on (format) Strs, the other on Cool | 18:33 | |
codesections | makes sense | 18:34 | |
tobs | depends on what is the subject and what the object of that statement in your head, so yes TIMTOWTDI | ||
18:35
rindolf joined
18:42
xelxebar joined
18:49
cpan-raku joined,
cpan-raku left,
cpan-raku joined
18:53
wamba joined
18:55
melezhik left
19:05
guifa` joined
19:13
wamba left
|
|||
[Coke] | m: dd FatRat.^methods[*-1] | 19:35 | |
camelia | Submethod+{is-hidden-from-backtrace} BUILDALL = Submethod+{is-hidden-from-backtrace}.new | ||
kawaii | Is it allowed to wrap `when` in `if` within switches like this? www.irccloud.com/pastebin/jbKPVgPn/ | 19:37 | |
SmokeMachine | is there a way of changing the default class for @, % and $ on a specific class or on a class created by a specific metaclass? | 19:43 | |
I mean on attributes | 19:44 | ||
19:44
melezhik joined
|
|||
guifa` | kawaii: it appears to work okay | 19:46 | |
kawaii | guifa`: thanks for testing, not on my raku box :) | 19:47 | |
guifa` | kawaii If you've gome complex logic though, you can always use given $blah, $something | 19:48 | |
and then | |||
when 1, .not { }; when 2, .not { }, when 3, * { } | 19:49 | ||
19:57
melezhik left
|
|||
brass | Is it intentional that when I run something like &print.^methods I get completely borked output? | 20:03 | |
I get a ton of lines mixed in with the methods that just say "implementation detail and has no serviceable parts inside" and it makes the output unreadable | 20:04 | ||
Like this imgur.com/WaI2SZO | 20:07 | ||
Like I can use something like `&print.^methods.grep(!*.gist.contains(" "))' but that seems unnecessary | 20:11 | ||
lizmat | brass: what are you trying to achieve? | 20:12 | |
[Coke] | when you dump them methods, you're getting a gist of the methods, not the method names. | ||
brass | I just like checking out the methods on random things out of curiosity | ||
Ah ok I see | |||
[Coke] | m: &print.^methods>>.name | 20:13 | |
camelia | ( no output ) | ||
tadzik | m: say &print.^methods».name | ||
camelia | (<anon> <anon> <anon> gist multi <anon> leave <anon> <anon> <anon> <anon> <anon> <anon> soft <anon> <anon> package <anon> wrap unwrap <anon> <anon> <anon> onlystar raku cando <anon> <anon> <anon> <anon> candidates BUILDALL POSITIONS phasers returns WH… | ||
[Coke] | m: dd &print.^methods>>.name | ||
camelia | ("<anon>", "leave", "<anon>", "<anon>", "<anon>", "<anon>", "<anon>", "raku", "<anon>", "<anon>", "soft", "<anon>", "cando", "<anon>", "package", "gist", "<anon>", "onlystar", "<anon>", "<anon>", "multi", "<anon>", "<anon>", "<anon>", "<anon>", "wrap"… | ||
tadzik | ha :) | ||
[Coke] | so that's a little better. | ||
[Coke] shakes his old-man fist in the air. | |||
<-- too slow | |||
brass | Haha | 20:14 | |
tadzik has the ping advantage | |||
brass | What are the anonymous methods use for? | ||
[Coke] is also theoretically supposed to be paying attention to this presentation | |||
m: dd &print.^methods[0] | |||
camelia | ForeignCode <anon> = The 'ForeignCode' class is a Rakudo-specific implementation detail and has no serviceable parts inside |
||
[Coke] | m: dd &print.^methods[2] | 20:15 | |
camelia | ForeignCode <anon> = The 'ForeignCode' class is a Rakudo-specific implementation detail and has no serviceable parts inside |
||
[Coke] | m: dd &print.^methods[3] | ||
camelia | Method gist = proto method gist (Mu: |) {*} | ||
[Coke] | m: dd &print.^methods[2].Signature | ||
camelia | No such method 'Signature' for invocant of type 'ForeignCode'. Did you mean 'signature'? in block <unit> at <tmp> line 1 |
||
[Coke] | m: dd &print.^methods[2].signature | ||
camelia | :(|) | ||
tadzik | what a weird smiley face | ||
[Coke] | so you can poke around at the individual methods a bit if you want. | 20:16 | |
tadzik++ | |||
20:20
MasterDuke joined
20:33
Kaiepi left
|
|||
SmokeMachine | how can I do something like this (but that works) | 20:36 | |
m: class P is Proxy { has $!value; method new { ::?CLASS.bless: FETCH => -> | { $!value }, STORE => -> $value { $!value = $value } } }; my $p := P.new | |||
camelia | Cannot invoke this object (REPR: Null; VMNull) in method new at <tmp> line 1 in block <unit> at <tmp> line 1 |
||
lizmat | SmokeMachine: fwiw, I haven't been able to subclass Proxy :-( | 20:39 | |
20:40
stoned75 joined
|
|||
SmokeMachine | lizmat: :( | 20:40 | |
I think that's not the first time I do that question... | |||
lizmat | perhaps this is of use: gist.github.com/lizmat/4bb3e1d997f...85815a431d | 20:42 | |
stoned75 | hi it seems the independent routine join's first parameter has a default value, how can I trigger its usage ? | 20:43 | |
cf. github.com/rakudo/rakudo/blob/mast....pm6#L2146 | |||
lizmat | interesting: I don't think you can, and it's there for documentation / introspection only | 20:44 | |
gist.github.com/lizmat/4bb3e1d997f...85815a431d # for SmokeMachine | 20:45 | ||
stoned75 | that's what I thought but I don't get how it is useful | ||
lizmat | it could be considered dead code | 20:46 | |
stoned75 | ok :) | ||
raku-bridge | <primetoxinz> Hello, I'm working a module that is doing some native calls and I have a Pointer[int32] that I'm trying to get the int value out of. my $p = Pointer[int32].new(); # Native call that assigns the value say $p.deref; This causes a segfault. What am I missing? If I say $p I can see the value is visible NativeCall::Types::Pointer[int32]<0x2> | 20:51 | |
20:51
thundergnat joined
20:52
sena_kun joined
|
|||
Geth | ¦ doc: taboege assigned to codesections Issue Document the .add/.remove BagHash methods and the .set/.unset SetHash methods github.com/Raku/doc/issues/3569 | 20:53 | |
lizmat | m: say join' | ||
camelia | 5===SORRY!5=== Error while compiling <tmp> Two terms in a row at <tmp>:1 ------> 3say join7⏏5' expecting any of: infix infix stopper postfix statement end statement modifier … |
||
lizmat | m: say join | 20:54 | |
camelia | |||
20:54
Altai-man left
|
|||
lizmat | stoned75: the reason $sep = '' is in there | 20:54 | |
without it, the above would throw an error | |||
stoned75 | so a straigth join a is fancy way to get an empty string ? :) | 20:56 | |
lizmat | yeah, looks like :-) | ||
raku-bridge | <primetoxinz> Oh I think I realized part my the problem. I wasn't aware native CPointers don't allocate memory. how would I do that for an Pointer[int32]? | 20:57 | |
SmokeMachine | lizmat: but I still need to pass FETCH and STORE, right? :( | 20:58 | |
thundergnat | This fills me with nearly equal parts pleasure and horror: gist.github.com/thundergnat/76b406...a99b80715a | ||
I'm debating whether that is worth packaging up and releasing as a module. | 20:59 | ||
lizmat | SmokeMachine: don't think so | ||
20:59
rindolf left
|
|||
lizmat | as long as the Proxy is set up the correct way and returned, it shouldn't matter | 20:59 | |
SmokeMachine | no, you are right... I haven't removed the !s | ||
lizmat | thundergnat: I seem to recall this is being done for 1,2,4 bit native ints on MoarVM | 21:01 | |
or: work is underway to do that | |||
SmokeMachine | lizmat: but can I use positional inside the FETCH block? | ||
thundergnat | I am somewhat amused that mine will support ANY sized UInt. Want a 23 bit UInt? No problem. :-) | 21:02 | |
lizmat | SmokeMachine | ||
SmokeMachine: not sure what you mean | |||
thundergnat: 1,2,4 native bit support would also imply native arrays with those sizes | 21:03 | ||
MasterDuke | primetoxinz: i haven't used NativeCall, but i'd suggest asking timotimo or nine, they should be able to help | ||
raku-bridge | <primetoxinz> MasterDuke: thanks | 21:04 | |
SmokeMachine | lizmat: I what to have a attribute on the proxy's child and use it inside the FETCH and STORE blocks | 21:07 | |
lizmat | what an attribute? Shouldn't a closed over variable have the same functionality ? | 21:08 | |
*why | 21:09 | ||
21:09
sftp left
|
|||
SmokeMachine | lizmat: to store the value | 21:09 | |
lizmat: what I'm trying to do is a "Scalar" that does something on FETCHing and on STOREing besides everything Scalar already do | 21:11 | ||
lizmat | SmokeMachine: have you read raku-advent.blog/2020/08/17/rfc-15...c-objects/ ? | ||
in the "proxier" sub, the $value parameter is closed over and acts as an attribute, no ? | 21:12 | ||
SmokeMachine | lizmat: you mean storing it on a local var? that makes sense... | 21:13 | |
lizmat | inside the sub you can as many as you want | ||
*the proxier sub | |||
SmokeMachine | lizmat: yes, thank you very much! | 21:14 | |
21:16
sftp joined
|
|||
SmokeMachine | lizmat: about that, is there a way to change the default Class for @, % and $ on a class being created by a custom meta class? | 21:18 | |
without need to do `has @.bla is MyNewDefault` | |||
lizmat | actually, I ran into that recently myself | ||
SmokeMachine | lizmat: and have you found a way of doing that? | 21:19 | |
:) | |||
lizmat | m: BEGIN say Array.WHERE; class Array is Array { }; BEGIN say Array.WHERE | 21:20 | |
camelia | 66032432 139810078667168 |
||
lizmat | so that establishes that you *can* subclass Array lexically with same name | ||
SmokeMachine | m: BEGIN say Array.WHERE; class Array is Array { method what { say "Im not array" } }; BEGIN say Array.WHERE; Array.what | 21:21 | |
camelia | 52253584 139954543880224 Im not array |
||
lizmat | m: class Array is Array { method AT-POS($pos) { say "fetching $pos"; nextsame } }; my @a is Array = ^10; say @a[2] | ||
camelia | fetching 2 2 |
||
SmokeMachine | interesting... | ||
lizmat | so, the codegen is *not* looking at what Array means when it is compiling | ||
I would consider that a bug, actually | 21:22 | ||
SmokeMachine | m: BEGIN say Scalar.WHERE; class Scalar is Scalar { method what { say "Im not scalar" } }; BEGIN say Scalar.WHERE; Scalar.what; my $a; $a.VAR.what | ||
camelia | 62009056 No such method 'what' for invocant of type 'Any'. Did you mean 'flat'? in block <unit> at <tmp> line 1 140267424113536 Im not scalar |
||
SmokeMachine | lizmat: it really seems to be a bug, but that should be a way to change the default, shouldn't it? | 21:24 | |
lizmat | I would say so, yes, at least lexically | ||
SmokeMachine | lizmat: I was thinking on something like existing a method on the meta class that returns the default, like: sub default-class-for(\type, Positional) { Array } | 21:26 | |
lizmat | that feels like a lot of action-at-a-distance to me | 21:27 | |
class Array is Array { } would at least only be active in the scope where the "subclass" exists | |||
SmokeMachine | lizmat: that way I could implement a meta class that would use different defaults than ClassHOW | ||
lizmat | sure... :-) | 21:28 | |
SmokeMachine | that way it would affect only the types created by that meta class... but if you are using that new keyword for using that meta class, you want the new default | 21:29 | |
lizmat: why would be that action-at-a-distance? | |||
isn't the meta class responsible to define everything about the new type? | |||
lizmat | if you're creating a new meta-class, that's ok | 21:30 | |
I was referring to adding that default-class-for( to the current meta-class | |||
SmokeMachine | lizmat: yes, that's my intention | ||
tony-o | m: say Version.new("1.2.1") cmp Version.new("1.2.1γ") | ||
camelia | More | ||
tellable6 | 2020-08-17T22:48:26Z #raku <melezhik> tony-o - here the list of aws related sparrow plugins, including the ones to work with lambdas - rakudist.raku.org/hub/search?q=aws | 21:31 | |
2020-08-17T22:52:39Z #raku <melezhik> tony-o some of aws plugins might now work as they were created for old version of Sparrow written in Perl, but these ones (lambda related) should work - rakudist.raku.org/hub/search?q=function | |||
2020-08-17T23:05:28Z #raku <melezhik> tony-o - might NOT work | |||
lizmat | and *that* would affect classes outside of the lexical scope where you wet a different default class, would it not ? | ||
SmokeMachine | lizmat: but would be a way of new meta classes use a method to define the defaults and ClassHOW do not implement that? | ||
lizmat | I'm not sure I can parse that line in the way you meant | 21:32 | |
SmokeMachine | sorry, my english is terrible | ||
lizmat | no pb, please try to explain again :-) | 21:33 | |
SmokeMachine | I mean, if ClassHOW has a `default-class-for`, every type created by that would use that defaults, right? | ||
lizmat | yes | 21:35 | |
SmokeMachine | when creating the type, when find an attribute with @, for example, it would run `type.^default-class-for(Positional)` it would return Array and that type would have a new Array attribute | ||
the only way of changing the defaults would be creating a new meta class. | 21:36 | ||
lizmat | ah, so you mean that would not be settable ? | ||
I got the impression from you that it would be settable | |||
SmokeMachine | yes, read only | ||
no... | |||
lizmat | sure, that could work :-) | 21:37 | |
SmokeMachine | do you think people would accept something like that? | ||
Geth | doc/list-join: cb606ae8f3 | (Stoned Elipot)++ | doc/Type/List.pod6 Rework List.join examples and description - Remove duplicate note about the optional separator for the method form - It's the subroutine form that is slurpy and flattening - Group related examples - Correct a typo |
||
doc: stoned++ created pull request #3570: Rework List.join examples and description |
|||
lizmat | SmokeMachine: I would give it a good chance :-) | 21:38 | |
guifa` just got a drawing tablet at $day-job | |||
Time to make some fancy »ö« | |||
SmokeMachine | lizmat: so, I think I'll create a new problem solving issue... | 21:39 | |
lizmat | ++SmokeMachine | ||
Geth | doc: codesections++ created pull request #3571: Overhaul the list-missing-methods.p6 script |
21:40 | |
22:04
wamba joined
|
|||
tony-o | m: say say Version.new("γ") cmp Version.new("0"); say "γ" cmp "0"; | 22:11 | |
camelia | Less True More |
||
tony-o | m: say Version.new("γ") cmp Version.new("0"); say "γ" cmp "0"; | ||
camelia | Less More |
||
22:17
sftp left
22:25
guifa` left
22:28
japhb joined,
sftp joined
22:30
yuplushi joined
22:31
stoned75 left
22:36
squashable6 joined
22:50
sena_kun left
22:51
sena_kun joined
22:57
Sgeo joined
23:04
hungrydonkey left
23:07
guifa` joined
23:08
lichtkind left
23:25
wamba left
23:37
aborazmeh joined,
aborazmeh left,
aborazmeh joined
23:39
MilkmanDan left,
MilkmanDan joined
23:42
aborazmeh left
|
|||
SmokeMachine | lizmat: github.com/Raku/problem-solving/issues/220 | 23:46 | |
23:48
aborazmeh joined,
aborazmeh left,
aborazmeh joined
|