00:17:28 | * | nerthus left #nim (Doei!) |
00:46:31 | * | Guest97 joined #nim |
00:57:33 | * | Zectbumo_ quit (Remote host closed the connection) |
01:05:27 | * | noeontheend quit (Ping timeout: 276 seconds) |
01:10:40 | * | Guest97 quit (Quit: Client closed) |
01:15:07 | FromDiscord | <Zectbumo> Why does nim -c compileToC t.nim make a nimcache and then I delete the folder and delete the executable and re run the command it doesn't create the nimcache files anymore? What is causing it to work once and then continue to fail afterwards? |
01:48:21 | FromDiscord | <!Patitotective> In reply to @hmmm "yes pls, uncle hmm": like this? lol https://media.discordapp.net/attachments/371759389889003532/973038685564076032/unknown.png |
02:20:59 | * | noeontheend joined #nim |
02:21:33 | FromDiscord | <theangryepicbanana> according to the manual, https://nim-lang.org/docs/manual_experimental.html#strict-not-nil-checking-nil should work and be implemented, but as of the current version of nim it is not |
02:21:47 | FromDiscord | <theangryepicbanana> anyone know why? |
02:22:48 | FromDiscord | <Elegantbeef> What do you mean? |
02:23:35 | FromDiscord | <theangryepicbanana> if I have `type A = ref int not nil`, then `A nil` should remove the `not nil` part but currently does not |
02:23:55 | FromDiscord | <theangryepicbanana> and instead, it gives an error |
02:27:08 | FromDiscord | <Elegantbeef> Seems it's `nil(A)` |
02:27:31 | FromDiscord | <theangryepicbanana> huh, weird |
02:27:32 | FromDiscord | <theangryepicbanana> thanks |
02:27:37 | FromDiscord | <Elegantbeef> sent a code paste, see https://paste.rs/BWF |
02:28:20 | FromDiscord | <Elegantbeef> I mean it makes more sense than `A nil` since that's just a type conversion from Nil |
02:28:48 | FromDiscord | <Elegantbeef> I dont know if it's correct just that it compiles |
02:31:43 | FromDiscord | <theangryepicbanana> yeah it seems to work |
02:33:03 | * | arkurious quit (Quit: Leaving) |
02:46:10 | FromDiscord | <theangryepicbanana> are you not able to have object values inside of non-objects? |
02:46:18 | FromDiscord | <theangryepicbanana> (edit) "non-objects?" => "object refs?" |
02:46:24 | FromDiscord | <Elegantbeef> What? |
02:46:55 | FromDiscord | <Yardanico> waiting for pmunch to wake up to tell him some futhark windows bugs :P i mostly managed to find fixes for them, but there's one libclang issue (I think) about filenames sometimes containing / instead of \\ on Windows which breaks some futhark logic |
02:47:09 | FromDiscord | <theangryepicbanana> for example, I have a ref object with a field of a Table value, there's no initial error, but when I go to use said ref object somewhere else, I get an error |
02:47:47 | FromDiscord | <Elegantbeef> Min code? |
02:47:58 | FromDiscord | <theangryepicbanana> sent a code paste, see https://play.nim-lang.org/#ix=3XkU |
02:48:06 | FromDiscord | <theangryepicbanana> this errors at `f` |
02:48:07 | FromDiscord | <Elegantbeef> `Foo` is nil by default |
02:48:14 | FromDiscord | <theangryepicbanana> yes |
02:48:28 | FromDiscord | <theangryepicbanana> but it errors because of the table, as the error goes away when I comment out the table field |
02:48:29 | FromDiscord | <Elegantbeef> That compiles fine |
02:48:38 | FromDiscord | <theangryepicbanana> hmm |
02:48:46 | FromDiscord | <theangryepicbanana> maybe it's a nimlsp issue? |
02:48:57 | FromDiscord | <Elegantbeef> Probably nimsuggest false positive |
02:49:08 | FromDiscord | <theangryepicbanana> cool, how do I disable this? |
02:49:33 | FromDiscord | <theangryepicbanana> this is also probably why I couldn't create a ref to an alias to a table |
02:51:20 | FromDiscord | <huantian> disable nimsuggest? |
02:51:32 | FromDiscord | <theangryepicbanana> disable this specific kind of error |
02:51:37 | FromDiscord | <theangryepicbanana> clearly it's an editor issue |
02:51:48 | FromDiscord | <Elegantbeef> It's a bug |
02:51:54 | FromDiscord | <theangryepicbanana> pog |
02:51:57 | FromDiscord | <Elegantbeef> Nimsuggest has a bug right now in 1.6+ |
02:52:06 | FromDiscord | <theangryepicbanana> easily fixed or long term? |
02:52:18 | FromDiscord | <Elegantbeef> I mean i have a bodge fix but no proper fix |
02:52:33 | FromDiscord | <theangryepicbanana> what's the cause? |
02:52:53 | FromDiscord | <Elegantbeef> It recreates types/symbols instead of looking if the symbol/type exists. Which means there are multiple reference that are not the same so `==` doesnt work on them |
02:53:04 | FromDiscord | <theangryepicbanana> ah |
02:53:05 | FromDiscord | <Elegantbeef> That's if it is the issue i think it is |
02:53:23 | FromDiscord | <Elegantbeef> The bodge fix is here https://github.com/nim-lang/Nim/pull/19748/files |
02:53:23 | FromDiscord | <theangryepicbanana> that would probably just be fixed using a cache, yeah? |
02:53:31 | FromDiscord | <Elegantbeef> Well no |
02:53:58 | FromDiscord | <Elegantbeef> The issue is that it regenerates the types/symbols, the solution is to look if they exist prior on nimsuggest and if they match |
02:54:04 | FromDiscord | <Elegantbeef> If so reuse the old ones then carry one |
02:54:14 | FromDiscord | <theangryepicbanana> yeah that's essentially what a cache does |
02:54:20 | FromDiscord | <Elegantbeef> So i guess that's a "cache" but not what i'd consider one |
02:56:06 | FromDiscord | <theangryepicbanana> how soon do you think the "fix" will be merged/released? |
02:56:47 | FromDiscord | <Elegantbeef> If i get a non bodge fix whenever that is otherwise never |
02:57:23 | FromDiscord | <theangryepicbanana> great |
02:57:37 | FromDiscord | <Elegantbeef> I mean it's a bodge fix it's not proper in any regard |
02:57:50 | FromDiscord | <Elegantbeef> The best thing you can do is build nimsuggest/nimlsp with that bodge |
02:58:48 | FromDiscord | <theangryepicbanana> hmm perhaps |
02:59:27 | FromDiscord | <Elegantbeef> I know where the issue comes from but am not certain how to fix i |
03:00:35 | FromDiscord | <theangryepicbanana> maybe I'll look at it idk, not familiar with either codebase |
03:01:33 | FromDiscord | <theangryepicbanana> unsure if it helps, but the errors temporarily go away if you save in the file that the "repeated symbols" come from |
03:01:35 | FromDiscord | <Elegantbeef> It's possibly unrelated to that |
03:01:46 | FromDiscord | <Elegantbeef> I just assume it's related |
03:06:01 | * | stkrdknmibalz joined #nim |
03:16:06 | FromDiscord | <Elegantbeef> @theangryepicbanana\: if you do get a min repro do send it to me |
03:16:28 | FromDiscord | <theangryepicbanana> In reply to @Elegantbeef "<@356108561232953344>\: if you do": will do |
03:30:24 | * | noeontheend quit (Ping timeout: 276 seconds) |
03:40:19 | FromDiscord | <Yardanico> finally https://media.discordapp.net/attachments/371759389889003532/973066859597430794/unknown.png |
03:40:29 | FromDiscord | <Yardanico> sciter with nim on windows |
03:49:23 | * | xet7 joined #nim |
03:53:58 | FromDiscord | <spoon> saw that looking into html UIs, how good is nim-ui interop compared to something like neel? |
03:54:41 | FromDiscord | <spoon> (i didnt see bindings for sciter, just sciter itself) |
03:55:17 | FromDiscord | <Yardanico> In reply to @spoon "saw that looking into": i mean, my current sciter bindings are pretty bare-bones, but it's possible to do stuff with them |
03:55:34 | FromDiscord | <Yardanico> in Sciter you can develop your app all through native code or leave the UI logic to JS (previously they used TIScript) |
03:55:41 | FromDiscord | <Yardanico> the latter is much better because UI logic is asynchronous and stuff |
03:55:48 | FromDiscord | <Yardanico> so you can only register some native functions that you want to call |
03:56:06 | FromDiscord | <Yardanico> compare https://github.com/Yardanico/nsciter/blob/master/examples/repl/repl1.nim and https://github.com/Yardanico/nsciter/blob/master/examples/repl/repl2.nim |
03:56:17 | FromDiscord | <Yardanico> (and check the corresponding .htm files as well) |
03:56:19 | FromDiscord | <spoon> can you register a nim procedure as a button press without javascript? |
03:56:24 | FromDiscord | <Yardanico> yes |
03:56:36 | FromDiscord | <Yardanico> again, you can mostly do anything through native code only, but it'll be more verbose |
03:56:47 | FromDiscord | <spoon> ah good, sounds like something ive been looking for |
03:57:20 | FromDiscord | <Yardanico> but again, the bindings i have are really rough, there is no high level stuff at all :) they're based on much much much older sciter bindings of someone else, I've changed quite some stuff in them |
03:57:33 | FromDiscord | <Yardanico> https://github.com/citrusn/nsciter is the original |
03:57:35 | FromDiscord | <spoon> ah |
03:57:43 | FromDiscord | <Yardanico> and they forked from sciter-sdk/nsciter |
03:58:14 | FromDiscord | <spoon> oh, they have an official nim repo? |
03:58:20 | FromDiscord | <Yardanico> yes, but again, it's been abandoned for years |
03:58:27 | FromDiscord | <Yardanico> maybe i will upstream my nsciter to there in the future |
03:58:43 | FromDiscord | <spoon> kinda expected but still cool |
03:59:07 | FromDiscord | <Yardanico> but yeah, sciter isn't actually that hard to wrap, it has a nice C FFI with one big interface-style object that has different function pointers, and you just call into that |
03:59:18 | FromDiscord | <Yardanico> original sciter-sdk nsciter was done with manual wrapping |
03:59:29 | FromDiscord | <Yardanico> my nsciter was initially based on nimterop, and recently i've changed it to use futhark |
03:59:56 | FromDiscord | <Yardanico> but I just save the resulting generated files anyway so the end user doesn't need to have futhark or any libclang stuff installed |
04:00:20 | FromDiscord | <Elegantbeef> The way to live π |
04:00:57 | * | lumo_e quit (Ping timeout: 276 seconds) |
04:01:07 | FromDiscord | <Elegantbeef> I do kinda wish we could do like `writeTo "wasmedge/futharked.nim"` π |
04:02:00 | FromDiscord | <Yardanico> but yeah, to be honest I haven't yet made anything with nsciter myself, it's just like a toy project where I fix some stuff from time to time |
04:02:13 | FromDiscord | <Yardanico> but at least I have proper SciterValue binding with destructors, sinks and all that stuff |
04:02:19 | FromDiscord | <Elegantbeef> It's the russian GUI library afaict π |
04:02:32 | FromDiscord | <Yardanico> he emigrated to canada in 90s :) |
04:02:55 | FromDiscord | <Elegantbeef> I more joke that a lot of russian relayed tools use it |
04:03:05 | FromDiscord | <Yardanico> but yeah, it's an interesting lib in that it's actually really popular (basically all AVs use it, TeamViewer, etc), but not well-known |
04:03:14 | FromDiscord | <Elegantbeef> Doesnt gaijan use it for theirs? |
04:03:16 | FromDiscord | <Yardanico> well-known in general, compared to other gui frameworks |
04:03:21 | FromDiscord | <Yardanico> In reply to @Elegantbeef "Doesnt gaijan use it": only for the launcher, yes |
04:03:28 | FromDiscord | <Yardanico> war thunder's launcher, maybe others too |
04:03:44 | FromDiscord | <Yardanico> i checked teamviewer binary myself and there are sciter strings in there |
04:03:58 | FromDiscord | <Yardanico> they all pay for it so they can statically link :P |
04:04:03 | FromDiscord | <Yardanico> and have access to the actual source code |
04:04:24 | FromDiscord | <Elegantbeef> Free forces dynamic linking? |
04:04:43 | FromDiscord | <Yardanico> yes, they only give you sciter.dll (or similar stuff for other platforms) with no warranty |
04:04:49 | FromDiscord | <Yardanico> https://gitlab.com/sciter-engine/sciter-js-sdk |
04:05:16 | FromDiscord | <Yardanico> and you must state the fact that you use sciter in your app (in About menu or similar) |
04:07:32 | FromDiscord | <Yardanico> I think if it was open-source it'd probably be really popular, even more than it is already |
04:07:55 | FromDiscord | <Yardanico> because it's really HTML/CSS for desktop applications done right |
04:08:41 | FromDiscord | <Yardanico> the DLL and .so are literally ~8-10mb and this is everything that sciter offers, it has its own custom html, css engines, etc |
04:08:49 | FromDiscord | <Yardanico> although yeah, Sciter's CSS is not fully compatible with normal CSS |
04:09:05 | FromDiscord | <Yardanico> its HTML is compatible, but there are some Sciter-specific HTML extensions (mostly sugar stuff) |
04:25:56 | FromDiscord | <icewater200> is nim h |
04:48:27 | * | slowButPresent quit (Quit: leaving) |
05:04:06 | * | ecs quit (*.net *.split) |
05:04:06 | * | mjsir911 quit (*.net *.split) |
05:04:06 | * | LyndsySimon quit (*.net *.split) |
05:04:14 | * | ecs joined #nim |
05:04:20 | * | mjsir911 joined #nim |
05:04:21 | * | mjsir911 quit (Changing host) |
05:04:21 | * | mjsir911 joined #nim |
05:04:23 | * | LyndsySimon joined #nim |
05:11:30 | * | adium quit (*.net *.split) |
05:12:12 | * | adium joined #nim |
06:08:40 | * | haliucinas quit (Ping timeout: 260 seconds) |
06:15:25 | FromDiscord | <pmunch> This in a planned feature |
06:15:38 | FromDiscord | <Elegantbeef> Yay! |
06:16:24 | * | PMunch joined #nim |
06:21:26 | NimEventer | New Nimble package! resultsutils - Utility macros for easier handling of Result, see https://github.com/nonnil/resultsutils |
06:28:45 | FromDiscord | <Rika> Cool |
06:44:53 | * | jjido joined #nim |
07:16:38 | * | gsalazar joined #nim |
07:26:26 | FromDiscord | <jmgomez> Hey guys, when calling NimMain in a dynlib I got a linker error. Can I initialize nim inside my nim dll (i.e. behind a custom function)? |
07:26:49 | FromDiscord | <Elegantbeef> You probably should use `--mm:orc` |
07:28:46 | FromDiscord | <jmgomez> so you dont have to call NimMain? |
07:29:14 | FromDiscord | <Elegantbeef> You only need to call NimMain if there are top level statements with a `orc` dynamic library |
07:30:22 | FromDiscord | <jmgomez> Okay, will give that a shot. Also is there a way to do the init from nim? |
07:30:34 | FromDiscord | <Rika> I still think you should figure out how to call the function rather than change mm for that |
07:30:36 | FromDiscord | <Elegantbeef> I'm testing now |
07:31:01 | PMunch | @jmgomez, the way I've done this is to use `--noMain` and then in the init procedure you can call NimMain yourself |
07:31:25 | FromDiscord | <Elegantbeef> You have to import your own `NimMain` right? |
07:31:33 | PMunch | Yes |
07:31:38 | FromDiscord | <jmgomez> In reply to @Rika "I still think you": Im looking to see what mm is |
07:31:46 | FromDiscord | <Elegantbeef> memory management |
07:31:56 | PMunch | `proc nimMain() {.importc: "NimMain".}` something like that |
07:32:05 | FromDiscord | <Elegantbeef> refc is the default and it Requires calling `NimMain` |
07:32:15 | FromDiscord | <jmgomez> In reply to @PMunch "`proc nimMain() {.importc: "NimMain".}`": okay, that was my next question lol. Thanks! |
07:32:19 | FromDiscord | <Elegantbeef> orc/arc only require it if your code has any top level statements |
07:32:39 | FromDiscord | <jmgomez> Okay, but it wont do any harm to have it regardless the method, right? |
07:32:48 | FromDiscord | <Elegantbeef> Right |
07:32:56 | PMunch | Yeah, I don't actually call NimMain because I don't have any top-level stuff |
07:33:07 | PMunch | But yeah, no harm in calling it |
07:33:29 | FromDiscord | <Elegantbeef> I think it internally has a `once` block |
07:33:43 | FromDiscord | <jmgomez> Thanks guys! |
07:33:46 | FromDiscord | <Elegantbeef> So you cannot accidently init twice |
07:34:16 | FromDiscord | <Elegantbeef> @huantian\: if you care about an update i'm now at the point of calling host functions from wasm π |
07:35:23 | FromDiscord | <Elegantbeef> The simples part really is compiling to wasm like this is all i need https://github.com/beef331/wasmedge_playground/blob/master/wasmsources/hooks.nim |
07:36:10 | FromDiscord | <Elegantbeef> Though i'd like to import from specific named modules, but dont know if emscripten can do that, right now it's always looking in the `env` moduel |
07:57:03 | FromDiscord | <jmgomez> sent a code paste, see https://paste.rs/M0p |
07:57:26 | FromDiscord | <jmgomez> (edit) "https://play.nim-lang.org/#ix=3Xly" => "https://play.nim-lang.org/#ix=3Xlx" |
07:57:44 | FromDiscord | <Elegantbeef> no it's a global variable |
07:58:37 | FromDiscord | <Elegantbeef> Hmm actually it miight dispose but being a global variable makes reasoning hard |
07:59:58 | FromDiscord | <Elegantbeef> In the case of normal logic `t: thing` copies `t` and then `obj` owns that string |
08:00:10 | FromDiscord | <Elegantbeef> copies `thing`\ |
08:01:17 | FromDiscord | <jmgomez> That was my expectation but I do get a crash if I dont put thing inside whateverUsesThing |
08:02:21 | FromDiscord | <Elegantbeef> What? |
08:02:55 | FromDiscord | <Rika> So did you call Nim main in this case |
08:04:19 | FromDiscord | <jmgomez> Yes, I did via (I dont get the crash when thing is inside the proc) not sure if that would change with NimMain? It may be that it isnt being correctly called? I did use PMunch's imporc trick |
08:04:40 | FromDiscord | <jmgomez> (edit) "via" => "" |
08:04:44 | FromDiscord | <Elegantbeef> Using the default mm? |
08:05:00 | FromDiscord | <jmgomez> yes |
08:05:58 | FromDiscord | <Elegantbeef> you do call `whateverUsesThing` after `NimMain` right? π |
08:06:25 | FromDiscord | <jmgomez> Yup |
08:06:53 | FromDiscord | <jmgomez> Just did a test to call it without nimMain no make sure it was working and it didnt work at all (not even one time) |
08:07:17 | PMunch | Hm, it shouldn't dispose it |
08:07:36 | PMunch | Do you still have to call setupForeignThreadGC with refc? |
08:08:12 | FromDiscord | <Elegantbeef> > This function is available only when --threads\:on and --tlsEmulation\:off switches are used |
08:10:53 | FromDiscord | <Elegantbeef> I just tested works fine here |
08:11:34 | FromDiscord | <jmgomez> How did you tested it? |
08:12:22 | FromDiscord | <jmgomez> I just did another test and got it working once and the second time crashes. I did make it const this time to make sure and it did work |
08:12:27 | FromDiscord | <Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=3XlE |
08:14:06 | FromDiscord | <jmgomez> I do have another level of nest with the object creation but it should be the same |
08:14:18 | FromDiscord | <jmgomez> ohh |
08:14:23 | FromDiscord | <jmgomez> did you try with the cpp backend? |
08:14:50 | FromDiscord | <jmgomez> (also Im calling it on cpp for getting the crash but the "client" I think shouldnt matter |
08:16:08 | FromDiscord | <Elegantbeef> Works fine still |
08:19:13 | FromDiscord | <jmgomez> sent a code paste, see https://play.nim-lang.org/#ix=3XlH |
08:20:20 | FromDiscord | <Elegantbeef> Are you accidently using `stdcall` and `cdecl`?\> |
08:20:52 | FromDiscord | <Elegantbeef> Like are you actually declaring the procedure with `stdcall`? |
08:26:52 | FromDiscord | <jmgomez> I used stdcall because it what the code example on the loadLib documentation shown |
08:27:03 | FromDiscord | <jmgomez> but not sure how it may be related, could you elaborate on that? |
08:27:07 | FromDiscord | <Elegantbeef> Sure but are you annotating `whateverUsesThing` with it? |
08:27:19 | FromDiscord | <Elegantbeef> If your procedure doesnt have the same calling convention it's going to error |
08:27:28 | FromDiscord | <Elegantbeef> Either abruptly or silently |
08:27:41 | FromDiscord | <Elegantbeef> If you dont know that you need it remove it from the cast |
08:28:00 | FromDiscord | <Elegantbeef> There also isnt any reason to cast it to a gcsafe |
08:28:05 | FromDiscord | <mratsim> In reply to @jmgomez "I used stdcall because": someone wrote the documentation on a old windows |
08:28:36 | FromDiscord | <Elegantbeef> stdcall is a calling convention and mixing calling conventions can cause crashes or silently failures |
08:29:07 | FromDiscord | <jmgomez> okay, will remove those and check again if the error is still there |
08:29:20 | FromDiscord | <Elegantbeef> So if your code doesnt have a calling convention you can do `cast[proc(): cstring {.nimcall.}](lib.symAddress("whatEverUsesThing"))` |
08:29:38 | FromDiscord | <Elegantbeef> Nim's `proc` type defaults to closure so it's somewhat important to add the `nimcall` |
08:29:41 | FromDiscord | <Elegantbeef> It's nim's default calling convention |
08:29:58 | FromDiscord | <Elegantbeef> I should say it defaults to closure in type settings |
08:32:32 | FromDiscord | <jmgomez> gotcha, just did a retest and it keeps happening. Something else that I could check against? Maybe changing the mm? |
08:33:08 | FromDiscord | <Elegantbeef> Ok what's your library code and calling code again? |
08:33:51 | FromDiscord | <Elegantbeef> > I think those should be completely revamped to use either iterators (require iterator chaining)β΅Mratsim this makes me happy to read but after playing around with closure generators it's not great π |
08:34:38 | FromDiscord | <Elegantbeef> Presently closure iterators are way too slow |
08:36:55 | * | jjido quit (Quit: My MacBook Air has gone to sleep. ZZZzzzβ¦) |
08:40:21 | * | duuuuuude joined #nim |
08:44:56 | * | jjido joined #nim |
08:45:26 | FromDiscord | <Elegantbeef> @jmgomez\: wait a minute are you returning a cstring from a string that's copied? |
08:53:50 | * | lumo_e joined #nim |
08:54:48 | FromDiscord | <jmgomez> Yes, but as you can see in the image the crash is not happening due to that (which I would love to know the proper way to create/deallocate them anyways π
) https://media.discordapp.net/attachments/371759389889003532/973146006898225182/Screenshot_2022-05-09_at_10.53.19.png |
08:55:42 | FromDiscord | <Elegantbeef> Ok but what's your code |
08:55:56 | FromDiscord | <Elegantbeef> We know it's erroring with an append |
08:56:04 | FromDiscord | <Elegantbeef> But that doesnt show me where it'd run that code |
08:56:52 | FromDiscord | <jmgomez> cant post it directly because it |
08:57:07 | FromDiscord | <jmgomez> is under NDA. Im trying to get the minimal reproducible |
08:57:35 | FromDiscord | <Elegantbeef> Well then have fun |
08:58:21 | FromDiscord | <jmgomez> I just told you that Im working on having it reproducible not that Im not posting it or something like that |
08:58:56 | FromDiscord | <Elegantbeef> Yes i can read i was telling you to have fun |
09:08:38 | * | smvg joined #nim |
09:16:48 | * | smvg quit (Quit: smvg) |
09:51:57 | FromDiscord | <jmgomez> sent a code paste, see https://paste.rs/tMg |
09:53:20 | FromDiscord | <Rika> cdecl and nimcall are different things no? |
09:53:35 | FromDiscord | <Rika> Change one to the other, whichever one |
09:54:55 | FromDiscord | <jmgomez> In reply to @Rika "cdecl and nimcall are": I set it there due to elegant |
09:54:58 | FromDiscord | <jmgomez> 's suggestion |
09:55:42 | FromDiscord | <jmgomez> The code above is in one dynlib and the below in another so it allows for hot reloading not sure if what you are saying may be related with the issue |
09:55:45 | FromDiscord | <Rika> You need them to agree with each other |
09:55:56 | FromDiscord | <Rika> The calling conventions must be the same |
09:56:15 | FromDiscord | <Rika> If you need cdecl then change nimcall to cdecl |
09:56:21 | FromDiscord | <jmgomez> ok |
09:57:28 | FromDiscord | <jmgomez> Will do that, thanks. The crash is the second time I call whateverUsesThingFFI when it tries to append baseUrl with "/" |
09:58:25 | FromDiscord | <jmgomez> sent a code paste, see https://paste.rs/xrx |
09:58:58 | FromDiscord | <jmgomez> (edit) "https://play.nim-lang.org/#ix=3XlY" => "https://play.nim-lang.org/#ix=3XlX" |
09:59:07 | FromDiscord | <Rika> I donβt know whatβs wrong in this case |
10:00:03 | FromDiscord | <jmgomez> Notice I just updated the snippet with the url that was missing (the one it's being disposed) |
10:00:40 | FromDiscord | <jmgomez> if the url is inside the whateverUsesThingFFI there is no crash |
10:00:48 | FromDiscord | <jmgomez> (or if it's const) |
10:01:48 | FromDiscord | <Rika> Does it have to be let |
10:02:08 | FromDiscord | <Rika> Will running this through a debugger work |
10:05:50 | FromDiscord | <jmgomez> I did hook it to the lldb one via the UE entry point and it does crash where I posted before (doing the append) |
10:05:56 | FromDiscord | <jmgomez> In reply to @jmgomez "Yes, but as you": here |
10:06:28 | * | jmdaemon quit (Ping timeout: 248 seconds) |
10:44:09 | * | smvg joined #nim |
10:44:41 | * | xet7 quit (Remote host closed the connection) |
10:47:57 | * | xet7 joined #nim |
11:02:57 | * | smvg quit (Quit: smvg) |
11:03:50 | * | smvg joined #nim |
11:04:10 | * | smvg quit (Client Quit) |
11:06:45 | * | smvg joined #nim |
11:10:43 | * | jjido quit (Quit: My MacBook Air has gone to sleep. ZZZzzzβ¦) |
11:22:00 | * | smvg quit (Quit: smvg) |
11:25:27 | * | smvg joined #nim |
11:36:13 | * | jjido joined #nim |
11:49:27 | FromDiscord | <d4rckh> is there any equivalent of sizeof from c++ in nim? |
11:49:53 | FromDiscord | <jmgomez> size()? |
11:56:56 | PMunch | @d4rckh, yes, it's called sizeof :P |
11:57:03 | PMunch | !eval echo sizeof(int) |
11:57:06 | NimBot | 8 |
11:57:16 | FromDiscord | <jmgomez> sent a code paste, see https://paste.rs/Ml2 |
11:57:46 | FromDiscord | <jmgomez> In reply to @jmgomez "size()?": I meant sizeOf too sorry |
11:58:13 | FromDiscord | <Rika> In reply to @jmgomez "Another unrelated topic (not": idk; maybe because the callback handles it whether failed or successful |
11:58:22 | FromDiscord | <Rika> so it cant just pass T because it might have failed |
11:58:42 | FromDiscord | <jmgomez> so at that point the future is resolved in the happy path? |
11:59:09 | FromDiscord | <Rika> in cb it can either be failed or successful i assume |
11:59:48 | PMunch | If you want to assign the same top-level procedure to multiple different futures it's nice to be passed the future in question as an argument |
12:09:21 | * | FromDiscord quit (Remote host closed the connection) |
12:09:35 | * | FromDiscord joined #nim |
12:12:21 | FromDiscord | <jmgomez> sent a code paste, see https://play.nim-lang.org/#ix=3Xmu |
12:13:13 | FromDiscord | <Rika> it will, waitfor will block |
12:13:17 | FromDiscord | <Rika> wait |
12:13:22 | FromDiscord | <Rika> huh> |
12:13:31 | FromDiscord | <Rika> thats strange |
12:13:47 | FromDiscord | <Rika> i dont think it will block no |
12:13:53 | FromDiscord | <Rika> reeeeeee callback reeeeeee |
12:14:19 | PMunch | @jmgomez, you don't have to use waitFor in those callbacks |
12:14:23 | FromDiscord | <Rika> f.finished will be true in callbacks so you dont need to waitfor |
12:14:25 | PMunch | It won't hurt though |
12:14:27 | FromDiscord | <Rika> just .get |
12:14:50 | FromDiscord | <jmgomez> gotcha |
12:14:53 | FromDiscord | <jmgomez> thanks! |
12:15:23 | PMunch | You also don't need return type void |
12:16:20 | FromDiscord | <jmgomez> yeah, that I know but I prefer to have it there for clarity (FFI functions tend to grow in oddness) |
12:16:32 | PMunch | Fair enough |
12:16:55 | PMunch | Related to that you can also combine argument types like `username, password: cstring` |
12:17:49 | FromDiscord | <jmgomez> for some reason I thought that it only allows you to do it at the end but good to know you can do it at any point |
12:21:03 | PMunch | I'd probably write it like this: https://play.nim-lang.org/#ix=3Xmy |
12:21:22 | PMunch | (if you still wanted the void return types, personally I'd remove those as well) |
12:22:07 | PMunch | If you have multiple of those a collection pragma would also help shorten things down, similar to how the callback type shortens the signature down |
12:22:33 | * | jjido quit (Quit: My MacBook Air has gone to sleep. ZZZzzzβ¦) |
12:22:44 | FromDiscord | <jmgomez> nice, much clearer! |
12:23:07 | FromDiscord | <jmgomez> not sure, I tried with ffi:genFilePath and no way I could do it (it's a custom one) |
12:23:31 | FromDiscord | <jmgomez> the others are there because using push also pushes things into the cb |
12:24:24 | PMunch | Syntax might not be 100% correct here, but you could also do the callback without assigning the future https://play.nim-lang.org/#ix=3XmB |
12:24:54 | PMunch | I believe the pushing issue would be fixed by declaring the callback type outside the signature |
12:26:13 | FromDiscord | <jmgomez> cool, I got an issue with name collisions using get |
12:26:26 | FromDiscord | <jmgomez> I think it conflicts with httpclient.get |
12:26:38 | PMunch | Hmm, that's odd |
12:26:46 | PMunch | I meant something like this with the pragma https://play.nim-lang.org/#ix=3XmC |
12:26:56 | FromDiscord | <Xzayler> what advantages are there to using godot-nim over the native gdscript? |
12:27:06 | PMunch | Not sure if you can move `ffi` into there because I don't know how it is implemented |
12:27:09 | FromDiscord | <Xzayler> I don't really understand how this integration works |
12:27:54 | PMunch | @Xzayler, well it's mostly for people who want to do gamedev with Godot in Nim, the benefits are those of Nim: expressivity, speed, type safety |
12:28:06 | FromDiscord | <jmgomez> sent a code paste, see https://play.nim-lang.org/#ix=3XmD |
12:29:05 | PMunch | Right, I don't think you can add macro-pragmas into a pragma (it's silly and confusing, I know..) |
12:30:14 | FromDiscord | <jmgomez> unfortunate but not a big issue |
12:30:28 | FromDiscord | <jmgomez> on the get conflicting with the http module, what can be done? |
12:38:29 | PMunch | Depends on the nature of the conflict |
12:38:50 | PMunch | It shouldn't really be a conflict since only one of them matches the arguments given |
12:40:56 | FromDiscord | <jmgomez> sent a code paste, see https://play.nim-lang.org/#ix=3XmE |
12:43:04 | PMunch | Oh whoops, it's not `get` it's `read`. `get` is for options |
12:43:07 | * | smvg quit (Quit: smvg) |
12:43:35 | PMunch | That error just tells you that there is no `get` declared for Futures |
12:43:35 | FromDiscord | <jmgomez> okay! |
12:43:40 | * | lumo_e quit (Ping timeout: 250 seconds) |
12:44:05 | FromDiscord | <jmgomez> IMO they should be a bit more consistent with monodics apis |
12:46:22 | PMunch | @jmgomez, what do you mean? |
12:48:01 | * | jjido joined #nim |
12:49:07 | FromDiscord | <jmgomez> Just that Future, Seqs, Options (not sure if Either/Results is around), etc. should have the same name for the same pattern |
12:49:54 | PMunch | Wait, how does seqs fit into that? |
12:50:03 | PMunch | With those you just access the data with [] |
12:50:05 | * | pch joined #nim |
12:50:27 | FromDiscord | <jmgomez> You can take them out of the equation if you want, but Im referring to the fact that they are monads too |
12:50:43 | PMunch | But I agree that Options and Futures could have the same operation |
12:52:37 | * | smvg joined #nim |
12:54:47 | * | slowButPresent joined #nim |
12:59:26 | * | rockcavera joined #nim |
12:59:26 | * | rockcavera quit (Changing host) |
12:59:26 | * | rockcavera joined #nim |
12:59:59 | * | rockcavera quit (Remote host closed the connection) |
13:00:25 | * | lumo_e joined #nim |
13:02:07 | * | kayabaNerve_ joined #nim |
13:04:28 | * | kayabaNerve quit (Ping timeout: 250 seconds) |
13:24:09 | * | duuuuuude quit (Ping timeout: 256 seconds) |
13:25:15 | * | duuuuuude joined #nim |
13:32:43 | FromDiscord | <Rika> In reply to @jmgomez "You can take them": seqs are monads? |
13:33:12 | * | jjido quit (Quit: My MacBook Air has gone to sleep. ZZZzzzβ¦) |
13:38:19 | FromDiscord | <ambient> is there something like Jupyter for Nim? |
13:39:58 | * | smvg quit (Quit: smvg) |
13:42:18 | NimEventer | New thread by Yglukhov: Async musings, see https://forum.nim-lang.org/t/9149 |
13:54:12 | FromDiscord | <jmgomez> In reply to @Rika "seqs are monads?": https://en.wikibooks.org/wiki/Haskell/Understanding_monads/List |
13:54:49 | FromDiscord | <jmgomez> In reply to @ambient "is there something like": closest thing I heard of is iNim but never used it. It would be great if someone who has shared its experience |
13:55:21 | PMunch | @ambient, there is nimibook which is kind of similar |
13:56:46 | FromDiscord | <fbpyr> to me, inim felt more like a raw python repl for nim (which I love for testing a quick snippet), than the full jupyter. |
14:00:48 | FromDiscord | <jmgomez> In reply to @fbpyr "to me, inim felt": so do you use it? I want to try it out.. said it because I didnt know about nimibook neither. But now that Im looking at it seems inim is more close to it. Wasnt jupyter built on top of iphython? |
14:00:52 | FromDiscord | <spoon> heah inim was more like python command line shell |
14:01:15 | FromDiscord | <ambient> there's also https://github.com/stisa/jupyternim which I'm looking at right now |
14:02:20 | FromDiscord | <jmgomez> In reply to @ambient "there's also https://github.com/stisa/jupyternim wh": that's great wonder what backends it supports |
14:03:26 | FromDiscord | <jmgomez> In reply to @jmgomez "so do you use": indeed it was https://blog.jupyter.org/the-big-split-9d7b88a031a7 |
14:03:52 | * | smvg joined #nim |
14:04:20 | FromDiscord | <fbpyr> @jmgomez\: yes I do, as I am a big fan of this interactive poking at things to learn...β΅but I also miss a lot of convenience functionality from pyt\_python bpython (autocompletion, doc strings, etc) |
14:06:25 | FromDiscord | <fbpyr> ..but also my use case is actually not jupyter but closer to bpyhton/pt\_python.. |
14:08:25 | FromDiscord | <stisa> let me know if you do try it! it's been a while since the last update but it should work fine, if a little slow. If you don't need C imports, you can try `nim secret`in a terminal, if it wasn't removed from the compiler it should work as repl using nim vmβ΅(@ambient) |
14:08:52 | * | PMunch quit (Quit: Leaving) |
14:08:58 | FromDiscord | <ambient> is there a possibility to display audio, or is that something I must patch in manually? |
14:10:50 | FromDiscord | <stisa> you mean a plot of the waveform? you'd need to do that yourself |
14:11:13 | FromDiscord | <ambient> directly play audio through web, like generate a sine procedurally and then play it through the speakers |
14:11:52 | FromDiscord | <stisa> no idea, I've never seen that done in jupyter |
14:12:05 | FromDiscord | <stisa> I guess if you set the right mime type it could work? |
14:12:39 | * | pch quit (Quit: Leaving) |
14:13:08 | * | arkurious joined #nim |
14:13:33 | FromDiscord | <ynfle> I'm trying to fix up some old code. What is `nnktypedList` and `nnkBracetUntyped`? |
14:13:54 | * | pch joined #nim |
14:17:29 | FromDiscord | <ambient> @stisa something like this https://gist.github.com/amb/2c9314b1991e07ab3e21097aab97cfae |
14:17:56 | FromDiscord | <ambient> The Audio() plays the sample |
14:22:42 | FromDiscord | <stisa> mmh judging by https://github.com/ipython/ipython/blob/master/IPython/lib/display.py#L226 they just output some html and base64 encode the audio track |
14:22:54 | FromDiscord | <ambient> ok I'll give it a shot |
14:24:00 | FromDiscord | <stisa> this should display html\: https://github.com/stisa/jupyternim/blob/master/src/jupyternimpkg/display.nim#L73 so it should "just" need to output the same as theirs |
14:25:21 | FromDiscord | <stisa> or with this one\: https://github.com/stisa/jupyternim/blob/master/src/jupyternimpkg/display.nim#L132 |
14:33:50 | * | duuuuuude quit (Remote host closed the connection) |
14:48:43 | * | pch quit (Remote host closed the connection) |
14:49:40 | * | pch joined #nim |
14:57:39 | * | duuuuuude joined #nim |
14:59:05 | * | lumo_e quit (Quit: Quit) |
15:02:41 | * | firq quit (Quit: WeeChat 3.5) |
15:05:46 | * | firq joined #nim |
15:10:44 | FromDiscord | <ynfle> How do I turn warnings and hints off with a pragma? |
15:41:53 | FromDiscord | <pmunch> Hmm, where should nimsuggest bugs be raised? The nimsuggest repo, or the main Nim repo? |
15:43:50 | FromDiscord | <ynfle> In reply to @ynfle "I'm trying to fix": Nvm. text substitution error on my part |
16:17:54 | * | vicfred joined #nim |
16:20:39 | * | duuuuuude quit (Ping timeout: 276 seconds) |
16:34:53 | * | haliucinas joined #nim |
16:42:38 | FromDiscord | <Yardanico> In reply to @pmunch "Hmm, where should nimsuggest": I'll report my issues on GitHub, but basically it's two main things: 1) On Windows nimble creates a .cmd file to execute binaries instead of a symlink, so gorge/staticExec doesn't work with that 2) staticExec redirects stderr to stdout so if opir shows warnings after spitting out json, futhark will take the wrong line from the json |
16:43:15 | FromDiscord | <Yardanico> 3) libclang for some reason gives away paths that have / instead of \ for sciter include folder, fixed by manually replacing / with \ |
16:43:25 | FromDiscord | <Yardanico> Three main things :P |
16:43:45 | FromDiscord | <Yardanico> and 2 from the output, not json |
16:46:21 | FromDiscord | <Yardanico> 3 is really important because futhark's logic regarding whether to include specific symbols in the Nim file or not depends on the filenames they come from, but with a different path separator some paths appear differently |
16:46:52 | FromDiscord | <Yardanico> But again, it's libclang that gives those strings, so not sure if there's a real fix for it except just manually replacing / with \ |
16:49:15 | * | noeontheend joined #nim |
16:56:06 | FromDiscord | <Yardanico> Apart from that it works really well, I was afraid that it'd fail because it has to analyze windows headers as well, but it didn't :) |
16:57:49 | * | xet7 quit (Quit: Leaving) |
16:59:16 | FromDiscord | <Yardanico> And the C++ issue was there due to a bug in sciter headers - it defines CPP11 if _MSC_VER >= 1600 which is wrong |
16:59:22 | * | kenran joined #nim |
16:59:33 | FromDiscord | <Yardanico> Because clang defines that as well (it tries to be compatible with msvc on Windows somewhat) |
17:16:36 | FromDiscord | <ambient> sent a code paste, see https://play.nim-lang.org/#ix=3XnU |
17:17:15 | * | smvg quit (Quit: smvg) |
17:24:56 | FromDiscord | <Yardanico> In reply to @ambient "I'm wrapping Tinywav library": I'll try to help a bit later |
17:31:28 | FromDiscord | <Yardanico> @ambient https://github.com/mhroth/tinywav ? |
17:31:48 | FromDiscord | <ambient> @Yardanico yeah that's it |
17:32:37 | FromDiscord | <ambient> I'll probably later write the entire lib in Nim, so I can get better access to where I want to save/load, but the error is still confusing and something that would be nice to figure out if I'm to use Futhark in the future |
17:32:39 | FromDiscord | <Yardanico> honestly for tinywav it would be quite easy to just rewrite it in Nim, but I'll see why it errors :) |
17:35:32 | FromDiscord | <Yardanico> In reply to @ambient "<@177365113899057152> yeah that's it": not sure what error you're talking about - I uncommented the code, but it's wrong because you're comparing a `cint` to a `nil` |
17:35:52 | FromDiscord | <Yardanico> maybe you got a different error with nimsuggest? can you try checking with the compiler itself? |
17:36:28 | FromDiscord | <Yardanico> you should instead compare if the return code is non-zero |
17:36:47 | FromDiscord | <ambient> yeah now it works, but the error message was very confusing |
17:36:57 | FromDiscord | <Yardanico> where did you get it specifically? vscode or the compiler? |
17:37:04 | FromDiscord | <Yardanico> i mean in the actual command line |
17:37:06 | FromDiscord | <ambient> nim c -r my_code.nim |
17:37:17 | FromDiscord | <Yardanico> hmm, quite weird, I didn't get anything like that |
17:37:21 | FromDiscord | <Yardanico> maybe you put it to `const` by accident? |
17:37:26 | FromDiscord | <Yardanico> `wavefoo` I mean |
17:37:32 | * | PMunch joined #nim |
17:37:32 | FromDiscord | <Yardanico> or put a `static` block somewhere by accident |
17:38:20 | FromDiscord | <ambient> ctrl-f const, static == nothing |
17:38:30 | FromDiscord | <Yardanico> but now it doesn't error as you said |
17:38:33 | FromDiscord | <Yardanico> also, what's your nim version? |
17:38:45 | FromDiscord | <Yardanico> and another thing - use `doAssert` instead of `assert` for checking return codes of API calls, because asserts can be disabled (either by `--assertions:off` or `-d:danger`) |
17:38:56 | FromDiscord | <Yardanico> so if you compile with `-d:danger` calls to the API with `assert` will simply not be compiled |
17:39:01 | FromDiscord | <ambient> 1.6.4 7994556f3804c217035c44b453a3feec64405758 |
17:39:14 | FromDiscord | <Yardanico> hm, well, I'm on devel, maybe that's a bug in 1.6.4 specifically |
17:40:37 | FromDiscord | <ambient> yeah, on devel it gives a very good error message |
17:40:43 | FromDiscord | <ambient> so looks like 1.6.4 bu |
17:41:21 | FromDiscord | <Yardanico> can you try updating to 1.6.6 and see if the bug is still there? |
17:41:35 | FromDiscord | <Yardanico> although I don't remember 1.6.6 having any commits related to things like that |
17:42:03 | FromDiscord | <ambient> 1.6.6 also works fine, no issues |
17:42:16 | FromDiscord | <Yardanico> okay, good then |
17:42:52 | * | duuuuuude joined #nim |
17:52:17 | Yardanico | PMunch: i'll try that advice you shared, meanwhile I'm trying to reproduce the issue with executing opir from futhark to make an issue |
17:57:26 | PMunch | If you're lucky it's timing based :P |
17:57:46 | PMunch | Maybe we need to flush stdout and stderr before echoing the output |
17:58:19 | Yardanico | PMunch: that can be true, yes, opir takes a while before it starts spitting out json for sciter |
17:58:23 | Yardanico | like 2 seconds |
17:59:17 | PMunch | That long? |
17:59:25 | * | Zectbumo joined #nim |
17:59:31 | Yardanico | yes |
17:59:34 | Yardanico | the resulting json file is like 9MB |
17:59:42 | PMunch | Ah right :P |
17:59:57 | PMunch | I mean it essentially compiles the entire project |
18:00:05 | Yardanico | yeah |
18:00:06 | PMunch | Or at least parses and does a lot of the work |
18:04:53 | Yardanico | PMunch: i think i know the root cause of the command issue, but I don't get why it works on Linux and not Windows |
18:05:08 | Yardanico | basically gorge (staticExec) doesn't use poUsePath and swallos errors |
18:05:29 | Yardanico | with my own myStaticExec copied from the compiler impl it errors Additional info: Requested command not found: 'opir test args'. OS error: [OSError] with "opir" |
18:05:35 | Yardanico | it will work with "opir.cmd" directly though |
18:06:07 | Yardanico | i guess it just has to do with the fact that linux doesn't have extensions for binaries while windows does :) |
18:06:33 | Yardanico | the simplest way for futhark to fix this is just use opir.cmd instead of opir on Windows, but this assumes that the user uses futhark with nimble |
18:06:40 | Yardanico | which is probably true I mean, but still a bit dirty |
18:07:59 | Yardanico | ah actually even poUsePath won't help here |
18:09:04 | PMunch | But wouldn't simply moving the echo to be the last thing work? |
18:09:43 | Yardanico | PMunch: the issue is that opir just doesn't get executed |
18:09:57 | PMunch | Oh what? |
18:10:17 | Yardanico | staticExec doesn't have exceptions, so if a command fails to execute it just returns an empty string with -1 as the exit code |
18:10:26 | Yardanico | i mean it has exceptions, but it catches them in the proc itself |
18:10:31 | Yardanico | https://github.com/nim-lang/Nim/blob/devel/compiler/gorgeimpl.nim#L62 |
18:11:11 | Yardanico | -1 exit code in case of an exception is not documented as far as I know :) |
18:12:54 | Yardanico | Calling stuff as `bin` without extension on Windows only works if `bin.exe` is in PATH, it doesn't apply to `bin.cmd` which nimble uses to "symlink" (alias) the actual binary |
18:19:41 | PMunch | Right.. |
18:19:58 | PMunch | But people have run Futhark on Windows before, right? |
18:20:13 | Yardanico | I don't know how it worked for them Β―\_(γ)_/Β― |
18:20:22 | Yardanico | windows magic |
18:21:05 | Yardanico | also about timings - I think yeah, it's just enough to add flushFile calls to stderr and stdout in opir before `echo output` |
18:21:23 | FromDiscord | <eyecon> sent a code paste, see https://play.nim-lang.org/#ix=3Xob |
18:22:29 | FromDiscord | <Yardanico> "and put it into the same directory." that's the issue |
18:22:48 | FromDiscord | <Yardanico> on Linux it's only checked that cacert.pem is in default paths for Linux, current dir is not checked |
18:23:21 | FromDiscord | <Yardanico> you can make it use your cacert.pem by creating your own ssl context with `newContext` with CVerifyPeerUseEnvVars as verifymode |
18:23:35 | FromDiscord | <Yardanico> and then put path to your cacert.pem into `SSL_CERT_FILE` env var |
18:25:45 | Yardanico | hmm flushFile approach for futhark doesn't seem to work actually, lemme experiment with it a bit more |
18:25:48 | FromDiscord | <eyecon> Thank you, let me check the docs on that |
18:26:35 | FromDiscord | <Yardanico> In reply to @eyecon "Thank you, let me": oh I don't know if that is in docs, I just checked the source code of finding root certs ;) |
18:26:55 | FromDiscord | <Yardanico> it is apparently |
18:27:04 | FromDiscord | <Yardanico> https://nim-lang.org/docs/net.html#newContext%2Cstring%2Cstring%2Cstring%2Cstring "if verifyMode is set to CVerifyPeerUseEnvVars, the SSL_CERT_FILE and SSL_CERT_DIR environment variables are used" |
18:27:22 | FromDiscord | <Yardanico> ah right, newContext just has a `certFile` argument |
18:27:28 | FromDiscord | <Yardanico> caFile |
18:31:58 | FromDiscord | <eyecon> ...and `caDir` which is useful |
18:32:23 | FromDiscord | <eyecon> OK, that upgraded me to a `400 Bad Request`, that's progress |
18:32:36 | FromDiscord | <Yardanico> probably get request to a post endpoint, or the other way |
18:32:57 | FromDiscord | <Yardanico> yeah, ntfy.sh is PUT and POST |
18:32:57 | FromDiscord | <eyecon> Yes, that's solvable π |
18:33:10 | FromDiscord | <eyecon> There's GET too actually |
18:33:47 | FromDiscord | <eyecon> https://ntfy.sh/docs/publish/#webhooks-publish-via-get |
18:33:57 | FromDiscord | <Yardanico> yeah i already found that page :) |
18:34:10 | PMunch | Yardanico, wait, if you install Futhark via Nimble then Opir should already be in the path (if you've installed nimble correctly) |
18:34:27 | Yardanico | PMunch: opir.cmd is in PATH, not opir.exe |
18:34:36 | PMunch | Oh.. |
18:34:46 | Yardanico | opir.exe is placed in C:\Users\dian\.nimble\pkgs\futhark-0.6.1 |
18:34:56 | Yardanico | and then opir.cmd calls opir.exe with that path |
18:35:04 | Yardanico | @"%~dp0\..\pkgs\futhark-0.6.1\opir.exe" %* |
18:35:14 | PMunch | Right.. |
18:35:49 | Yardanico | I'm still trying to figure out why json isn't being output as the last line in the output even with flushFile |
18:38:42 | Yardanico | i think i know why : |
18:38:44 | Yardanico | :D |
18:38:54 | FromDiscord | <Yardanico> https://media.discordapp.net/attachments/371759389889003532/973292998525857862/unknown.png |
18:39:07 | Yardanico | last line is empty, so splitLines returns an empty line as the last one |
18:40:09 | FromDiscord | <eyecon> In reply to @Yardanico "yeah, ntfy.sh is PUT": Worse, forgot a trailing comma in JSON... It works now, thanks a lot! |
18:40:49 | Yardanico | not sure why it only happens on Window, but I guess the fix would be to skip empty lines? |
18:40:57 | Yardanico | somehow |
18:41:59 | FromDiscord | <eyecon> Can I embed the certificates somehow? I can `slurp` the file but `newContext` doesn't accept the contents |
18:42:01 | Yardanico | anyway, I added that info to the futhark issue |
18:42:38 | FromDiscord | <Yardanico> @eyecon don't think so |
18:42:46 | FromDiscord | <eyecon> Meh |
18:42:55 | FromDiscord | <eyecon> Thanks anyway |
18:43:00 | FromDiscord | <Yardanico> it'd be really really bad practice anyway |
18:43:26 | FromDiscord | <eyecon> In reply to @Yardanico "it'd be really really": Surely not worse than delivering a manually downloaded certificate file? |
18:43:43 | FromDiscord | <Yardanico> not worse, because users can replace this cacert.pem themselves easily |
18:43:51 | FromDiscord | <Yardanico> also, on virtually all linux distros it's already available |
18:43:59 | FromDiscord | <eyecon> But Windows :/ |
18:44:37 | FromDiscord | <Yardanico> I don't really get the "one binary only" "cult", sorry. We have installers and archives, is it really that bad to pack your app (being multiple files) into an archive/installer? |
18:44:47 | FromDiscord | <Yardanico> especially on Windows |
18:44:49 | FromDiscord | <eyecon> "Cult"? |
18:44:57 | FromDiscord | <Yardanico> but if you really want, you can use tools like https://enigmaprotector.com/en/aboutvb.html |
18:45:03 | FromDiscord | <Yardanico> to pack multiple files into one "binary" |
18:45:22 | FromDiscord | <Yardanico> but AVs are usually more suspicious towards binaries that are packed like that |
18:46:25 | FromDiscord | <eyecon> I get what you mean, and I understand the viewpoint too, but surely calling the opposite viewpoint a "cult" is a bit too much? |
18:46:33 | FromDiscord | <Yardanico> that's why I used quotes |
18:46:52 | FromDiscord | <Yardanico> also, you'll also have to ship two ssl .dlls unless you link openssl statically |
18:47:03 | FromDiscord | <Yardanico> along with cacert.pem |
18:47:17 | FromDiscord | <Yardanico> Nim uses OpenSSL for SSL |
18:47:44 | FromDiscord | <Yardanico> in the standard library I mean, there are some third-party packages like puppy that use OS-native APIs, but they're less flexible in amount of features compared to httlpclient |
18:48:06 | FromDiscord | <Yardanico> https://github.com/treeform/puppy |
18:49:54 | * | rockcavera joined #nim |
18:49:54 | * | rockcavera quit (Changing host) |
18:49:54 | * | rockcavera joined #nim |
18:50:30 | FromDiscord | <d4rckh> sent a code paste, see https://play.nim-lang.org/#ix=3Xon |
18:50:39 | FromDiscord | <d4rckh> I tried passing it using `addr aProcesses` and `aProcesses` |
18:50:56 | FromDiscord | <d4rckh> but its throwing a type mismatch error |
18:51:04 | FromDiscord | <d4rckh> sent a code paste, see https://play.nim-lang.org/#ix=3Xoo |
18:51:09 | FromDiscord | <Yardanico> just cast it |
18:51:32 | FromDiscord | <Yardanico> Nim is more strict than C in type definitions, so in Nim a pointer to an array is different than just a pointer to an element, while in C it's the same |
18:51:47 | FromDiscord | <d4rckh> thanks, should i do the same with the second parameter? an int is returned by sizeof but i need a dword :think: |
18:51:51 | FromDiscord | <d4rckh> (edit) ":think:" => "π€" |
18:51:59 | FromDiscord | <Yardanico> you use a type conversion for things like numbers |
18:52:04 | FromDiscord | <d4rckh> ah, right |
18:52:10 | FromDiscord | <Yardanico> so DWORD(myint) |
18:52:13 | FromDiscord | <d4rckh> got it |
18:54:33 | FromDiscord | <d4rckh> seems like i got 231 processes returned π |
18:54:35 | FromDiscord | <d4rckh> thanks |
18:55:20 | * | gsalazar quit (Remote host closed the connection) |
18:58:10 | * | duuuuuude quit (Ping timeout: 240 seconds) |
19:00:51 | FromDiscord | <d4rckh> what would be the nim equivalent for this? `TCHAR szProcessName[MAX_PATH]` |
19:01:30 | FromDiscord | <Yardanico> `var szProcessName: array[MAX_PATH, TCHAR]` |
19:01:37 | FromDiscord | <Yardanico> where MAX_PATH is some number |
19:01:51 | FromDiscord | <Yardanico> but in your case you probably want WCHAR instead of TCHAR as you're using ANSI Windows functions anyway |
19:02:31 | FromDiscord | <d4rckh> i see, thanks |
19:04:57 | Yardanico | PMunch: would futhark work with libclang 14 ? |
19:05:07 | Yardanico | I want to try it to see if it would fix the filename path issue |
19:10:26 | PMunch | I don't see why it wouldn't |
19:10:31 | PMunch | But I haven't tried |
19:10:53 | Yardanico | yeah, it works, but that issue is still there |
19:10:54 | FromDiscord | <d4rckh> what about here GetModuleBaseNameA's nSize parameter? https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmodulebasenamea |
19:10:57 | FromDiscord | <d4rckh> (edit) removed "here" |
19:11:00 | Yardanico | and what's funny is that it's also there for some windows headers |
19:11:05 | Yardanico | C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um/objidl.h |
19:11:20 | FromDiscord | <Yardanico> In reply to @d4rckh "what about GetModuleBaseNameA's nSize": what about it? |
19:11:32 | FromDiscord | <Yardanico> "The size of the lpBaseName buffer, in characters." |
19:11:50 | FromDiscord | <Yardanico> LPSTR is just a pointer to a typical ASCII char array |
19:11:56 | FromDiscord | <Yardanico> so you can use a nim string for that directly |
19:11:57 | FromDiscord | <d4rckh> one sec |
19:12:04 | FromDiscord | <d4rckh> thats cool π€ |
19:12:15 | FromDiscord | <d4rckh> and if i use a nim string, what should i pass to that param? |
19:12:26 | FromDiscord | <Yardanico> `mynimstring.cstring` |
19:12:34 | FromDiscord | <Yardanico> i mean to the lpBaseName |
19:13:00 | FromDiscord | <d4rckh> yup |
19:13:48 | Yardanico | PMunch: i've tried searching stuff about this issue, but seems like no one uses libclang on windows :D |
19:14:38 | PMunch | I guess it's time to stop using Windows then :) |
19:14:41 | FromDiscord | <d4rckh> and to the nSize? |
19:14:47 | FromDiscord | <d4rckh> (edit) removed "the" |
19:15:19 | FromDiscord | <Yardanico> In reply to @d4rckh "and to nSize?": just `mynimstring.len`? haven't you already used other winapi functions? |
19:15:30 | FromDiscord | <Yardanico> and then resize the string to the len returned by the api call |
19:15:31 | FromDiscord | <Yardanico> with `setLen` |
19:15:42 | Yardanico | PMunch: or maybe https://reviews.llvm.org/D99580 is related |
19:16:17 | Yardanico | but this is for debuginfo, not for libclang API |
19:16:29 | Yardanico | so do you think it's worth adding those workarounds to futhark or not? |
19:16:34 | FromDiscord | <d4rckh> In reply to @Yardanico "just `mynimstring.len`? haven't you": well this function doesnt work like that |
19:16:37 | * | lumo_e joined #nim |
19:16:48 | FromDiscord | <Yardanico> In reply to @d4rckh "well this function doesnt": ? |
19:17:34 | FromDiscord | <d4rckh> i dont think this function needs to be called twice |
19:17:46 | FromDiscord | <Yardanico> i didn't say it should be called twice |
19:17:59 | FromDiscord | <d4rckh> i think i will give in `MAX_PATH` |
19:18:00 | FromDiscord | <Yardanico> In reply to @d4rckh "i dont think this": and the one we talked about before doesn't need to be called twice either if the buffer is big enough |
19:18:18 | FromDiscord | <d4rckh> i see |
19:19:28 | FromDiscord | <d4rckh> weird i am getting error 87 param not correct |
19:19:37 | FromDiscord | <Yardanico> In reply to @d4rckh "weird i am getting": well, can you show the code? |
19:20:04 | FromDiscord | <d4rckh> yeah one sec let me select the pieces |
19:20:21 | FromDiscord | <d4rckh> sent a code paste, see https://play.nim-lang.org/#ix=3Xoz |
19:20:26 | FromDiscord | <d4rckh> aProcesses[i] is a DWORD with the pID |
19:21:31 | FromDiscord | <Yardanico> you didn't actually allocate a buffer for the string |
19:21:54 | FromDiscord | <Yardanico> and why MAX_PATH specifically for GetModuleBaseNameA |
19:22:23 | FromDiscord | <d4rckh> ive seen some examples using MAX_PATH as the name size |
19:23:21 | FromDiscord | <Yardanico> sent a code paste, see https://play.nim-lang.org/#ix=3XoA |
19:23:22 | FromDiscord | <Yardanico> and you don't need `bitor`, just use builtin `or` |
19:24:57 | PMunch | Yardanico, feel free to add whatever you want as long as you get it working :) |
19:25:04 | * | duuuuuude joined #nim |
19:25:21 | PMunch | I believe there are also some pathing issues on Windows, or maybe it's just that Windows users are more likely to have spaces in their paths.. |
19:25:44 | Yardanico | ah yeah, I didn't stumble upon that issue as I don't use spaces in paths myself |
19:27:09 | Yardanico | But basically what I needed to fix for myself: opir.cmd instead of opir, replace / with \, hide warnings and pick the first line from splitLines in futhark instead of the last one |
19:27:58 | FromDiscord | <d4rckh> sent a code paste, see https://play.nim-lang.org/#ix=3XoB |
19:28:18 | PMunch | Yardanico, you don't want to pick the first line |
19:28:35 | PMunch | Opir can spit out a lot of messages |
19:28:36 | Yardanico | yes yes I know, it was just my workaround |
19:28:46 | Yardanico | the proper way would be to clean empty lines |
19:28:51 | PMunch | You should move the echo on line 399 to the end instead |
19:29:29 | PMunch | And maybe add a stdout.flushFile |
19:29:35 | Yardanico | that didn't help as I showed in the screenshot |
19:29:41 | Yardanico | the issue is that there's an empty line for some reason |
19:29:56 | PMunch | Ah.. |
19:30:09 | PMunch | Maybe some stripWhitespace before splitLines? |
19:30:22 | Yardanico | yeah, I just hope it won't be too slow for very big strings :P |
19:32:00 | FromDiscord | <theangryepicbanana> sent a code paste, see https://play.nim-lang.org/#ix=3XoC |
19:35:58 | Yardanico | PMunch: yeah, apparently both flushFile and stripping are needed together |
19:36:01 | Yardanico | I'll PR that change |
19:36:57 | PMunch | :+1: |
19:37:13 | PMunch | Does Discord turn that into an emoji? |
19:37:15 | Yardanico | yes |
19:37:20 | PMunch | :nimrawr: |
19:37:22 | Yardanico | no |
19:37:28 | Yardanico | :nimRawr: |
19:37:31 | Yardanico | still doesn't :P |
19:37:33 | PMunch | Or whatever the one for the badger is |
19:37:40 | Yardanico | because discord emojis are different from normal emojis |
19:38:17 | Yardanico | PMunch: maybe I should also add it so that futhark fails if opir has a non-zero exit code? |
19:38:20 | PMunch | Huh, but I wrote color plus one colon |
19:38:24 | FromDiscord | <d4rckh> sent a code paste, see https://play.nim-lang.org/#ix=3XoE |
19:38:28 | PMunch | :nimRawr: |
19:38:33 | FromDiscord | <Yardanico> In reply to @d4rckh "is there any way": just check that sz is 0 ? |
19:38:37 | PMunch | Hmm, silly Discord |
19:38:40 | FromDiscord | <spoon> nim emojis look like <emotename:somenumericalid> when you actually upload them |
19:38:44 | FromDiscord | <Yardanico> yes |
19:38:45 | FromDiscord | <spoon> i meant discord but you get it |
19:38:58 | PMunch | That is probably a good idea Yardanico |
19:39:13 | PMunch | Ah.. |
19:39:30 | PMunch | Well when you use the badger on Discord I see :nimRawr: I think |
19:39:39 | FromDiscord | <Yardanico> yeah i handle that in ircord |
19:39:49 | FromDiscord | <Yardanico> i don't handle irc -> discord for discord emojis though :) |
19:40:15 | FromDiscord | <Yardanico> https://github.com/Yardanico/ircord/blob/master/src/utils.nim#L238 |
19:41:40 | FromDiscord | <d4rckh> weird, that i am getting a bunch of blank space |
19:41:45 | FromDiscord | <d4rckh> https://media.discordapp.net/attachments/371759389889003532/973308815460167720/unknown.png |
19:41:53 | FromDiscord | <Yardanico> In reply to @d4rckh "weird, that i am": did you not forget the `setLen` call ? |
19:41:55 | FromDiscord | <d4rckh> sent a code paste, see https://paste.rs/bny |
19:42:20 | FromDiscord | <Yardanico> it changes the string length to what was returned by the API call to remove empty chars |
19:42:35 | FromDiscord | <d4rckh> yes i did forget |
19:42:48 | FromDiscord | <d4rckh> it works now |
19:42:56 | FromDiscord | <d4rckh> thanks, now i can sleep |
19:43:19 | FromDiscord | <d4rckh> I feel like the windows api is overcomplicated |
19:43:28 | FromDiscord | <d4rckh> But i think this is just because it's written in a low level language |
19:43:56 | FromDiscord | <Yardanico> In reply to @d4rckh "I feel like the": it's maybe just verbose, not overcomplicated |
19:44:32 | FromDiscord | <d4rckh> Well, from my perspective, it's complicated |
19:51:51 | FromDiscord | <jmgomez> sent a code paste, see https://play.nim-lang.org/#ix=3XoH |
19:52:06 | FromDiscord | <Yardanico> wdym "being compiled"? |
19:52:22 | FromDiscord | <jmgomez> like you are imported from a config.nim file |
19:52:44 | FromDiscord | <jmgomez> I should compile time instead of beign compiled, sorry |
19:52:55 | FromDiscord | <jmgomez> (edit) "I should ... compile" added "say" |
19:53:01 | FromDiscord | <Yardanico> during normal Nim compilation you can use `when nimvm`, but I don't know about nimscript |
19:53:29 | FromDiscord | <jmgomez> okay, that may work. Thanks! |
19:58:46 | Yardanico | PMunch: https://github.com/PMunch/futhark/pull/38 |
19:58:57 | Yardanico | not sure if I should make a PR making futhark use opir.cmd on Windows |
19:59:08 | FromDiscord | <ambient> sent a code paste, see https://play.nim-lang.org/#ix=3XoK |
19:59:14 | Yardanico | as I hacky workaround I can make another proc that calls opir and checks if it exists, and then does the same for opir.cmd |
20:00:19 | FromDiscord | <Yardanico> In reply to @ambient "Is there a better": you can create (or take someone else's) `doWhile` template and use it for this, but it won't really shorten your code as you still need `chunk` to be defined outside of the loop |
20:00:41 | FromDiscord | <ambient> ok ty |
20:00:51 | * | jmdaemon joined #nim |
20:02:34 | PMunch | Yardanico, I guess it could check if it is able to run "opir.cmd" if it is unable to run "opir" |
20:03:00 | Yardanico | sure, I'll add a compileTime proc then that does this for windows |
20:04:43 | Yardanico | PMunch: would http://ix.io/3XoO work ? |
20:04:46 | Yardanico | i mean "be fine" |
20:06:21 | Yardanico | ah wait stupid :DD |
20:06:38 | Yardanico | opir exits with -1 code on correct execution as well, although it does have stuff in the output |
20:07:08 | Yardanico | i guess i need to add opir output to my other PR |
20:07:13 | Yardanico | if output isn't empty |
20:08:05 | PMunch | Are you sure it isn't just because the program returns -1 when called without arguments? |
20:08:32 | Yardanico | PMunch: yeah, I just mean that output isn't empty with -1 if opir exits on its own |
20:08:40 | Yardanico | but gorgeEx returns -1 and empty output if command execution failed |
20:08:57 | Yardanico | i don't really know a good way to add error handling for this :P |
20:13:27 | * | duuuuuude quit (Ping timeout: 240 seconds) |
20:16:31 | * | daemilk joined #nim |
20:18:25 | FromDiscord | <jmgomez> how can one write to a file in nimVM? cant use open/staticWrite/staticExec |
20:19:14 | FromDiscord | <Yardanico> writeFile |
20:19:26 | FromDiscord | <Yardanico> In reply to @jmgomez "how can one write": wait wdym? |
20:21:30 | Yardanico | PMunch: is it intended that opir doesn't exit on CXDiagnostic_Error and only exits on CXDiagnostic_Fatal ? Does it still try to generate stuff even if clang gave a CXDiagnostic_Error ? |
20:22:05 | FromDiscord | <jmgomez> sent a code paste, see https://play.nim-lang.org/#ix=3XoV |
20:22:38 | * | xet7 joined #nim |
20:23:57 | FromDiscord | <jmgomez> oh no sorry that was something else. Let me try it again, I have a mess of trials and errors around here |
20:24:19 | FromDiscord | <Yardanico> yeah, because `writeFile` and `staticRead` work in the VM |
20:24:32 | FromDiscord | <Yardanico> actually `readFile` does as well |
20:26:10 | * | mahlon quit (Ping timeout: 260 seconds) |
20:28:01 | FromDiscord | <jmgomez> yes, just tried it. I was trying with open/staticRead... etc. So three envs, VM, compiler and backends. Have to keep that in mind for some reason I thought that everything that works in the compiler will work too in the vm |
20:36:10 | * | duuuuuude joined #nim |
20:40:26 | PMunch | Yardanico, it's all based on this: https://clang.llvm.org/doxygen/group__CINDEX__DIAG.html#gabff210a02d448bf64e8aee79b2241370 |
20:40:38 | PMunch | I figured as long as it produces results I'm happy |
20:40:42 | FromDiscord | <Yardanico> yeah, that's fine then |
20:57:48 | Yardanico | PMunch: it's actually kind of surprising that libclang can be used for generating Nim stuff in such a short amount of code (even including libclang bindings themselves) |
20:58:00 | Yardanico | I wonder nimterop or other previous projects didn't use the libclang approach before |
20:58:03 | Yardanico | why* |
20:58:13 | PMunch | I know right |
20:58:37 | PMunch | I was surprised by how little was required to get a working result, and how few changes I've had to make since the release |
20:59:16 | * | kenran quit (Quit: WeeChat info:version) |
20:59:36 | Yardanico | yeah, and it works wonders because libclang understands C code pretty good :P |
20:59:50 | Yardanico | much much better than parsers like tree-sitter |
21:00:12 | Yardanico | need to remake my https://github.com/Yardanico/nim-libvlc/ with futhark just for fun |
21:00:46 | Yardanico | but yeah, I hope you add a "standalone file binding" mode in the future that beef asked about as well |
21:00:53 | Yardanico | i mean all those when declared etc and type aliases |
21:01:20 | PMunch | Haha, yeah that is the plan |
21:01:35 | PMunch | Wouldn't be too hard, I just need to find the time.. |
21:01:55 | PMunch | If only I could work on general Nim stuff full time.. |
21:02:44 | PMunch | And yeah, using a C compiler to read C code is quite a neat trick. I mean the level of macro-fuckery it handles is really nice |
21:03:51 | PMunch | I mean I wrote the entire project because my hand-written bindings for a library I was using at work where crumbling under the constant updates that library received. And none of the other Nim tools even came near after days of trying to get them to work. |
21:04:08 | PMunch | I think I spent less time writing Futhark from the ground up than I did struggling with c2nim and nimterop :P |
21:06:15 | * | mahlon joined #nim |
21:10:17 | Yardanico | PMunch: yeah just wrapped libvlc :) |
21:10:57 | Yardanico | the only small issue is that after using my rename callback to remove libvlc_ prefix from functions libvlc's main function is called "new", and when declared(new) returns true because nim also has a "new" function already (with different arguments though) |
21:12:24 | PMunch | Haha, yeah that's a bit of a weird situation |
21:12:47 | PMunch | It was basically done so that you could declare your own versions of types before calling futhark |
21:12:59 | Yardanico | ohh okay, so I can just declare my own new then |
21:13:14 | PMunch | Or you can have a special case in your rename callback |
21:13:19 | FromDiscord | <Yardanico> true |
21:13:21 | PMunch | And call it something else |
21:13:59 | PMunch | All that logic is based on a gripe I had with the other wrapping tools which was that if it messed up there was no easy way to say "hey I know what I'm doing, just use this definition instead" |
21:14:27 | PMunch | Turns out, Futhark is really good and messes up a lot less often, so I haven't really used the feature nearly as much as I thought I would. |
21:15:18 | PMunch | Now it mostly just ensures that it doesn't create errors because it tries to redefine something like file or int |
21:26:26 | * | PMunch quit (Quit: leaving) |
21:35:24 | * | averell quit (Quit: .) |
22:07:08 | * | jmd_ joined #nim |
22:07:50 | * | jmdaemon quit (Ping timeout: 240 seconds) |
22:10:57 | FromDiscord | <ambient> sent a code paste, see https://play.nim-lang.org/#ix=3Xpl |
22:17:24 | * | cyraxjoe quit (Ping timeout: 250 seconds) |
22:19:33 | * | Gustavo6046_ joined #nim |
22:19:37 | * | Gustavo6046 quit (Ping timeout: 248 seconds) |
22:20:28 | * | Gustavo6046_ is now known as Gustavo6046 |
22:33:29 | * | cyraxjoe joined #nim |
22:41:44 | FromDiscord | <!Patitotective> I'm having problems with mingw not founding `libwinpthread-1.dll` and I was wondering if choosenim did add mingw to the path when it downloaded it? https://github.com/xmonader/nimassets/issues/14 |
22:42:03 | FromDiscord | <!Patitotective> (edit) "did add" => "adds" | "when it downloaded" => "after downloading" |
22:48:54 | * | averell joined #nim |
23:09:51 | * | ltriant joined #nim |
23:12:21 | * | ltriant_ quit (Ping timeout: 256 seconds) |
23:13:17 | * | lumo_e quit (Remote host closed the connection) |
23:22:11 | * | jmdaemon joined #nim |
23:22:28 | * | jmd_ quit (Ping timeout: 246 seconds) |
23:27:18 | rockcavera | Patitotective you can try install tdm gcc, it compile static binary, without dependency |
23:27:30 | rockcavera | or compile with --passC:-static |
23:28:37 | rockcavera | how did you install Nim? |
23:31:14 | FromDiscord | <!Patitotective> im installing it from a github workflow https://github.com/iffy/install-nim/blob/master/install-nim.sh#L163 :p |
23:31:20 | FromDiscord | <!Patitotective> (edit) "from" => "though" |
23:31:25 | FromDiscord | <!Patitotective> (edit) "though" => "through" |
23:31:35 | FromDiscord | <!Patitotective> in windows |
23:33:56 | rockcavera | do you know if gcc is in the %PATH% variable? |
23:34:30 | rockcavera | open cmd and type: gcc -v |
23:35:13 | rockcavera | usually this dll is in the "bin" folder of the mingw compiler |
23:36:50 | * | duuuuuude quit (Ping timeout: 240 seconds) |
23:41:30 | FromDiscord | <!Patitotective> ? |
23:41:31 | FromDiscord | <!Patitotective> sent a code paste, see https://play.nim-lang.org/#ix=3Xpy |
23:41:33 | FromDiscord | <!Patitotective> sent a code paste, see https://paste.rs/dkn |