🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). Log available at irclogs.raku.org/raku/live.html . If you're a beginner, you can also check out the #raku-beginner channel!
Set by lizmat on 6 September 2022.
botato raku's concurrency features look neat, so I want to implement some solutions to protohackers to learn it, but I'm stuck on the first problem: protohackers.com/problem/0 01:29
a basic tcp echo server in raku is easy enough, but this has the complication that you don't echo their message right away, but read everything until they close, and then write everything back 01:30
botato but it seems IO::Socket::Async doesn't have the concept of half-closed connection? with tcp one side or the other should be able to close connection and it is half closed meaning they won't send anymore but can still receive, then when other side closes it's fully closed 01:31
to read everything first, and then write it back all at once I try: for $conn.Supply(:bin).list.eager -> $msg {$conn.write: $msg;} 01:32
but when the other side half-closes the connection, so for sure there won't be anything more to receive, the Supply is still open, until I close my side of the connection 01:33
botato I try non Async socket: gist.github.com/bo-tato/7930d618b4...142eccb3b8 and `echo "adsf" | nc localhost 1337 -v`, and it seems worse, that the recv call blocks forever even though the socket is fully closed 01:41
with the Socket::Async at least when socket is fully closed the Supply closes, just when the other side has half-closed the tcp connection the Supply is still open though it should be closed at that point I think 01:42
can test as after EOF from the echo piped to nc, it half-closes the connection, then ctrl-C the nc to fully close it 01:44
timo github.com/libuv/libuv/issues/3449 harumpf 03:41
botato my bad if testing with nc you need -q0 so it sends half close as soon as it reads EOF 04:37
interesting issue, but here we don't have any RST flag
echo server with IO::Socket::Async: gist.github.com/bo-tato/1f0a264c78...41217561d0 tcpdump log: gist.github.com/bo-tato/45262edebb...fa55634e24 as soon as it gets Fin flag from client, it sends back Fin and closes connection, never writing back the message 04:40
echo server that passes the protohackers.com tests: `socat tcp-l:1337,fork,reuseaddr exec:cat` with tcpdump: gist.github.com/bo-tato/4b7b092cb5...c3bbbbe045 after it gets Fin from client it doesn't respond with Fin right away, but echoes the message back, then closes it's side with Fin 04:42
is that possible with current raku socket library?
Geth advent: pheix++ created pull request #117:
Add post by pheix on KZG commitments and Ethereum v3 trxs
08:30
timo very worst case, you can still NativeCall 08:59
Geth advent/main: 726baa649d | Kostas++ (committed using GitHub Web editor) | raku-advent-2024/authors.md
Add post by pheix on KZG commitments and Ethereum v3 trxs (#117)
10:18
xinming m: ((0..Inf) Z <a b c>).grep(*[1] eq "b").map(*[0]).raku.say 10:45
camelia (1,).Seq
timo ^- can that use the :as named argument to grep? 10:46
xinming Above example is a way to get index of an element, But wonders, Is there a function which is defined for this? returns indexes with a function without such onliners.
timo oh, of course
there's .pairs, there's .kv, depending on how you would prefer to iterate over the thing
and the :kv and :p or :pairs argument to grep 10:47
lizmat or even :k !
timo m: say <a b c d e f>.grep("b", :k)
camelia (1)
timo m: say <a b c d e f a b c d a b c a b a b a>.grep("b", :k)
camelia (1 7 11 14 16)
timo m: say <a b c d e f a b c d a b c a b a b a>.grep("b", :kv)
camelia (1 b 7 b 11 b 14 b 16 b)
xinming timo: thanks for the :k thing. 10:48
This is why I love raku/perl
quite expressive. :-)
timo it's also vaguely related to the schwartzian transform from perl that you can do without in raku in more places 10:49
also thank liz as well :)
xinming m: my @x = [[1..3]] 12:52
camelia ( no output )
xinming m: my @x = [[1..3]]; @x.raku.say;
camelia [1, 2, 3]
timo m: my @x = [[1..3],]; dd :@x
camelia :x([[1, 2, 3],])
xinming With this example, I know that ((1..3)) will be slipped makes sense. But why will [[]] be still slpped? 12:53
timo it's not "slipped" per se, it's just iterated. this is the "single-argument rule" in action
xinming timo: Yea, I know that adding comma will work, But that makes me confuse
timo the [1..3] is the single argument to the outer circumfix:<[ ]>
m: for [1,2,3] { "element: $_".say }
camelia element: 1
element: 2
element: 3
timo m: for $[1,2,3] { "element: $_".say } 12:54
camelia element: 1 2 3
timo "unless it's an item"
xinming m: my @x = <a b c>; my @idx = 1,2; my @t = @x; @x = (); @x[@idx] = @t[@idx]; @x.raku.say; 14:49
camelia [Any, "b", "c"]
xinming In this example, Is there a way to remove the @t var and empty the @x in this case?
I mean, preseving the array, But only keep portion of values 14:50
timo m: my @x = <a b c>; my @idx = 1,2; @x = @x[][@idx]; @x.raku.say; 14:52
camelia ["b", "c"]
timo actually it also works without the empty []
or do you want the Any in there? 14:53
xinming timo: yea 14:55
I know the @x[@idx] thing, But it doesn't preserve the Array shape 14:56
So my code do a backup, and cleanup original array, then assign items accordingly
it's quite fine even we can't do that, I personally doesn't think this should be the language feature. Just try to make things more compact 14:58
timo i can think of things that are longer than what you wrote 14:59
m: my @x = <a b c>; my @idx = 1,2; @x .= map({ ($++ (elem) @idx) ?? $_ !! Any }); @x.raku.say 15:02
camelia [Any, "b", "c"]
timo it's only slightly longer than yours :\ 15:03
xinming I thought about this idea too, just felt it's harder to understand. I think no built-in language feature for this. 15:09
dakkar m: my @x=<a b c>; my @idx=1,2; @x[(@x.keys() (-) @idx).keys()]:delete;@x.raku.say
camelia [Any, "b", "c"]
dakkar "delete all indices not mentioned" 15:10
nahita3882 you can reduce to @x[(^* ∖ @idx).keys]:delete if you wanted 15:14
that we need .keys is a little sad i think
timo are you a raku golfer? :D amazing
i think you could shorten that to @x[keys ^* \ @idx:]:delete 15:15
nahita3882 i had the same idea as dakkar and was looking to shorten further :p 15:20
and it wasn't working without .keys on the Set produced, it was deleting "b", which is actually a bit mysterious unfortunately 15:21
it takes the length of the Set when it is used directly as the indexer for some reason 15:22
also your .map solution works even if the last item has to go; ours shorten the list length by 1 in that case 15:23
also compiler gets confused on your indirect method invocation suggestion unfortunately
timo damn
does it need [(@x....:)] to work? 15:24
nahita3882 i tried with parens in various places, it's still confused on the location of the infix ∖ 15:25
timo ah, dang, so it would need parens around that and then there is no win from the : syntax 15:26
lizmat and yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2024/11/25/2024-...o-release/ 16:23
El_Che hi lizmat, thank you 16:49
xinming DarthGandalf: thanks for the idea, That version is acceptable to me 18:48
xinming @nahita3882 I don't like the @x[(keys ^* \ @idx:]:delete thing, As I don't understand how it worked. :-) 18:49
DarthGandalf xinming: which one? 19:02
xinming DarthGandalf: oops, sorry, wrong completion, I mean dakkar 19:05
timo that's not the one that worked :D 19:07
that's my broken one
antononcube DarthDakkar?
xinming m: multi test-multi (@a) { @a.raku.say }; <a b c>.test-multi() 19:09
camelia No such method 'test-multi' for invocant of type 'List'
in block <unit> at <tmp> line 1
xinming IIRC, before we can call test-multi as method for an object, Is my memory wrong? 19:10
timo do it like .&test-multi() 19:15
xinming timo: So, the syntax changed long ago, right? 19:18
thanks
lizmat it's been like thatfor 12 years at least :-)
xinming hmm, Ok, I'll need to refresh my memory for all these. 19:20
ab5tract xinming: you also have this option: 19:38
m: my $a = <1 2 3> but role :: { method test-multi { say "testing!" } }; $a.test-multi
camelia testing!
ab5tract note that DWIMs with scalar container
lizmat
.oO( sometimes I wish we could drop the "role :: { }" boilerplate
19:39
) 19:40
.oO( also syntax like "is !built" for "is built(False)" )
19:44
timo isn't built 19:46
lizmat hmmmm 19:52
that would mean a new trait_mod
timo can't just make that a sub, right? has to go in the grammar as well? 19:59
or does it automatically do that just like operators do?
m: multi sub trait-mod:<isn't>(Attribute $thing, :$built!) { say "haha" }; class A { has $.foo isn't built } 20:00
camelia ===SORRY!=== Error while compiling <tmp>
Cannot add tokens of category 'trait-mod'
at <tmp>:1
------> multi sub trait-mod:<isn't><HERE>(Attribute $thing, :$built!) { say "haha
timo asciinema.org/a/jKMWXHzKYk1tRdc7Xfc0wzcDD silly little "when you paste something in this line editor, you get to work on the stuff before it actually goes in" proof-of-concept / experiment 21:56
japhb, patrickb: check it out :) it's based on Terminal::LineEditor
patrickb oh wow! That's a slice'n'dice! 21:58
timo it can almost send email, but not quite 21:59
don't ask what happens when the individual lines are too long to fit in one line ... :| 22:03
i also accidentally half a lizmat's Commands module, but worse 22:04
but really, a normal user would probably just want a keybind that launches $EDITOR 22:05
guifa random: do we have a clipboard module?
ah we do 22:06
timo is it for the OSC 53 or whichever it is ansi escape sequence? or like xclip or so? 22:07
timo i see now that it shells out to a commandline program that does the clipboard handling 22:31
guifa yeah works for a QAD manner, but I wonder what it gets when the clipboard has binary data 22:40
I've been trying to do systems stuff where the command line is the fall back but trying to do a native call as preferred 22:41
I think User::Language was my first one with that model
Geth advent/finanalyst-patch-1: a7deb7c306 | (Richard Hainsworth)++ (committed using GitHub Web editor) | raku-advent-2024/authors.md
Update authors.md

Suggestion for Day 8
22:44
advent: finanalyst++ created pull request #118:
Update authors.md
Geth advent/main: 193fe96f38 | (Richard Hainsworth)++ (committed using GitHub Web editor) | raku-advent-2024/authors.md
Update authors.md (#118)

Suggestion for Day 8
23:34