🦋 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. |
|||
00:00
reportable6 left
00:01
reportable6 joined
|
|||
Nemokosch | hm, is the github site weird, then? this is what I see | 00:01 | |
cdn.discordapp.com/attachments/633.../image.png | |||
cfa | the second line is indented with a tab, that's why | 00:05 | |
likewise "Test::Util::ServerPort" and "Cro::HTTP::Client" | |||
Nemokosch | is there a difference between a plain block and a try block if one's handling all exceptions that can occur inside anyway? | 00:09 | |
rf | That try should only produce errors that are catchable by the error handler I think | 00:32 | |
00:38
pingu joined
|
|||
rf | Caught a fairly nasty bug thanks to @2colours on github, if you're in here thanks! | 00:42 | |
Nemokosch | I'm most definitely in here 🙊 | 00:43 | |
there is another thing that keeps me pondering, which is .clone new-raku.finanalyst.org/type/Array...thod_clone | 00:45 | ||
again, if it ever happened that you wanted to share a lazy lists across threads, there could be problems | 00:46 | ||
rf | Yeah, I think in the context you're mentioning, it should never be used across threads. If I did need to I would reach for channels | 00:50 | |
What you did show me, is that my compositions for routes were completely out of wack | 00:51 | ||
They should be good now :D | |||
Nemokosch | for the .elems gotcha: github.com/rakudo/rakudo/issues/24...1348065571 these issues are good for more than just complaining 😉 | 00:52 | |
rf | I see | 00:54 | |
Nemokosch | I don't know how you feel about looking up code in the core, for me the breakthrough was the module called CoreHackers::Sourcery that directly points to the part in the repo | 00:56 | |
iirc it's a thin wrapper around inspection tools the language/runtime provides anyway | 00:57 | ||
01:04
xinming left
|
|||
rf | Not sure what you mean by in the core | 01:05 | |
01:06
xinming joined
|
|||
Nemokosch | mostly the "standard library" or "built-ins" or whatever name one would give them | 01:10 | |
stuff that is mostly written the same way you'd write your code, but is provided with Rakudo, and usually a part of the specification | 01:11 | ||
tonyo | stevied: the apple double file fix was released with fez:ver<40> | 01:13 | |
well, i don't know about fixed. i couldn't repro. the PR that should fixed it is merged | 01:18 | ||
stevied | Ok. Cool. I’ll test it out tomorrow. Thanks! | 01:21 | |
[Coke] wonders if there's a way to say "install all the deps you can" with zef, so if you know there's one bad one, you can install everything else leaving only those that failed out | 01:35 | ||
tonyo | is force not doing that? | 01:40 | |
err oh, you want the tests to determine failurestill | |||
01:42
raschip joined
|
|||
[Coke] | anyone install Archive::Libarchive::Raw on an m1/m2 mac? | 01:49 | |
i've installed libarchive with brew, added the homebrew path to my PATH for the lib as indicated by 'brew info' and still it can't find libarchive.13.dylib | 01:50 | ||
cfa | so the library location is in (DY)LD_LIBRARY_PATH? | 01:59 | |
e.g. $ env LD_LIBRARY_PATH=/path/to/lib zef install Archive::Libarchive::Raw | 02:00 | ||
[Coke] | neither DYLD or LD help, no | 02:04 | |
cfa | oh, do you have SIP (system integrity protection) enabled? | 02:05 | |
i think if that's active then changes to LD_LIBRARY_PATH are stripped | |||
[Coke] | yes | 02:08 | |
cfa | where is libarchive.13.dylib installed? | ||
[Coke] | so I probably want developer.apple.com/documentation/...-variables | 02:09 | |
/opt/homebrew/opt/libarchive/ | 02:10 | ||
jdv | [Coke]: isnt there s flag for that? | ||
--serial ? | 02:11 | ||
[Coke] | ? | ||
cfa | for your deps question, i think | 02:12 | |
[Coke] | oh, for my zef question? | ||
jdv | yeah | ||
[Coke] | ah, entitlements are not some global thing. :| | ||
so I think I either have to softlink from a known directory or disable SIP entirely | 02:13 | ||
(if I was using the mac dev tools, I could do it for that project, I think) | |||
cfa | i have a hack for you if you want it | 02:15 | |
zef look Archive::Libarchive::Raw | |||
then edit lib/Archive/Libarchive/Raw.rakumod | 02:16 | ||
edit line 7, replacing 'archive' with '/opt/homebrew/opt/libarchive/archive' | |||
obviously that will only work for this module but it's a stopgap measure | 02:17 | ||
(this assumes you have /opt/homebrew/opt/libarchive/libarchive.13.dylib) | |||
[Coke] | thanks for the hack. I may have to do it. | ||
cfa | sure, good luck | 02:18 | |
[Coke] | (mach-o file, but is an incompatible architecture (have (arm64), need (x86_64)) | 02:28 | |
(and path is /opt/homebrew/opt/libarchive/lib/archive | 02:29 | ||
jdv | is it a macho macho file? | 02:30 | |
02:42
evalable6 left,
linkable6 left
02:44
evalable6 joined
02:45
linkable6 joined
02:51
raschip left
03:26
cfa left
03:52
MasterDuke joined
04:04
rf left
04:32
razetime joined
04:38
razetime left
05:00
derpydoo left
05:16
GreaseMonkey left
05:17
greaser|q joined
05:18
pingu left
06:00
reportable6 left
06:02
reportable6 joined
06:47
razetime joined
06:49
dogbert17 joined
06:52
dogbert11 left
07:38
ispyhumanfly left
07:41
ispyhumanfly joined
07:46
razetime left
07:50
Sgeo left
08:00
razetime joined
08:17
abraxxa joined
08:23
snonux joined
08:24
snonux_ joined
08:53
greaser|q left,
greaser|q joined,
greaser|q is now known as GreaseMonkey
09:06
snonux left
09:07
snonux_ left
09:12
dakkar joined
09:40
NemokoschKiwi joined
|
|||
NemokoschKiwi | \o | 09:40 | |
Maybe let's login with the normal client to fetch those messages as well 🤔 | 09:41 | ||
09:43
Nemokosch joined
|
|||
Nemokosch | o/ | 09:43 | |
tellable6 | 2023-01-29T23:11:18Z #raku <raschip> Nemokosch: True, but I'm having REPL problems lately and I wasn't sure if it was just me or a general thing, thanks. | ||
2023-01-30T16:55:22Z #raku <raschip> Nemokosch: just drop this discussion, you don't know the community enough to do such generalizations. | |||
Nemokosch | .tell rf for operator adverbs (like :exists) - to make sure... you know that they have funnily low precedence, right? | 09:44 | |
tellable6 | Nemokosch, I'll pass your message to rf | ||
Nemokosch | .seen rypervenche | 09:45 | |
tellable6 | Nemokosch, gist.github.com/fd58ce833cbf47c7b9...ad84b16a8b | ||
Nemokosch | hm, interesting :D I remember them from the Hungarian learning server | 09:46 | |
09:46
Nemokosch left,
NemokoschKiwi left
|
|||
Nemokosch | patrickb: may I ask where you use supply/react kind of stuff? | 09:50 | |
10:08
sena_kun joined
|
|||
patrickb | The Rakudo CI bot I work on uses Cro. And Cro::HTTP::Client often fails to setup HTTP2 connections because of the issues you are presumably looking at at the moment. | 10:08 | |
For others reading this. I was referring to github.com/Raku/problem-solving/issues/364 | 10:10 | ||
Nemokosch | hm, lemme read up on the scope of this project | 10:20 | |
tbh I have to say blocker issues are less prevalent these days - I hope this means underlying bugs are less frequent, not that they are unnoticed 😅 | 10:27 | ||
10:31
lichtkind joined
|
|||
patrickb | nine, coleman, rf: I am still working on the Raku CI not, but got sidetracked by an epic bug hunt culminating in problem-solving#364. (In general I try to fix bugs I encounter instead of working around them.) That bug prevents Cro::HTTP::Client to robustly connect to Open Build Service. | 10:33 | |
Nemokosch | well, my 2 forints is that this isn't only very respectable on a professional but also at least as valuable as the CI bot itself, as it directly affects the usability of the language | 10:35 | |
professional level+ | |||
10:36
jpn joined
|
|||
nine | patrickb: so the CI already unveils bugs before even running :D | 10:52 | |
Nemokosch | btw you guys are around: another language version question. How does roast handle different specifications for different versions, especially "structurally" (I guess the test files can just do use v6.something)? | 11:01 | |
11:06
raschip joined
|
|||
nine | There are git tags for the different language version. | 11:07 | |
Nemokosch | so is the specification per-version basically? | 11:14 | |
11:25
jpn_ joined
11:27
jpn left
11:28
razetime left
|
|||
nine | yes | 11:29 | |
11:34
Bocaneri joined,
Sauvin left,
Bocaneri is now known as Sauvin
11:38
Bocaneri joined,
Bocaneri is now known as Guest4854
11:40
Sauvin left
|
|||
Nemokosch | thanks 👍 | 11:43 | |
Geth | Raku-Steering-Council/main: 877366b480 | (Elizabeth Mattijsen)++ | minutes/20230122.md Minutes of 22 Jan 2023 |
11:49 | |
11:53
Guest4854 is now known as Sauvin
12:00
reportable6 left,
reportable6 joined
|
|||
Geth | Raku-Steering-Council/main: bdc928e272 | (Elizabeth Mattijsen)++ | announcements/20230131.md Announce winner of the first Rainbow Butterfly Award And the winner is: Oleksander Kiryuhin |
12:12 | |
Nemokosch | I hope this will put him in a bit more optimistic mood ^^ | 12:20 | |
it just appeared to me that I wrote code with 6.e + experimental cached trait for "production" 🤣 | 12:30 | ||
although that "production" will probably be a tiny web service invoked once in a month, so not much "backpressure" | 12:31 | ||
:(**@rest, *%rest) | how is caching experimental 🤔 | ||
Nemokosch | I think there were recognized problems | 12:32 | |
dunno the history of it but it seems that it was kind of a defensive choice to not push it straight into the core by default | |||
nine | A whole lot of rakudo has changed since then. I wonder if things like newdisp would allow for a fully working version of that trait. | 12:36 | |
12:36
razetime joined
|
|||
lizmat | the problem still remains what to use for a key in the cache | 12:39 | |
nine | Maybe like sub foo($x, $y, $z) is cached({ $^a ~ 2 * $^b }) { } | 12:42 | |
Nemokosch | and would it be possible to hash by the capture by default? | 12:47 | |
ugexe | what does that even mean | 12:48 | |
what if one element is something that produces/generates element lazily? | |||
its easy to imagine the cash where the arguments are strings and ints | 12:49 | ||
cache^ | |||
but beyond that it gets complicated | |||
Nemokosch | well then perhaps the cache just shouldn't hit, and that doesn't sound complicated 😛 | 12:50 | |
ugexe | seems like we would expect the user to have to know quite a bit about what they're doing to use something that presents itself as very simple | 12:51 | |
just look at how confused some people get about state variables | 12:52 | ||
nine | If the user has to know and do so much themselves already, they may as well just declare that caching hash themselves. And that I guess is the story behind that experimental feature. | ||
Nemokosch | hm, they get confused about that? | 12:53 | |
anyway, there is kind of a good point here... would these caches be thread safe or not? | 12:54 | ||
nine | Of course not. Unless we decide that they should be, which then makes them slower than necessary when thread safety is actually not required. | 12:55 | |
Nemokosch | now that could probably be a gotcha to somebody who used the feature as a part of a "pure functional bundle", expecting that they managed to avoid race conditions and such | 12:57 | |
12:58
jpn_ left
|
|||
lizmat | and that's just yet another reason why it is experimental | 12:59 | |
13:00
jpn joined
|
|||
Nemokosch | for what it's worth, I don't necessarily mind that it's behind some pragma because I know what I'm using it for, and for that it just makes the code more readable 😛 | 13:01 | |
13:05
jpn left
13:22
rf joined
|
|||
rf | Morning folks | 13:22 | |
tellable6 | 2023-01-31T09:44:56Z #raku <Nemokosch> rf for operator adverbs (like :exists) - to make sure... you know that they have funnily low precedence, right? | ||
13:28
rf_ joined
13:29
rf left
13:41
jpn joined
13:49
rf_ left,
rf joined
|
|||
Voldenet | Regarding deadlocking supply problem, I've hit similar problems a few times, but always considered this to be my misunderstanding of something, heh | 13:51 | |
rf | Deadlocking supply should be fairly rare, your channels should avoid depending on each other | 13:54 | |
Fire & forget and such | 13:55 | ||
Voldenet | I had no problems with channels ever, I remember having trouble with Supply.tap, Supplier::Preserving and live supplies mix | 13:56 | |
rf | That would do it. | 13:57 | |
Voldenet | It bit me when I tried to do things like wrapping executed commands into supplies (something similar to ix.io/2lWE) | 14:01 | |
the `sub on-supply(&code, Supply $s) { supply whenever $s { &code($_); emit($_); LAST done } }` looks like it could be replaced with tap, but iirc it failed some versions ago | 14:05 | ||
I wish I've saved the failing code before fixing it | 14:10 | ||
Nemokosch | that happens all the time xD | 14:30 | |
when you actually try to get something work | |||
tbrowder | sena_kun: congratulations--a well-deserved award! | 14:36 | |
El_Che | sena_kun: cheers! | 14:40 | |
14:49
linkable6 left,
evalable6 left
14:51
evalable6 joined,
linkable6 joined
|
|||
[Coke] | sena_kun: Thanks for all you do, stay safe, thanks. | 14:53 | |
14:56
Sgeo joined
14:59
ab5tract joined
|
|||
lizmat | and yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2023/01/31/2023-...b-awarded/ | 15:11 | |
Nemokosch | cool image | 15:15 | |
rf | lizmat++ | 15:18 | |
15:21
pingu joined,
Tirifto left
|
|||
pingu | welp pastebin.com/yWyGbNe6 | 15:22 | |
it is not catching the bell character | 15:23 | ||
but BEL is ascii 7 | |||
ah wait nm, the ldraw file format says: Whitespace is defined as one or more spaces (#32), tabs (#9), or combination thereof. | 15:24 | ||
ill see if it fails if I replace BEL with tab | 15:25 | ||
oh wait tab isnt a character | |||
? | |||
ok yeah its 09 | 15:26 | ||
raschip | 0x09 | ||
pingu | ok it still fails | 15:27 | |
15:27
jpn left
|
|||
pingu | loop (my $column = 0 ; @x[$line][$column] eq chr(32) or @x[$line][$column] eq chr(9) ; $column++) | 15:27 | |
15:28
Tirifto joined
15:31
jpn joined
|
|||
pingu | also it does not seem to be incrementing index | 15:33 | |
maybe thats because the loop is exiting once it finds a space | 15:34 | ||
Nemokosch | > @x$line le chr(32) | 15:39 | |
15:40
dogbert11 joined
|
|||
so.. you want only characters less than the space itself? | 15:40 | ||
* less than or equal to | |||
15:42
dogbert12 joined,
dogbert17 left
15:45
dogbert11 left
|
|||
pingu | nm forgot to change it to tab in the file | 15:45 | |
only characters that are not space or tab | |||
15:45
cfa joined
|
|||
pingu | it must also make an numeric index of each non space or tab paramater | 15:46 | |
and then check if that index[0] is equal to 0 1 2 3 4 or 5 else print ("invalid line type") | 15:47 | ||
the first paramater is line type then color then xpos then ypos etc and the last param is the file (3024.dat) | |||
only line types 0 to 5 are valid | 15:48 | ||
but I wanna keep this C-ish so that I can actually understand what is happening | |||
I don't use raku quite like normal people | |||
because eventually i'll be rewriting this in C and you cant port OOP to C | 15:49 | ||
so I dont use fancy operators and I try not to use methods but I like some or rakus features | 15:50 | ||
like how I can just do lines() instead of having to (in C) search for '\n' | |||
and string types have their uses in raku | |||
15:51
dogbert17 joined
|
|||
pingu | so for each indexed paramater that is NOT space or tab it must create a given ... when block | 15:52 | |
15:52
dogbert11 joined,
abraxxa left,
dogbert12 left
15:56
dogbert17 left
|
|||
Nemokosch | well well | 15:57 | |
when you post things like this, at least keep in mind that you want such people to read it who are interested in reading and writing actual Raku code, not boilerplate-ish C code | 15:58 | ||
nine | "you cant port OOP to C" [Citation needed] | 15:59 | |
pingu | you can but its a pain | 16:00 | |
it is actual raku code | 16:01 | ||
its possible in raku for a reason | |||
maybe when I learn raku more ill use it more like raku because its not like I'm gonna no longer be able to use raku like C. or know C | 16:02 | ||
but for now I don't want to make the mistake as I did in C of not making programs and focusing on technical stuff too much | |||
I need to practise figuring out errors and algorithms more! | 16:03 | ||
everything is an algorithm | |||
data types, values, data structures etc | 16:04 | ||
Nemokosch | to be clear: I'm not saying that there won't be anybody gladly joining you on this journey when you post code like this, I'm just saying that your starting position rather works against it | ||
pingu | sounds like people here learned C raku after learning raku where as I'm doing it the other way around | 16:06 | |
I just don't like relying on OOP as if they are magic black boxes, I would rather understand what is going on inside of them | 16:08 | ||
hopefully the raku source code eventually boils down to bytecode or some low level procedural language | 16:09 | ||
Nemokosch | imo most people are just not particularly interested in writing "Raku as if it was C". It seems like something that defeats the purpose of using Raku in the first place | ||
16:12
dogbert17 joined
|
|||
pingu | it would be nice if comma could use AI to refactor code (probably a rakudo feature really) | 16:13 | |
16:13
dogbert11 left
|
|||
pingu | and then display the refactored code as a copy of the original | 16:14 | |
comma IDE has options for refactoring but I think thats not quite what I was asking for | 16:15 | ||
its probably just a way to organize manually refactored code or something | |||
16:15
dakkar left
16:16
dakkar left
|
|||
pingu | kinda like github | 16:16 | |
16:16
dogbert17 left
16:18
dakkar joined
16:25
snonux joined
16:26
snonux_ joined
16:29
razetime left
16:52
snonux left,
snonux_ left
|
|||
Xliff | lizmat: A question -- what do you think about executing binaries in Raku. Has the RSC determined if that is a priority over the next few years? | 17:00 | |
nine | The RSC does not set priorities. The community may do so. | ||
And really, the community's way of setting such priorities is just starting the work. Currently RakuAST is the priority. Simply by virtue of people working on it. | 17:01 | ||
Xliff | OK, so no one has taken PampleMouse's work any further? | 17:02 | |
I'm asking this for $dayJob. | |||
We have ... concerns. | |||
We have code we'd like to use in modular format. | |||
However we want to keep the bytecode in a database, for numerous reasons. | 17:03 | ||
If the goahead is given to continue my project, I'll probably have to be the one to take it up. | 17:04 | ||
I'd like to know who would be available to support me if I do. Who should I direct questions to? | |||
17:05
jpn left
|
|||
Xliff | Note that said work would NOT be for $dayJob, but for the community. | 17:05 | |
nine | If you need commercial support for Raku, I think lizmat could be interested. There's also rootprompt.at | 17:06 | |
lizmat | If this is just about storing bytecode in a database, that should be relatively doable, even without PampleMouse's work ? | 17:08 | |
[Coke] | the rootprompt site is pretty but has no contact info | 17:09 | |
Xliff | lizmat: Storing and executing from a database. Yes. | ||
Does Moar (namely nqp) support executing bytecode from a given location in memory? | 17:10 | ||
nine | [Coke]: hah! That is....well....a definite usability issue. The info is behind that imprint link | ||
[Coke] | AHHH | 17:11 | |
nine | it does | 17:12 | |
m_athias | nine: I'll get our web development team right on it! | ||
17:13
xinming left
|
|||
Xliff | nine: Is it listed in github.com/raku/nqp/blob/master/do...s.markdown | 17:14 | |
[Coke] | nine: I had something sitting on my desk in front of the screen, I didn't even SEE that link at first. :) | 17:15 | |
I would expect imprint to be called something like "contact", but this may be my american bias. | |||
here does it mean like "a printer's or publisher's name" ? | 17:16 | ||
nine | [Coke]: The imprint is there for legal reasons, but also contains exaclty the information I'd put on a contact page... | 17:17 | |
Yes, it does. | |||
Xliff | nine: A little help here. Which op is it? | 17:18 | |
I'm bouncing multiple things at once, so would be much appreciated. | 17:19 | ||
nine | something with loadbytecode | ||
Xliff | Can't find that on the page. | ||
And neither can Chrome. | |||
ab5tract | I wrote a thing: 5ab5traction5.bearblog.dev/i-raku-...structors/ | 17:20 | |
nine | not all ops are documented yet | 17:21 | |
ab5tract | nine! good to see you here! thanks for all the RakuAST work you've been doing <3 | 17:22 | |
I keep getting these impulses to dive in and help but I honestly don't have the first clue on how to approach it | |||
nine | ab5tract: it's surprisingly simple: run tests, pick one at random, start a normal debugging process | 17:24 | |
Like t/05-messages/03-errors.t currently errors out with: "Malformed my at line 33: my⏏ subset MeowMix of Int where .so;" | 17:26 | ||
Nemokosch | heh, see? the least we can say is that there are people who would expect to see some planning around activity... | 17:27 | |
nine | Since parsing failed and the "special" thing about this line is a subset, that's what I'd look at: | ||
> grep subset src/Raku/Grammar.nqp | |||
nine@sphinx:~/rakudo (main =)> | |||
Nemokosch | and tbh even as volunteers, being somewhat managed wouldn't hurt with actually achieving what the members are doing anyway, just in a disorganized fashion | 17:28 | |
nine | Yeah, subset is not even parsed yet. So look at src/Perl6/Grammar.nqp and search for subset to see what the old grammar does. Copy over that code to src/Raku/Grammar.nqp and then add actions | ||
ab5tract | ok, interesting | ||
nine | Nemokosch: we don't have people who want to manage and we don't have people who would want to be managed. So that line of discussion can only be theoretical until both facts change. | 17:29 | |
tellable6 | nine, I'll pass your message to Nemokosch | ||
Nemokosch | I think both are relatively simple to change - the starting point, though, is that those people who accepted some formal or informal position, should be willing to be managed, if nothing else | 17:30 | |
and if noone else is | |||
ab5tract | so Perl6/Grammar.nqp and Raku/Grammar.nqp will have the same code, the new stuff happens in these actions. Which are added (in this case) a new Raku/subset.nqp file? | 17:31 | |
Nemokosch | does Actions itself not remain? | ||
I mean, as one file, not content-wise | 17:32 | ||
ab5tract | probably it does, I'm just not (much of) a core hacker | ||
nine | ab5tract: not entirely the same. The old grammar contains too much logic, which is no longer necessary. But often things can be taken verbatim. In any way it's a good start. There is a Raku/Actions.nqp that contains actions like any Raku grammar would need. Most of what it does though is create AST nodes via self.r('Foo', 'Bar').new(...) | ||
Nemokosch | anyways, great example: one article, or just a sketch, about how to start with RakuAST | 17:34 | |
nine | Nemokosch: well volunteered! | 17:35 | |
tellable6 | nine, I'll pass your message to Nemokosch | ||
ab5tract | I'll take a look. Thanks for the guidance. I really feel like with a written procedure / example of how one patch was made could create a big impact in terms of others being able to help on the efforts | 17:36 | |
nine | I'm happy to answer further questions on IRC | 17:37 | |
ab5tract | Excellent :) | ||
How do I run the tests using RakuAST versus regular Raku | |||
Nemokosch | RAKUDO_RAKUAST is the environment variable to enable the new frontend | ||
ab5tract | It seems like new RakuAST patches are landing directly in main | 17:38 | |
Nemokosch++ | |||
nine | RAKUDO_RAKUAST=1 ./rakudo-m -Ilib t/05-messages/03-errors.t | ||
[Coke] | Yes, AST is now on main. | 17:39 | |
Nemokosch | I wonder when the next Rakudo class will be held. It's getting quite useful 👁️ | ||
or is there some predetermined schedule that I missed? :cameliathink: | 17:40 | ||
Voldenet | btw, regarding the constructors from the blogpost 5ab5traction5.bearblog.dev/i-raku-...structors/ | 17:42 | |
I wonder why can't you just instantiate the class by calling its class name | |||
m: class X { has $.y; }; say X(:3y); | |||
camelia | No such method 'CALL-ME' for invocant of type 'X' in block <unit> at <tmp> line 1 |
||
Voldenet | m: class X { has $.y; }; say X.new(:3y); | 17:43 | |
camelia | X.new(y => 3) | ||
Voldenet | it's obviously more verbose in a lot of cases where nested structures are needed | ||
ab5tract | nine: so are you going to leave the subset thingy alone? I'll pick it up and try to do something with it | ||
nine | Have fun with it! | ||
Nemokosch | something that has tempted me for a while is proper default values for different types of sigils (& in particular) | 17:45 | |
honestly I have spent way too much time on not noticing that I forgot setting the new frontend, and wondering where it got fixed 😅 | |||
17:46
xinming joined
|
|||
Nahita | can i get a hold on nqp:: things? like my &fun = &nqp::exp kind of thing | 17:47 | |
i guess they are not functions but something else... | 17:48 | ||
ab5tract | Voldenet: I think that's because of old coercion expectations? | 17:49 | |
Nahita | that should have been exp_n in the example sorry, but it's an example | ||
ab5tract | m: say Int(7,5) | ||
camelia | 2 | ||
ab5tract | m: say Int(7.5) | ||
camelia | 7 | ||
Nemokosch | these are also something to fix in RakuAST iirc | 17:50 | |
Voldenet | ab5tract: that makes sense, but constructor is more frequently used | ||
Nemokosch | these are not actual functions | ||
Voldenet | though it probably can't be implemented now without breaking compatibility | ||
Nemokosch | basically handled on syntax level | ||
ab5tract | definitely. but I think that it was a semantic distinction that was made long ago | ||
Nemokosch: You are referring to the coercers? | 17:51 | ||
tellable6 | ab5tract, I'll pass your message to Nemokosch | ||
Nemokosch | yep | ||
ab5tract: maybe you know this but finanalyst is mostly busy with the documentation site these days so your GTK::Simple might have to wait for the situation to get looser ^^ | 17:54 | ||
[Coke] | multi method post(URI $uri is copy, %form , Bool :$bin, *%header) { | 17:55 | |
^^ if I have a %foo hash, how do I pass this in to the *%header arg? | |||
Nemokosch | |%foo maybe? | 17:56 | |
Voldenet | m: multi sub post($uri is copy, %form , Bool :$bin, *%header) { say %header }; post("uri", {}, :bin, |{ content-type => "binary/garbage" }) | 17:59 | |
camelia | {content-type => binary/garbage} | ||
18:00
reportable6 left
|
|||
Voldenet | m: my %foo = content-type => "binary/garbage"; multi sub post($uri is copy, %form , Bool :$bin, *%header) { say %header }; post("uri", {}, :bin, |%foo) | 18:00 | |
camelia | {content-type => binary/garbage} | ||
Nemokosch | Nahita also asked a really interesting question that I'm not at all qualified to answer... | 18:01 | |
> can i get a hold on nqp:: things? like my &fun = &nqp::exp kind of thing | |||
18:01
sena_kun left
|
|||
but maybe somebody does know? | 18:01 | ||
something rings a bell about "nqp ops" | 18:02 | ||
Xliff | See the link I posted... | ||
github.com/raku/nqp/blob/master/do...s.markdown | |||
Note: That document is stale. | 18:03 | ||
18:03
reportable6 joined
|
|||
Nemokosch | "could use some sprucing up" 😄 another thing that seems easier to address after a few more Rakudo classes | 18:03 | |
18:04
tg57 joined
|
|||
Xliff | How can one take a RakuAST tree to bytecode? | 18:04 | |
18:04
sena_kun joined
|
|||
nine | nqp:: ops are not functions, they are low level ops | 18:04 | |
They cannot be referenced. | 18:05 | ||
Voldenet | nahita: I know that you can get hold on nqp:: things if you don't mind a few more allocations | ||
tellable6 | Voldenet, I'll pass your message to Nahita | ||
Voldenet | m: use nqp; my &s = -> int32 $x { nqp::say($x) }; s(42) | ||
camelia | 42 | ||
Voldenet | m: use nqp; my &s = -> $x { nqp::say(nqp::unbox_i($x)) }; s(42) | 18:07 | |
camelia | 42 | ||
[Coke] | thanks | 18:08 | |
I would say ops.markdown is more incomplete than stale, but yes. | 18:09 | ||
definitely a documentation gap | |||
Nemokosch | > How can one take a RakuAST tree to bytecode? | 18:15 | |
Xliff indeed touched the heart of the problem, I wish I knew that at least | 18:16 | ||
Xliff | Nemokosch - The next question then would be: How would one run said bytecode | 18:21 | |
As near as I can tell, a loader is basically: A routine that loads the main parsed script, loads the bytecode of all of the modules, loads the bytecode of the setting, and then executes the bytecode of the script. | 18:22 | ||
nine | ab5tract: a very useful technique is also to run a code example with --target=ast on the old compiler and with --target=qast on the new one and compare outputs. That's btw. what makes working on RakuAST fun: the result is usually very well specified. | ||
Xliff | I would appreciate knowing how right or wrong I am with the above explanation. | 18:23 | |
Nemokosch | there is IMPL-TO-QAST on RakuAST nodes, that much is for sure | 18:27 | |
Nahita | thanks | 18:30 | |
18:30
raschip left
18:33
dakkar left,
pingu left
18:49
snonux joined,
snonux_ joined
|
|||
lizmat | nine: is Xliff correct? I think he is... | 18:52 | |
ab5tract | nine: So there's a lot of stuff that is used in the subset grammar that isn't available in Raku/Grammar . A bunch of dynamic variables and a method about docs | 18:54 | |
Do I just ignore these things while re-implementing? | 18:55 | ||
19:09
NemokoschKiwi joined
|
|||
nine | lizmat: maybe on a first glance. But not really | 19:15 | |
ab5tract: I usually do. Ignore everything about docs/pod. Ignore variables until you know what they are actually needed for. | |||
Often we actually don't need them anymore, because the information they are supposed to carry through actions code is now conveyed by the AST itself | 19:16 | ||
19:26
abraxxa-home joined
|
|||
Xliff | nine: Can you give me a high level description of what is necessary? | 19:30 | |
nine | I could, but I will stay away from this. | 19:32 | |
19:35
abraxxa-home left
|
|||
Xliff | nine: Can I ask why? | 19:35 | |
Or at least tell me someone else who can? | 19:36 | ||
nine | Because helping you carries too much risk of getting shouted at again. So I prefer to do something else instead. | 19:48 | |
Xliff | nine: Firstly, I wasn't shouting. I was emphasizing. My use of caps is for emphasis. | 19:49 | |
nine: And you do not have to help me. I am asking you for advice. If you can't or don't want to help please point me to someone who can. | 19:50 | ||
nine | I definitely felt shouted at and I can do very well without that. | ||
Xliff | If you felt shouted at, that is on you. When this started, I explained then that it was for emphasis. | ||
I cannot control how you feel. | |||
And as a volunteer, I am passionate about my work and my contributions to raku. | 19:51 | ||
ab5tract | Is there a `dd` equivalent for nqp? | 19:52 | |
Xliff | Your comments about my thoughts for improving CURI were belittling. | ||
You completely ignored the use case. | |||
And now, I am offering to volunteer more work to the Raku community. | 19:53 | ||
And I am asking for your assistance. | |||
As a fellow volunteer. | |||
I would like to move away from past mistakes. | 19:54 | ||
Can we do that? | |||
Nemokosch | ab5tract: I'm taking you already know about nqp::say? | ||
nine | ab5tract: not really. What I did for debug statements was adding nqp::bindhllsym('nqp', 'note', ¬e); to the end of nqp's src/core/IO.nqp. Then I can use nqp::gethllsym('nqp', 'note')("I'm here"); for my debug prints. That gets around the whole bootstrap issue thing with neither Raku's nor NQP's IO functions being available. | 19:55 | |
Voldenet | there's nqp::say, but dd is implemented on Any github.com/rakudo/rakudo/blob/4b26...y.pm6#L541 | ||
nine | ab5tract: you can print strings and stringify stuff in a limited way. $foo.HOW.name($foo) is very useful as replacement for $foo.^name | 19:56 | |
Xliff | nine: Or are you stating that you are willing to prevent more volunteers to contribute to this language because of how you feel about them? | 19:57 | |
It's not about you. Or me. It's about Raku. | 19:58 | ||
And that's a damned chilling piece of behavior for a member of the RSC. | |||
nine | I'm just protecting myself. I'm pretty sure I already contribute enough, so I don't have to take risks on top of that. And if me protecting myself makes me unfit for a seat on the RSC, I'd be happy to leave that to some other volunteer. | 19:59 | |
Xliff | nine: I am not a threat. Not to you or anyone else. | 20:00 | |
And it's not a matter of how much you contribute. | |||
Nemokosch | talking about "egoless programming"... | ||
Xliff | I have almost 1,000,000 of unreleased Raku projects due to the affore mentioned problem with CURI. | 20:01 | |
I'd like to be releasing those. | |||
However I cannot... PRECISELY because the UX of installing would be less than ideal. | |||
If I did release them, I'd have the top 18 largest projects in the ecosystem. | |||
And I asked for a "high level description" of the module loader. How are you risking anything from providing one? | 20:03 | ||
And again. If you are unwilling to volunteer this information. Please volunteer the name of someone else who can? | |||
Please note, I an not saying that I am better than you. I am not. | 20:08 | ||
Your continued work on RakuAST is worthy of the utmost respect. | |||
Which you have. | |||
However today's behavior dilutes it a little. | |||
Nemokosch | meh, leave it, you are not getting anywhere | 20:10 | |
the situation is unfortunate but ultimately the only chance is to get more people involved, and hope that the diversity would increase | 20:11 | ||
nine | It's simple: since you deny doing any harm, there is no reason to believe, that you will do any better in the future. So I have to go on the assumption that if at any point you don't like the solution I suggest you get argumentative and hot and will end up shouting again. And that is just not why I'm active in the Raku community. If I wanted that I could at least get paid for it. Don't have to do that in my | 20:12 | |
spare time. | |||
Xliff: I certainly did not intend to belittle you. I'm sorry for coming across that way and for making you feel bad. I can have that effect despite completely different intentions. | 20:20 | ||
20:23
dogbert17 joined
|
|||
Xliff | nine: You did. I got excitable. I felt like you were insulting my suggestions for CURI improvements. | 20:25 | |
Again with the feels. | |||
So in that spirit... please realize that when I use caps I am using them for emphasis. I never intended for you to take it as shouting. | 20:26 | ||
I did not, and never intended, to shout at you. | 20:27 | ||
er... | |||
20:27
dogbert17 left
|
|||
Xliff | s/intended, to/intended to,/ | 20:28 | |
nine | Well, all's well that ends well I guess :) | 20:29 | |
Xliff | nine: I guess. :) | 20:30 | |
nine | Btw. these are the conventions I grew up with: *bold*, _underlined_, /italic/, SHOUTED | ||
Xliff | Noted. I will use those. | ||
But please do give me a bit of latitude. Old habbits and all... | 20:31 | ||
s/habbits/habits/ | |||
nine | I just looked it up in MoarVM source code: loadbytecodebuffer is the op for loading a comp unit from an in-memory buffer | ||
Xliff | That's as far as I got. Thanks for the reference. | 20:32 | |
nine | CompUnit::Loader.load-precompilation is a Raku wrapper around that | ||
Xliff | If it will help, can I ask this in problem-solving so it can be documented and you... or someone else... can answer at their leisure? | ||
nine | I don't know why, but the likelyhood of getting something out of me is higher on IRC than on github. I think it's because here I can just throw half an answer in and elaborate when the inevitable questions arise. On github or email I feel compelled to give a well thought out, complete answer which feels like it would take a lot of time and I let myself get distracted | 20:34 | |
If I were keen on storing modules in some database, I'd write a CompUnit::PrecompilationStore or maybe even a CompUnit::Repository with that kind of backend. | 20:39 | ||
Xliff | Fair enough. But I am more concerned with module loading. | ||
When you get a chance, can you write a quick paragraph sized description of what the loader does? | 20:40 | ||
I can take it from there. | |||
Nemokosch | 🧠 | 20:42 | |
cdn.discordapp.com/attachments/633.../image.png | |||
lizmat | Xliff: this is an area where none of the current core developers have spent a lot of time: I think you'll need to look at the source code | 20:50 | |
Xliff | lizmat: *sigh* | 20:51 | |
lizmat | Xliff: sorry, but we would all have to spend time looking at it | ||
for me, it's at least 2 years ago since I really looked at that | 20:52 | ||
ab5tract | In terms of $*W / $world, I take it that we are making a different approach in RakuAST. example: the old subset code in Actions uses `dissect_longname`. I assume there is something similar available already in RakuAST-land, but if not, where does it go? Onto one of these IMPL- style methods I see everywhere? | 20:55 | |
Xliff | lizmat: Oh, no worries. No need to apogize. | ||
lizmat | ab5tract: World.nqp will not exist in Raku land | 20:56 | |
so no $*W either | |||
Xliff | It's just that I have so much Copious Spare Time™! </snark> | ||
lizmat | well... same for me: some people want me also to write a RakuAST blog post :-) | 20:57 | |
Xliff | LOL! ;) | 20:58 | |
nine | ab5tract: all that is now taken care of by the RakuAST::Name nodes. $*W is gone | 20:59 | |
21:00
ispyhumanfly left
|
|||
nine | Xliff: I don't think I can write that paragraph, because I don't understand well enough what you need. | 21:01 | |
Xliff | nine: OK. Then maybe this is something for problem-solving. I may need to write down my thoughts in a concise manner. | 21:02 | |
I have to /away now. I have other things to take care of. | 21:03 | ||
Xliff ... away & | |||
21:03
Xliff left
|
|||
Voldenet | in raku you are only allowed to shout when you're catching an exception | 21:06 | |
(there are more phasers, but I've ignored them for the sake of the joke) | 21:07 | ||
Nemokosch | Voldenet: I have an interesting bug for you | 21:12 | |
m: multi sub bar (str $s) { say "voila" }; bar("abc") | 21:13 | ||
Raku eval | Exit code: 1 Cannot resolve caller bar(Str:D); none of these signatures matches: (str $s) in block <unit> at main.raku line 1 | ||
Nemokosch | this... kinda makes sense, right? A native str is not quite a Raku Str that we're passing. So far, so good. | ||
I'm going to change only one thing in the function body | |||
a really simple change | 21:14 | ||
Voldenet | say "abc"? :) | ||
Nemokosch | m: multi sub bar (str $s) { "voila".say }; bar("abc") | ||
Raku eval | voila | ||
Nemokosch | and it works | ||
Voldenet | Wait, what | ||
Nemokosch | yes | 21:15 | |
MVM_SPESH_DISABLE=1 is the right env to turn the spesh off, right? | |||
because it really seems that this keeps happening even with the spesh off | 21:16 | ||
which leaves me as clueless as a bat in the microwave oven | |||
ab5tract | Okay, so my initialization of a name variable in Actions could look like: `my $name := self.r('Name').new($<longname>)` ? | 21:25 | |
21:27
ispyhumanfly joined
|
|||
ab5tract | Nemokosch: I wish MVM_SPESH_DISABLE noted its existence somewhere in the run output | 21:27 | |
tellable6 | ab5tract, I'll pass your message to Nemokosch | ||
Nemokosch | yep, that would be nice | 21:28 | |
Voldenet | you can easily verify it | ||
21:28
NemokoschKiwi left
|
|||
Voldenet | MVM_SPESH_LOG=eh MVM_SPESH_DISABLE=True raku whatever | 21:29 | |
with disabled spesh log will be empty | |||
btw, I can break it back again for you | |||
m: multi sub bar (str $s) { "voila".&say }; bar("abc") | |||
camelia | Cannot resolve caller bar(Str:D); none of these signatures matches: (str $s) in block <unit> at <tmp> line 1 |
||
Nemokosch | 🧠 | ||
21:31
ispyhumanfly left
|
|||
Voldenet | m: multi sub bar (str $s) { .say }; bar("abc") | 21:38 | |
camelia | Cannot resolve caller bar(Str:D); none of these signatures matches: (str $s) in block <unit> at <tmp> line 1 |
||
Voldenet | this makes you think, doesn't it | ||
you can remove or add some characters to get the same output | 21:39 | ||
nine | Have you tried running it with rakudo --optimize=0 ? | ||
nine@sphinx:~/rakudo (main =)> rakudo -e 'multi sub bar (str $s) { "voila".say }; bar("abc")' | 21:40 | ||
21:40
snonux_ left,
snonux left
|
|||
nine | voila | 21:40 | |
nine@sphinx:~/rakudo (main =)> RAKUDO_RAKUAST=1 ./rakudo-m -e 'multi sub bar (str $s) { "voila".say }; bar("abc")' | |||
Cannot resolve caller bar(Str:D); none of these signatures matches: | |||
nine@sphinx:~/rakudo (main =)> rakudo --optimize=0 -e 'multi sub bar (str $s) { "voila".say }; bar("abc")' | 21:41 | ||
Cannot resolve caller bar(Str:D); none of these signatures matches: | |||
21:41
snonux joined
21:42
snonux_ joined
|
|||
Voldenet | in fact, say isn't necessary | 21:42 | |
Nemokosch | going from optimize=1 to optimize=2 seems to be the entry point of this bug | 21:43 | |
Voldenet | m: sub do-not-say($x) { }; multi sub bar(str $s) { do-not-say "voila" }; bar("abc") | ||
camelia | Cannot resolve caller bar(Str:D); none of these signatures matches: (str $s) in block <unit> at <tmp> line 1 |
||
Nemokosch | XDD | ||
m: sub do-not-say($x) { }; multi sub bar(str $s) { "voila" }; bar("abc") | |||
Raku eval | |||
Nemokosch | liar... | ||
Voldenet | I mean, any subroutine triggers this bug | ||
Nemokosch | arguably the subroutines were the right behavior - or intended, at the very least | 21:44 | |
the idea is that str and Str should be separately dispatchable | 21:45 | ||
21:47
MoC joined
|
|||
Voldenet | Yes, most likely so | 21:47 | |
m: sub do-not-say($x) { }; multi sub bar(str $s) { do-not-say "voila" }; bar(my str $ = "abc") | |||
camelia | ( no output ) | ||
21:49
lichtkind left
|
|||
Nemokosch | also, only subs do upgrade strs to Strs which is I'd say a pragma > dogma choice | 21:49 | |
but none of that has anything to do with poor optimizer messing up signatures 😦 | |||
nine | My guess is the static inliner is to blame. Seems to think this sub can be inlined when it shouldn't | 21:50 | |
Yes, pretty clear when comparing output of --target=ast with --target=optimize | 21:52 | ||
Nemokosch | ha, don't underestimate the value of these little hints of where you are looking for clues | 21:53 | |
Voldenet | either way, RakuAST have fixed this already :) | 21:56 | |
Nemokosch | because it has no optimizer I think | 21:57 | |
so yeah, it fixed it by the implicit --optimize=0, lol | |||
ab5tract | nevermind my last question, it's obvious that $<longname> comes in "as" a RakuAST::Name | 22:05 | |
This is some pretty brain-bendy stuff though | |||
22:08
rf left
22:12
NemokoschKiwi joined
|
|||
NemokoschKiwi | .seen thundergnat | 22:12 | |
tellable6 | NemokoschKiwi, I saw thundergnat 2023-01-30T00:24:54Z in #raku: <thundergnat> *your | ||
NemokoschKiwi | thundergnat: are you around by any chance? | 22:13 | |
tellable6 | NemokoschKiwi, I'll pass your message to thundergnat | ||
22:15
tg57 left
22:16
NemokoschKiwi left
22:22
pingu joined
|
|||
pingu | . | 22:22 | |
22:27
ab5tract left
22:31
MoC left
22:36
NemokoschKiwi joined
|
|||
NemokoschKiwi | weekly: 5ab5traction5.bearblog.dev/i-raku-...structors/ | 22:36 | |
notable6 | NemokoschKiwi, Noted! (weekly) | ||
22:36
NemokoschKiwi left
22:37
ispyhumanfly joined
|
|||
pingu | can raku jump out of code early | 22:40 | |
so like GOTO | |||
but only used to jump forwards not back | |||
Nemokosch | like... return? or what do you mean | 22:43 | |
22:46
ispyhumanfly left
|
|||
pingu | kinda | 22:52 | |
I have a bunch of non nested if statements, if one is false it should quit the whole program not skip to the next if statement | 22:53 | ||
err, if one is true* | |||
if one is true quit the program otherwise jump to the corresponding else statement# | 22:54 | ||
also there isnt a function to return from | |||
22:56
sena_kun left
|
|||
pingu | if (@x[0][0] ne chr(32)) { exit(); }else{ #'{do stuff}`} if (@x[0][1] ne chr(32)) { exit(); }else{ #'{do stuff}`} | 22:57 | |
like that | |||
so kinda like break; | |||
just exiting until label that is below all of the if statements is fine | 22:58 | ||
exiting to a label* | |||
from there I can just have the program end by typing nothing | |||
docs.raku.org/type/Label | |||
23:00
rf joined
|
|||
Nemokosch | idk if this works with non-loops though | 23:01 | |
a hack could be to throw and CATCH | 23:02 | ||
quite an ugly hack tbh | |||
Voldenet | control flow exceptions are not that hacky | ||
python uses that approach excessively everywhere | 23:03 | ||
however imo the best way is creating a subroutine inside of your subroutine with some code that returns | 23:04 | ||
pingu | if (@x[0][0 ] eq chr(32) or @x[0][0 ] eq chr(9)){last END}else{print(@x[0][0 ], "\n");} | 23:06 | |
if (@x[0][1 ] eq chr(32) or @x[0][1 ] eq chr(9)){last END}else{print(@x[0][1 ], "\n");} | |||
END: | |||
this isnt real code im just messing around | |||
Voldenet | m: sub thing { for ^$^i -> $num { sub process-one { return if $num %% 2; return if $num %% 3; say $num }; process-one } }; thing(42) | 23:07 | |
camelia | 1 5 7 11 13 17 19 23 25 29 31 35 37 41 |
||
Voldenet | or even | 23:09 | |
m: sub thing { for ^$^i -> $num { sub { return if $num %% 2; return if $num %% 3; say $num }() } }; thing(42) | |||
camelia | 1 5 7 11 13 17 19 23 25 29 31 35 37 41 |
||
Voldenet | in this case there's only one variable captured, so it's easy to refactor this outside of this scope, but it's not always the case | ||
Nemokosch | control flow exceptions are a surprisingly bad decision in Python xD | 23:11 | |
Voldenet | coroutines are utterly horrible thanks to that :) | 23:12 | |
pingu | even goto is bad in C (unless you use it to only jump forwards | ||
and polymorphism | |||
though that is sometimes useful if you dont care about debugability | 23:13 | ||
like in skyfall :p | |||
can raku do polymorphism? | |||
Voldenet | Yes | 23:14 | |
m: class X is Exception {}; sub t { $^n %% $^t and X.new().throw }; sub thing { for ^$^i -> $num { CATCH { when X { next } }; t($num, 2); t($num, 3); say $num }; }; thing(42) | 23:15 | ||
camelia | 1 5 7 11 13 17 19 23 25 29 31 35 37 41 |
||
Voldenet | the same code as above, but with exceptions, it's useful if "return" statement needs to be deeply nested | 23:16 | |
23:16
thundergnat_ joined
|
|||
thundergnat_ | . | 23:16 | |
tellable6 | 2023-01-31T22:13:47Z #raku <NemokoschKiwi> thundergnat: are you around by any chance? | ||
thundergnat_ | I am now... | ||
My available time for IRC is very sporadic, though I read the logs pretty regularly. | 23:17 | ||
Nemokosch | it was just "unbuffered terminal" stuff, you know, not many people I could think of | 23:18 | |
23:19
lichtkind joined
|
|||
what I didn't know is that ab5tract also had a fair share of low-level terminal work so the "original poster" found what they wanted to know | 23:19 | ||
thundergnat_ | Ah. 👍 | 23:20 | |
Nemokosch | sometimes it seems more effective to try to "chase someone down" specifically than to be like "anybody who might know about unbuffered terminal, feel addressed", haha | ||
thundergnat_ | Sadly my unbuffered terminal knowledge is mostly gained by trying dozens, if not hundreds of things that didn't work. When I finally stumbled across something that did, I wrote it down. | 23:23 | |
pingu | heres what I mean onlinegdb.com/Z4AxRK4HG | ||
the code above I don't understand yet :| | 23:24 | ||
it works tho | |||
23:24
tg57 joined
|
|||
pingu | so im not sure how to change it to suit the rest of my code | 23:24 | |
Nemokosch | don't worry, Voldenet has a thing for baroque code | 23:26 | |
anyway, if you have a justified reason to do this, you might actually throw an exception or return | 23:29 | ||
this is also a priceless post 5ab5traction5.bearblog.dev/fixing-...s-windows/ | 23:45 | ||
so many people wish they knew it... | |||
23:48
simcop2387 left
23:49
perlbot left,
tg57 left
23:53
simcop2387 joined,
perlbot joined
23:54
ispyhumanfly joined
23:58
ispyhumanfly left
|