<< 10-05-2023 >>

00:11:12FromDiscord<Girvo> A more general question that Nim-specific (though it will inform what I implement in the library I'm building) -- are there any other higher level locking/synchronisation tools that one can build on top of semaphores/mutexes/etc. similar to a readers-writer lock?
00:40:00*derpydoo joined #nim
00:41:45FromDiscord<Nlits (Ping on reply)> sent a code paste, see https://play.nim-lang.org/#ix=4vyp
00:41:48FromDiscord<Girvo> sent a code paste, see https://play.nim-lang.org/#ix=4vyq
00:42:26FromDiscord<Elegantbeef> There is no way of locking mutability down girvo
00:42:27FromDiscord<Girvo> (edit) "https://play.nim-lang.org/#ix=4vyq" => "https://play.nim-lang.org/#ix=4vyr"
00:42:31FromDiscord<Girvo> Damn 😦
00:42:41FromDiscord<Elegantbeef> you need to do `let example = example` inside a `if true:` or `block:`
00:43:15FromDiscord<Nlits (Ping on reply)> In reply to @Elegantbeef "you need to do": what do u mean? Like `let example = block:`?
00:43:40FromDiscord<Elegantbeef> That was to girvo
00:43:49FromDiscord<Nlits (Ping on reply)> In reply to @Elegantbeef "That was to girvo": oh, sory
00:44:14FromDiscord<Girvo> sent a code paste, see https://paste.rs/g5g
00:44:16FromDiscord<Girvo> Yeah I see now okay
00:44:23FromDiscord<Girvo> Better than nothing!
00:44:42FromDiscord<Nlits (Ping on reply)> In reply to @not logged in "What is wrong with": I swear this is exactly the same as the docs
00:44:55FromDiscord<Elegantbeef> It of course might not copy if copy elision kicks in
00:45:39FromDiscord<Girvo> Yeah... probably dangerous to rely on entirely. Probably just stick to careful code reviews haha. We're not using RW locks often at least
00:45:45*nanxiao joined #nim
00:45:58FromDiscord<Elegantbeef> https://nim-lang.org/docs/destructors.html#cursor-inference-slash-copy-elision if you didnt know
00:46:55FromDiscord<Elegantbeef> Tracked mutability is a hell of an optimiser 😄
00:47:55FromDiscord<Nlits (Ping on reply)> In reply to @not logged in "I swear this is": oh wait, it is sorted not sort...
00:47:59FromDiscord<Girvo> It'd show in the C output if it has, right?
00:48:22FromDiscord<Elegantbeef> Correct girvo
00:48:31FromDiscord<Girvo> Sweet, I'll do some digging
00:48:50FromDiscord<Elegantbeef> You also can explicitly do `let example {.cursor.} = example` though no clue about the semantics there
00:49:04FromDiscord<Elegantbeef> This of course only makes sense for types that have heap allocations with a copy
00:49:21FromDiscord<Elegantbeef> Since you cannot remove a copy from a stack value without introducing a `ptr`
00:49:33FromDiscord<Girvo> Of course. Which in this case, they do, they're "large" ish objects on the heap shared across threads guarded by a RwLock
00:49:41FromDiscord<Elegantbeef> Actually i'm dumb
00:49:50FromDiscord<Elegantbeef> For direct variables i think it does remove a copy
00:49:55FromDiscord<Girvo> Oh neat
00:49:59FromDiscord<Elegantbeef> Since aliasing is easily checkable
00:50:06FromDiscord<Girvo> Yeah that makes sense tbh
00:50:33FromDiscord<Elegantbeef> In the case of `let a = a` you can just paste the original a everyhwere it was used since you have all that static analysis
00:52:23FromDiscord<Girvo> Could a withReadLock template not wrap your `bdy: untyped` into this `block: let data = data` if the template knows (or is told) about the guarded variable? Or does that not work the way I think it would
00:53:02FromDiscord<Elegantbeef> I mean it's a macro
00:53:15FromDiscord<Elegantbeef> You can rewrite the internals as much as you want
00:53:20FromDiscord<Girvo> I guess in some ways its probably better to have the `let a = a` block be explicit, especially if we're relying on copy elision to avoid memory usage. I'll have a play with it in the prod code base and see what it spits out on the C end with our usage
00:54:04FromDiscord<Girvo> Yeah I guess I'm wondering aloud whether hiding that would confuse rather than clear up things
00:54:20FromDiscord<Elegantbeef> It'd be less error prone
00:54:28FromDiscord<Elegantbeef> Since you now shadow an immutable version of the lock internally
00:54:44FromDiscord<Girvo> Mm
00:55:07FromDiscord<Elegantbeef> Basically for a `dotExpr` you'd shadow the highest level expression if it's a symbol(it's actually the deepest in the AST)
00:55:10FromDiscord<Girvo> I'll have a crack at it. It'd need this "object that holds the lock and the data" for it to work though
00:55:44FromDiscord<Elegantbeef> It might not be worth the trouble to do, who knows
00:56:02FromDiscord<Girvo> Yeah I'll timebox it. It'd be a _really_ nice end result, if it works
00:56:55FromDiscord<Girvo> And honestly for a RwLock, having the lock be seperate from the data variable is somewhat unneeded anyway, as its supposed to be 1:1 anyway
00:56:55FromDiscord<Elegantbeef> Well if you make a specialised `withReadLock` for the type you're using that uses that lock it should not be a big deal
00:57:06FromDiscord<Girvo> Yeah thats the plan
00:57:32FromDiscord<Elegantbeef> 😄
00:57:36FromDiscord<Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=4vys
00:57:37FromDiscord<Elegantbeef> whoops
00:57:40FromDiscord<Elegantbeef> `rl.lock is Lock`
00:58:12FromDiscord<Girvo> hehe. hmm okay I'm definitely having a crack at this today
00:58:18FromDiscord<Elegantbeef> Then you do not even need to do `withReadLock(myData.lock)` it's just `withReadLock(myReadLock)`
00:58:33FromDiscord<Elegantbeef> And since you know it's a `readLock` you can just emit your `let myReadLock {.cursor.} = myReadLock`
00:58:45FromDiscord<Girvo> yeah this seems feasible
00:59:18FromDiscord<Girvo> Alright brb lol
00:59:41FromDiscord<Elegantbeef> @Girvo\: will note that you should only use `block` if you want to enable `break blockName` otherwise use `if true`
00:59:58FromDiscord<Elegantbeef> `if true` does not block `break` so you can still use `withReadLock` inside an iterator
01:00:18FromDiscord<Elegantbeef> `block` eats a break so you cannot escape loops with it
01:00:40FromDiscord<Girvo> Oh thats good to know, cheers
01:02:17FromDiscord<Girvo> That actually impacts my freertos_tasks impl too, thats super good to know
01:02:31FromDiscord<Elegantbeef> It's why they keep me around
01:09:52*beholders_eye quit (Ping timeout: 248 seconds)
01:35:32*nanxiao quit (Quit: Client closed)
02:29:24*derpydoo quit (Quit: derpydoo)
02:30:33*derpydoo joined #nim
02:48:49*nanxiao joined #nim
03:03:05*rockcavera quit (Remote host closed the connection)
03:15:45FromDiscord<voidwalker> wouldn't it be nice if people could have their own channel here under a "Projects" category ?
03:17:53FromDiscord<voidwalker> You can only join so many discord servers (100), and thus people less likely to bother, or take the time to click on it once joined. I think it would improve visibility and participation a lot if allowed to host project based chats here
03:18:26FromDiscord<voidwalker> (edit) "click on" => "check" | "checkit ... oncehere." added "out often" | "here" => "here."
03:20:38*nanxiao quit (Quit: Client closed)
03:21:31FromDiscord<Elegantbeef> You're right we should use matrix and add each room to the space under "community"
03:22:14NimEventerNew thread by terrygils: Clearer copyright license for Nim logos and assets, see https://forum.nim-lang.org/t/10188
03:24:57*nanxiao joined #nim
04:11:45NimEventerNew Nimble package! nimipdf - Nim library that adds a PDF backend for nimib, see https://neroist.github.io/nimipdf/index.pdf
04:56:14*nanxiao quit (Quit: Client closed)
05:11:55FromDiscord<Girvo> sent a code paste, see https://play.nim-lang.org/#ix=4vyS
05:13:06FromDiscord<Elegantbeef> Make a property for `.a`
05:14:05FromDiscord<Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=4vyV
05:14:06FromDiscord<Elegantbeef> Draw the rest of the owl
05:15:34FromDiscord<Girvo> Ah yeah, I'm with you. Sweet
05:15:39FromDiscord<Girvo> Cheers 🙂
05:17:34FromDiscord<Elegantbeef> Rust devs hate this one simple trick
05:21:44*azimut quit (Ping timeout: 240 seconds)
05:30:31FromDiscord<Rika> Why the backticks
05:30:42FromDiscord<Elegantbeef> I was thinking of a setter
05:30:48FromDiscord<Elegantbeef> As I always do
05:40:54*advesperacit joined #nim
06:12:56FromDiscord<Dudugz> sent a code paste, see https://play.nim-lang.org/#ix=4vyY
06:13:25FromDiscord<Elegantbeef> Purely cause it's unimplemented
06:13:44FromDiscord<Dudugz> But it could be implemented, using Option feels weird.
06:13:45FromDiscord<Elegantbeef> Also why wouldnt it be `int?` if we were going to add it
06:14:34FromDiscord<Dudugz> Why would it be an optional value? It would be the same as Option.isNone() just more straightforward
06:14:40FromDiscord<Dudugz> a !== nil
06:15:16FromDiscord<Dudugz> (edit) "a !== nil" => "``a != nil`` instead of ``a.isNone()``"
06:15:36FromDiscord<Dudugz> You could also use ``a`` directly instead of having to fetch the value in Option
06:15:46FromDiscord<Dudugz> (edit) "Why" => "Because"
06:16:01FromDiscord<Dudugz> (edit) "would it" => "it'd" | "value?" => "value"
06:17:45FromDiscord<Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=4vyZ
06:18:29FromDiscord<Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=4vz0
06:18:39FromDiscord<Dudugz> Hm yea, I forgot that Nim allows you to create macros :v
06:19:28FromDiscord<Dudugz> It's interesting how simple it is to add new features to the language without having to think too much lol. Imagine implementing all this in parser and lexer how boring it would be.
06:20:05FromDiscord<Elegantbeef> sent a code paste, see https://play.nim-lang.org/#ix=4vz1
06:20:24FromDiscord<Elegantbeef> Sadly a converter to generics doesnt work so you'd need like `converter toOpt(i: int): Option[int] = some(i)`
06:21:02FromDiscord<Dudugz> Yea, but still you depend on Option and need to wrap the values, the idea was to do this natively without needing to wrap the values ​​in none or some
06:23:27FromDiscord<Dudugz> sent a code paste, see https://play.nim-lang.org/#ix=4vz3
06:23:28FromDiscord<Elegantbeef> I mean if you write that converter you do not need to wrap them
06:23:42FromDiscord<Elegantbeef> The only issue is you need to write the converter for each type or use a template to emit it
06:23:42FromDiscord<Dudugz> In reply to @Elegantbeef "I mean if you": Hm, yea
06:25:01FromDiscord<Dudugz> An easier way would be to use toBase and an Option itself since refs are nilable
06:25:28om3gawhat does this proc, returns value if it exist?
06:26:00FromDiscord<Elegantbeef> Which proc?
06:26:07om3ga'a'
06:26:36FromDiscord<Dudugz> sent a code paste, see https://paste.rs/Hqo
06:26:46FromDiscord<Elegantbeef> The one wrote for girvo ages ago returns none(int) if `exp` doesnt exist otherwise returns whatever `a` is
06:26:56FromDiscord<Elegantbeef> So if it's `none` it returns `none` else it returns `some`
06:27:46om3gayeah, and what rust devs hate? I have friend to troll
06:27:51om3ga:)
06:27:53FromDiscord<Elegantbeef> Properties
06:27:57FromDiscord<Elegantbeef> Rust doesnt have properties
06:28:07om3gaaah, ok ))))
06:28:09om3gathanks
06:28:09FromDiscord<Elegantbeef> in Rust you'd probably name it like `get_a` or w/e
06:28:11FromDiscord<Dudugz> lol
06:28:27FromDiscord<Elegantbeef> Really in Rust you'd use patter matching
06:28:42FromDiscord<Elegantbeef> `if let Some(Some(i))...`
06:28:54FromDiscord<Dudugz> Yea, I tried Rust for 1 month, pure suffering.
06:29:12FromDiscord<Elegantbeef> I've never tried it but i've looked at it
06:29:27om3gaElegantbeef, yeah, nice
06:30:32om3gain my C code I coded my own helper functions for that reasons
06:31:32om3gawith use of specific value mappings, like lists
06:33:45*nanxiao joined #nim
07:00:55*frenchboy[m] quit (Quit: Bridge terminating on SIGTERM)
07:21:55FromDiscord<Rika> I like pattern matching but I think rust doesn’t do it that well
07:22:06FromDiscord<Rika> Then again I’m spoiled by the more functional languages
07:33:59*lucas_ta joined #nim
07:34:02*lucasta quit (Read error: Connection reset by peer)
07:36:21*PMunch joined #nim
07:43:18FromDiscord<sOkam!> sent a code paste, see https://play.nim-lang.org/#ix=4vzb
07:52:59*PMunch quit (Quit: Leaving)
08:02:56FromDiscord<sOkam!> found it. i was recursively calling a constructor function
08:03:44*PMunch joined #nim
08:16:25*derpydoo quit (Read error: Connection reset by peer)
08:19:23*PMunch quit (Quit: Leaving)
08:34:16*PMunch joined #nim
08:37:58*PMunch quit (Client Quit)
08:40:38*PMunch joined #nim
08:41:26*frenchboy[m] joined #nim
08:45:24*PMunch quit (Client Quit)
08:48:06*PMunch joined #nim
08:52:18*PMunch quit (Client Quit)
08:54:13*PMunch joined #nim
09:02:28*PMunch quit (Quit: Leaving)
09:12:28*PMunch joined #nim
09:17:15om3gais there any method to get the size of seq[seq[char]]?
09:18:37*PMunch quit (Quit: Leaving)
09:18:39om3gaor I should calculate it in a loop by tacking lengths of all seq[char] ?
09:19:27*nanxiao quit (Quit: Client closed)
09:28:51*nanxiao joined #nim
09:38:02*PMunch joined #nim
10:01:56FromDiscord<voidwalker> I don't think there's any other way than `seq2D.mapIt(it.len).sum` except if the "columns" have equal length, of course
10:05:47*nanxiao quit (Quit: Client closed)
10:06:34FromDiscord<Rika> foldl
10:06:37FromDiscord<Rika> please use foldl
10:07:39FromDiscord<Rika> seq2D.foldl(a + b.len)
10:07:53FromDiscord<Rika> wait
10:07:57FromDiscord<Rika> (edit) "b.len)" => "b.len, 0)"
10:08:02FromDiscord<voidwalker> indeed
10:13:22om3gaThanks, I will try now
10:18:07*Notxor joined #nim
10:20:11NimEventerNew question by Ovqou: What c compiler does nim use to make exe file?, see https://stackoverflow.com/questions/76217249/what-c-compiler-does-nim-use-to-make-exe-file
10:23:02om3gaRika, voidwalker, works great, thanks a lot!
10:34:44*lucas__ta joined #nim
10:39:47*lucas_ta quit (Ping timeout: 264 seconds)
10:51:14NimEventerNew thread by alexeypetrushin: Fswatch, non blocking usage?, see https://forum.nim-lang.org/t/10189
11:23:43*lucas__ta quit (Read error: Connection reset by peer)
12:10:23FromDiscord<Nerve> In reply to @Rika "Then again I’m spoiled": Same, spoiled by Lisp, so a lot of what Rust is trying seems...hobbled by the memory semantics.
12:10:51FromDiscord<Rika> I really should try some Lisp some time
12:11:54FromDiscord<Nerve> Janet's probably a good way to start, it's a very capable scripting language halfway between Python and Lua. Scripts can be bundled in an exe with the interpreter for independent binaries. C-interop. Can probably play nice with Nim.
12:21:35*Mister_Magister quit (Ping timeout: 260 seconds)
12:29:08*Notxor quit (Remote host closed the connection)
12:36:10*jmdaemon quit (Ping timeout: 260 seconds)
12:41:42*Mister_Magister joined #nim
12:48:19FromDiscord<willyboar> Janet's creator has create another one lisp that compiles to lua. Fennel
12:48:59FromDiscord<willyboar> I heard best for both.
12:49:01FromDiscord<Rika> So is Janet abandoned or something
12:49:24FromDiscord<willyboar> No it was very active last time I checked
12:51:18FromDiscord<Nerve> Quite active
12:51:59FromDiscord<willyboar> A static typed Janet would be cool
12:53:10FromDiscord<Nerve> Eh, that seems to go against the Lisp philosophical approach. If you really really want a statically typed Lisp, there's Carp, but I don't know how active that project is
12:54:23FromDiscord<willyboar> Yes but Janet is not compatible with lisp I think, it has just lispy syntax.
12:54:48FromDiscord<Nerve> Not sure what that means, most Lisps can't really talk to each other
12:54:59FromDiscord<Nerve> Not at a binary level anyways
12:56:22FromDiscord<willyboar> There was a nice repo that sorts lis languages to categories . Let me search for it.
12:56:32FromDiscord<Nerve> Oh, the various types
12:56:34FromDiscord<willyboar> (edit) "lis" => "lisp"
12:56:42FromDiscord<Nerve> Janet's a Clojure-type by that list's definition
12:56:50FromDiscord<Nerve> Mainly by syntactic similarities
12:57:35FromDiscord<Nerve> Semantically it's sort of on its own because it backs its data with arrays and dynamic tables written in C
12:57:57FromDiscord<willyboar> https://github.com/dundalek/awesome-lisp-languages
12:59:16FromDiscord<Nerve> I'm still not sure what you mean by "not compatible with Lisp"
12:59:31FromDiscord<Nerve> If you mean it's not a Common Lisp dialect, then yes
12:59:36FromDiscord<willyboar> Type L or type S
12:59:45*rockcavera joined #nim
12:59:48FromDiscord<Nerve> Yup
13:00:13FromDiscord<willyboar> In the repo Janet is in the same type with carp
13:07:10FromDiscord<Nerve> That's because they take syntactic inspiration from Clojure
13:07:29FromDiscord<Nerve> Carp is semantically VERY different however, given it's a borrow-checked statically typed compiled language
13:08:20FromDiscord<Nerve> And Clojure is semantically different from either given it runs on the JVM and uses immutable persistent data structures
13:08:29FromDiscord<Nerve> So the similarity is only aesthetic
13:15:57*krux02 joined #nim
13:27:05FromDiscord<michaelb.eth> for a typed lisp in the scheme family, Typed Racket is worth a look
13:28:04FromDiscord<michaelb.eth> https://github.com/racket/typed-racket
13:42:05*PMunch quit (Quit: Leaving)
13:56:17FromDiscord<pysan> sent a code paste, see https://play.nim-lang.org/#ix=4vAD
14:05:17*azimut joined #nim
14:13:22FromDiscord<Rika> how do you use this macro?
14:13:33FromDiscord<Rika> runnableexamples blocks are meant to go inside function definitions
14:16:59*Notxor joined #nim
14:23:29FromDiscord<pysan> I write simple tests for that single file in `when isMainModule:` but I want to display that content inside the doc's top section as well (using top level `runnableExamples`). Something like this example, above `Imports` https://nim-lang.org/docs/jsonutils.html
14:34:51FromDiscord<sa-code> Hey. Underscore insensitivity drives me mad. There's no reason `i_stop` and `is_top` should be the same thing
14:36:21FromDiscord<jtv> It's not fully insensitive... it rejects double underscores 🤯
14:36:34FromDiscord<jtv> And trailing ones too
14:36:45FromDiscord<sa-code> That makes it worse
14:37:19FromDiscord<sa-code> Makes me want to give up not gonna lie
14:37:20FromDiscord<Nerve> Is that a real example of variable naming that is bothering you in your project?
14:39:20FromDiscord<jtv> Double underscore is a practical issue, it's definitely long been used to set off internal stuff, same with trailing underscore
14:39:37FromDiscord<jtv> You can't even put it in backticks and have it work
14:43:09FromDiscord<deech> In reply to @sa-code "Hey. Underscore insensitivity drives": Yep, I've run into variations of your issue several times. IMO it's a misfeature, your best bet is to stick with camel case. 🤷
14:44:57FromDiscord<jtv> I agree, and that sucks because that's a religious battle, and I shouldn't be forced into anything for minor religious battles :). I think CamelCase becomes hard to read when you've got abbreviations, etc.
14:45:37FromDiscord<pysan> Please someone make a very opinionated formatter that auto renames all vars to camel case (or anything _consistant_) except when there's `# fmt: ignore` comment or smtg like that
14:46:40FromDiscord<jtv> Go for it. There isn't a good, flexible format tool at all, so it's a definite need. But, doing a good job is a really hard project
14:48:23FromDiscord<Evissim> Can anyone point me in the right direction for how to bind/interact with templated C++ classes?
14:49:20*beholders_eye joined #nim
14:49:43FromDiscord<deech> In reply to @Evissim "Can anyone point me": I have an example of binding to `std::vector` and `std::string`. https://github.com/deech/NimNuggets/blob/master/backup/cppvector.nim
14:50:23FromDiscord<deech> And type level factorial. https://github.com/deech/NimNuggets/blob/master/backup/factorial.nim
14:51:01FromDiscord<Evissim> Thank you! I'll take a peek 😄
15:01:56FromDiscord<mratsim> In reply to @Evissim "Can anyone point me": several here as well: https://github.com/SciNim/flambeau/blob/master/flambeau/raw/bindings/c10.nim
15:12:05*Notxor quit (Quit: Leaving)
15:17:43NimEventerNew Nimble package! lorem - Nim library that generates "Lorem ipsum" text., see https://github.com/neroist/lorem
15:33:52FromDiscord<gloopsies> sent a code paste, see https://play.nim-lang.org/#ix=4vB1
15:37:01*beholders_eye quit (Ping timeout: 240 seconds)
15:37:22FromDiscord<gloopsies> Oh, I'm just stupid... Had the same type implemented in 2 places and they tehnicaly aren't the same thing
15:37:30NimEventerNew thread by Antichristos: Macros - object.method, see https://forum.nim-lang.org/t/10190
16:07:38*jmdaemon joined #nim
16:20:07FromDiscord<that_dude> In reply to @Evissim "Can anyone point me": https://scripter.co/binding-nim-to-c-plus-plus-std-list/ How close is this to what you're looking for?
16:32:29FromDiscord<Evissim> sent a code paste, see https://paste.rs/5Ou
16:47:06*arkurious joined #nim
16:47:09*arkurious quit (Remote host closed the connection)
16:52:34*beholders_eye joined #nim
17:33:11*beholders_eye quit (Ping timeout: 246 seconds)
17:41:40*demetera joined #nim
17:58:51FromDiscord<nqeron> sent a code paste, see https://play.nim-lang.org/#ix=4vBu
18:03:15*demetera quit (Remote host closed the connection)
18:04:03*demetera joined #nim
18:06:31*beholders_eye joined #nim
18:13:37*demetera quit (Quit: Leaving)
18:15:58*lucasta joined #nim
18:26:43FromDiscord<decoded> How can I access the clipboard? I want to write a verification link to my user's clipboard and then also check if they copied the code from said link by checking their clipboard
19:02:31FromDiscord<qb> `nimble search clipboard`
19:40:53*Notxor joined #nim
19:50:46*rockcavera quit (Read error: Connection reset by peer)
19:51:20*rockcavera joined #nim
19:51:21*rockcavera quit (Changing host)
19:51:21*rockcavera joined #nim
20:28:37*progranner joined #nim
20:34:46*advesperacit quit ()
21:09:03*progranner quit (Quit: My Mac has gone to sleep. ZZZzzz…)
21:15:30*xet7 quit (Read error: Connection reset by peer)
21:16:20*progranner joined #nim
21:29:36*progranner quit (Quit: My Mac has gone to sleep. ZZZzzz…)
21:31:20*progranner joined #nim
21:32:17*xet7 joined #nim
21:37:28*demetera joined #nim
21:48:16*progranner quit (Quit: My Mac has gone to sleep. ZZZzzz…)
21:51:08*progranner joined #nim
22:04:02*progranner quit (Quit: My Mac has gone to sleep. ZZZzzz…)
22:16:33NimEventerNew post on r/nim by deadkonsumer: Simple Gamepad Support, see https://reddit.com/r/nim/comments/13e54oc/simple_gamepad_support/
22:25:31*demetera left #nim (Leaving)
22:25:48*demetera joined #nim
22:25:56*demetera quit (Quit: Leaving)
22:26:50*beholders_eye quit (Ping timeout: 246 seconds)
23:00:29*Notxor quit (Remote host closed the connection)
23:02:12*Mister_Magister quit (Ping timeout: 265 seconds)
23:52:40FromDiscord<pysan> In reply to @pysan "Please someone make a": Found this. Haven’t tested yet but looks promising?↵↵https://github.com/FedericoCeratto/nimfmt