<< 05-11-2019 >>

00:00:28*mofeng joined #nim
00:19:01*LyndsySimon quit (*.net *.split)
00:19:01*surma quit (*.net *.split)
00:22:22*abm quit (Quit: Leaving)
00:24:15*LyndsySimon joined #nim
00:24:15*surma joined #nim
00:24:50*GordonBGood_ quit (Ping timeout: 240 seconds)
00:31:01*nif_ quit (Quit: ...)
00:31:11*nif joined #nim
00:42:14*krux02_ joined #nim
00:44:53*krux02 quit (Ping timeout: 245 seconds)
00:48:53*LyndsySimon quit (*.net *.split)
00:48:53*surma quit (*.net *.split)
00:54:19*LyndsySimon joined #nim
00:54:19*surma joined #nim
01:12:19*couven92 quit (Quit: Client Disconnecting)
01:17:29*kevin- joined #nim
01:18:08*dddddd quit (Remote host closed the connection)
01:21:14*uu91 quit (Ping timeout: 265 seconds)
01:40:21*jwm2241 quit (Quit: WeeChat 2.7-dev)
01:43:21*seni quit (Quit: Leaving)
01:43:36*jwm2241 joined #nim
01:45:38*ponyrider quit (Ping timeout: 240 seconds)
01:48:44*LyndsySimon quit (*.net *.split)
01:48:44*surma quit (*.net *.split)
01:54:00FromDiscord<++x;> Tensorflow fanboys
01:54:03FromDiscord<++x;> Typical
01:54:27*LyndsySimon joined #nim
01:54:27*surma joined #nim
02:02:15*krux02_ quit (Ping timeout: 250 seconds)
02:04:53*krux02 joined #nim
02:17:56*ng0 quit (Quit: Alexa, when is the end of world?)
02:19:15*Jjp137 quit (Read error: Connection reset by peer)
02:22:17*Jjp137 joined #nim
02:26:18*Jjp137 quit (Read error: Connection reset by peer)
02:27:38*Jjp137 joined #nim
02:43:34*kevin- quit (Ping timeout: 268 seconds)
02:48:49*LyndsySimon quit (*.net *.split)
02:48:49*surma quit (*.net *.split)
02:53:54*LyndsySimon joined #nim
02:53:54*surma joined #nim
03:21:47*theelous3_ joined #nim
03:23:02*theelous3 quit (Ping timeout: 268 seconds)
03:25:40disruptekthis `splitPath` change has broken all of the aws apis.
03:50:30*dchem joined #nim
04:29:00*notgne2 quit (Quit: ZNC 1.7.3 - https://znc.in)
04:31:51*notgne2 joined #nim
04:41:00*kevin- joined #nim
04:53:23*nsf joined #nim
04:54:19*chemist69 quit (Ping timeout: 252 seconds)
04:56:13*chemist69 joined #nim
05:05:01*kevin- quit (Ping timeout: 265 seconds)
05:05:32*dchem quit (Quit: WeeChat 2.4)
05:05:51*dchem joined #nim
05:07:43FromDiscord<Bub_Lite_63_Jr> I wanted to switch from a manual install to a brew install, so I removed the .nimble and the .chosennim files in my home folder (on mac) and ran `brew install nim`
05:08:05FromDiscord<Bub_Lite_63_Jr> I'm getting compiler errors now about missing headers, so I assume I did something incorrectly
05:08:42FromDiscord<Bub_Lite_63_Jr> ```
05:08:42FromDiscord<Bub_Lite_63_Jr> Josephs-MBP-15:nim_test josephlyons$ nim compile --run hello.nim
05:08:43FromDiscord<Bub_Lite_63_Jr> Hint: used config file '/usr/local/Cellar/nim/1.0.2/nim/config/nim.cfg' [Conf]
05:08:43FromDiscord<Bub_Lite_63_Jr> Hint: system [Processing]
05:08:43FromDiscord<Bub_Lite_63_Jr> Hint: widestrs [Processing]
05:08:43FromDiscord<Bub_Lite_63_Jr> Hint: io [Processing]
05:08:45FromDiscord<Bub_Lite_63_Jr> Hint: hello [Processing]
05:08:46FromDiscord<Bub_Lite_63_Jr> CC: stdlib_io.nim
05:08:48FromDiscord<Bub_Lite_63_Jr> CC: stdlib_system.nim
05:08:49FromDiscord<Bub_Lite_63_Jr> CC: hello.nim
05:08:53FromDiscord<Bub_Lite_63_Jr> Error: execution of an external compiler program 'clang -c -w -I/usr/local/Cellar/nim/1.0.2/nim/lib -I/Users/josephlyons/Programming/Nim/nim_test -o /Users/josephlyons/.cache/nim/hello_d/@mhello.nim.c.o /Users/josephlyons/.cache/nim/hello_d/@mhello.nim.c' failed with exit code: 1
05:08:55FromDiscord<Bub_Lite_63_Jr>
05:08:57FromDiscord<Bub_Lite_63_Jr> /Users/josephlyons/.cache/nim/hello_d/@mhello.nim.c:10:10: fatal error: 'stdio.h' file not found
05:08:59FromDiscord<Bub_Lite_63_Jr> #include <stdio.h>
05:09:00FromDiscord<Bub_Lite_63_Jr> ^~~~~~~~~
05:09:01FromDiscord<Bub_Lite_63_Jr> 1 error generated.
05:09:03FromDiscord<Bub_Lite_63_Jr> Josephs-MBP-15:nim_test josephlyons$
05:09:05FromDiscord<Bub_Lite_63_Jr> ```
05:24:56FromDiscord<++x;> Java makes me cry
05:26:49FromDiscord<++x;>
05:26:50FromDiscord<++x;> https://cdn.discordapp.com/attachments/371759389889003532/641146378248257546/Screenshot_20191104-232420.png
05:30:00FromDiscord<Rai Nathan Famakai II> > deleting messages
05:34:57*rockcavera quit (Remote host closed the connection)
05:38:27*GordonBGood joined #nim
05:44:14*kevin joined #nim
05:44:37*kevin is now known as Guest67576
05:44:47*Guest67576 is now known as kevin-
05:48:44*LyndsySimon quit (*.net *.split)
05:48:44*surma quit (*.net *.split)
05:48:58*surma joined #nim
05:49:09*LyndsySimon joined #nim
05:59:16FromGitter<zetashift> Bub_Lite_63_Jr for long messages please use a pastebin; formatting doesn't go through the bridges correctly
05:59:58FromGitter<zetashift> as for your error, you might need to install clang? `xcode-select --install` from: https://nim-lang.org/install_unix.html
06:07:10FromGitter<gogolxdong> @maxadjsky we have a Chinese community QQ group 624680081
06:26:03*nisstyre joined #nim
06:27:39nisstyreHow do I contribute to the nim manual?
06:29:48Zevvcheckout the nim repository, edit the files in place and create a git PR
06:30:07Zevvif you don't know how to do that, people here will be glad to help you out
06:30:25nisstyreshould be good, I just wasn't sure if I need anything else
06:30:33Zevvnope.
06:31:05Zevvmuch appreciated work!
06:35:27*narimiran joined #nim
06:41:41*Kevin-NimBot joined #nim
06:43:49*Kevin-NimBot quit (Remote host closed the connection)
06:46:58*jwm2241 quit (Ping timeout: 245 seconds)
06:52:24*jwm2241 joined #nim
07:00:19*jwm2241 quit (Quit: WeeChat 2.7-dev)
07:03:27*Kevin-NimBot joined #nim
07:04:20*Kevin-NimBot quit (Remote host closed the connection)
07:10:21*go|dfish quit (Ping timeout: 250 seconds)
07:12:26*dchem quit (Ping timeout: 268 seconds)
07:23:47*go|dfish joined #nim
07:27:13*solitudesf joined #nim
07:30:31*ftsf joined #nim
07:38:05*PMunch joined #nim
07:45:37*kevin- quit (Remote host closed the connection)
07:46:27*kevin- joined #nim
08:00:00*gmpreussner quit (Quit: kthxbye)
08:00:11*theelous3_ quit (Ping timeout: 276 seconds)
08:04:56*gmpreussner joined #nim
08:07:49*ng0 joined #nim
08:17:07*kevin- quit (Remote host closed the connection)
08:19:35*filcuc joined #nim
08:30:45*Guest62919 joined #nim
08:30:54*Guest62919 is now known as kevin-
08:53:34Araqping shashlick
09:01:47*Vladar joined #nim
09:09:00PMunchHmm, is there a way to get the filename of a DLL/so from within itself?
09:09:45PMunchSo when I load /home/peter/mydynlib.so from a program in say /etc/program I want to get /home/peter/
09:09:56*GordonBGood quit (Quit: Always try to be modest, and be proud about it!)
09:11:01*ftsf quit (Read error: Connection reset by peer)
09:15:07AraqI dunno.
09:19:02*mofeng quit (Quit: My iMac has gone to sleep. ZZZzzz…)
09:21:38FromGitter<alehander42> hm test
09:21:46FromGitter<alehander42> oh no, it doesnt see it
09:22:19FromGitter<alehander92> ah ok, nvm
09:22:22*floppydh joined #nim
09:23:14*kevin- quit (Ping timeout: 240 seconds)
09:25:07ZevvPMunch: there is not portable way for that
09:25:27PMunchZevv, yeah I realised..
09:25:52ZevvIf you don't care and can accept a hackish way, dereference /proc/self/exe and run `ldd` on it
09:25:55PMunchWrapping up something with dladdr and GetModuleHandleEx/GetModuleFileName now
09:26:17Zevvwhatever works for you, I'd say :)
09:26:53PMunchYeah dladdr should be fine, it should be available on any GNU system
09:27:09PMunchAnd GetModuleHandleEx/GetModuleFileName should be there for Windows
09:28:58AraqWindows is usually fine when it comes to DLLs.
09:35:29PMunchWhat do you mean?
09:37:20Zevvthat he thinks shared libraries are messy on linux
09:40:15PMunchWell, they are different kind of messy
09:41:16PMunchUgh, what's up with creating their own types for everything in Windows: https://docs.microsoft.com/en-gb/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandleexa?redirectedfrom=MSDN
09:41:59Zevvenjoying yourself?
09:43:21PMunchTime of my life
09:43:22Araqit's legacy and a (rather poor) attempt to get more type safety
09:43:47Araqall the H* types are HANDLEs, LPCSTR is 'const char*'
09:44:03AraqDWORD is uint32
09:44:19AraqI got used to it, at least it doesn't change...
09:44:59PMunchYeah I guess it's just something you need to learn once
09:46:27Araqthe best thing is that there is only one Windows, whereas in posix land you need to special case osx, freebsd, openbsd, solaris, linux, ...
09:47:22PMunchWell that's like saying that the Workers' Party of Korea is great because there is only one option..
09:47:37PMunchWithout any further comparisson :P
09:48:16PMunch(for reference that's the party of Kim Jung Un in NK, and the only option in their elections)
09:48:45Araqwell I'm speaking of myself.
09:49:03Araqfor me it's great that Windows is roughly a single target. Less work for us.
09:49:26FromGitter<alehander92> but the other os-es are different os-es man
09:49:30FromGitter<alehander92> its like the opposite
09:49:39PMunchOh yeah, I definitely see the benefit of it :)
09:49:41FromGitter<alehander92> you can share so much api-s between them even if they are separate os-es
09:49:55FromGitter<alehander92> and with windows you have to impl completely different stuff
09:50:32Araqyou read too much into my words.
09:50:55Araqif there was only a single Linux it would have the same benefit.
09:52:27FromGitter<alehander92> but its not a benefit imo
09:52:34FromGitter<alehander92> solaris bsd are just different os-es
09:53:16PMunchWait, LPCSTR is defined as a 32-bit pointer?
09:53:19FromGitter<alehander92> we cant expect different os-es to not be different targets
09:53:27PMunchSo I can't just map it to cstring?
09:53:39AraqPMunch, it's a 'cstring'.
09:53:41FromGitter<alehander92> and on the other hand i havent noticed the 10-20 (?) distros of linux to be a problem for nim
09:54:12PMunchIsn't cstring a regular pointer dependent on the target architecture?
09:54:28AraqPMunch, LPCSTR is not 32 bit, it's a pointer, as wide as it needs to be
09:54:44Araq(typically 64 bits these days)
09:55:35Araqalehander92: simply try to sell commercial software for Linux and you'll begin to appreciate the problem.
09:55:42PMunchNot according to this: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/f8d4fe46-6be8-44c9-8823-615a21d17a61
09:56:27AraqPMunch, it also says
09:56:31Araq typedef const char* LPCSTR;
09:56:40PMunchAraq, we're actually working to get our customers over to Linux because it would be easier to distribute to.. But I guess it depends on what you're shipping.
09:56:52PMunchYeah..
09:56:59Araqthe "32 bit" is wrong, somebody should update that page :P
09:57:04PMunchSo it's just a classic docs doesn't match implementation thing..
09:57:19PMunchApparently it was updated 02/14/2019..
09:57:22AraqPMunch, do you tell your customers they can use any Linux distro?
09:57:45PMunchTBH I have no idea what marketing is telling them :P
09:58:44AraqIMHE it's usually like "we support Ubuntu. End of story."
09:59:21Araqbecause QA exists and ensuring it works on X distros means you have X times the testing overhead.
09:59:36AraqIt's math, math always wins.
10:04:21FromGitter<alehander92> Araq we'll try to do that ..
10:04:33FromGitter<alehander92> exactly, selling software for linux
10:04:51FromGitter<alehander92> so i do appreciate it has some issues, but i am not sure they apply to nim itself
10:06:56PMunchAraq, do you know what BOOL is defined as?
10:06:59PMunchcint?
10:07:18AraqWINBOOL* = int32 # see winlean.nim
10:07:26PMunchAh cool
10:08:19*narimiran quit (Remote host closed the connection)
10:08:52*narimiran joined #nim
10:09:55PMunchHmm, how can I create a cstring of a given size?
10:10:12PMunchWhat I want to do is this: char path[MAX_PATH];
10:10:29PMunchThen pass a pointer to that to a function
10:10:42FromGitter<alehander92> use an array imo
10:11:07PMunchBut I want to use that as a string elsewhere in my code
10:11:19PMunchAnd cast[cstring](theArray) didn't work
10:11:28PMunchOh wait
10:13:18PMunchtheArray.addr
10:13:28PMunchBut is that properly handled by the GC?
10:13:54*clyybber joined #nim
10:14:42PMunchIf I do: "var theArray: array[MAX_PATH, char]" pass "theArray.addr" to a C procedure, then do "result = cast[cstring](theArray.addr)"
10:17:26*tklohna joined #nim
10:18:26Araqdon't return a pointer to your local stack frame
10:18:30PMunchOkay, this works on both Windows and linux now: http://ix.io/20Rn/nim
10:18:31Araqit'll crash and burn
10:18:31disbot^ play at https://play.nim-lang.org/#ix=20Rn 😏
10:18:49PMunchYeah, that's what I was thinking
10:19:03PMunchSo do I need to copy it out?
10:19:34*gangstacat quit (Remote host closed the connection)
10:20:04*gangstacat joined #nim
10:21:16Araqyeah and then you might as well convert it to string already
10:21:26Araqresult = $cast[string](addr myarray)
10:21:59*FromGitter quit (Remote host closed the connection)
10:22:09PMunchWait, cast[string]?
10:22:17PMunchThat won't work will it?
10:22:17*FromGitter joined #nim
10:22:48PMunchI guess I could make a seq of a certain length, then pass the pointer to theSeq[0] and then cast that to a string before returning it
10:28:22PMunchhttp://ix.io/20Rq/nim <- there, that should make the GC happy right?
10:28:23disbot^ play at https://play.nim-lang.org/#ix=20Rq 😏
10:35:45Araqresult = $cast[cstring](addr myarray)
10:35:49Araqtypo :P
10:36:17*FromGitter quit (Remote host closed the connection)
10:36:35*FromGitter joined #nim
10:37:00PMunchAh okay, yeah that's what I expected
10:39:54*GordonBGood joined #nim
10:43:06krux02@mratsim sorry I was AFK yesterday, I am online now
10:43:41krux02When you want to talk about Vulkan, I don't really know it, I only know OpenGL and looked over the Vulkan API quickly to get an idea.
10:44:41*tklohna quit (Ping timeout: 246 seconds)
10:49:18*fanta1 joined #nim
10:59:32PMunchHmm, what is the best way to create a string from an UncheckedArray[byte] and a length?
11:00:49PMunchvar myString = newString(length); copyMem(myString[0].addr, myUncheckedArray.addr, length)
11:01:11Araqthat's what I use too but I don't keep up with all stdlib additions
11:10:16FromGitter<kaushalmodi> PMunch: I've always done `let strVar = $cStringVar`. Wouldn't that work?
11:11:41*fredrik92 is now known as couven92
11:23:18*ng0 quit (Quit: Alexa, when is the end of world?)
11:28:31Araqer
11:28:46Araqthis is a bit embarrassing but what is the issue that tracks "Incremental compilation"?
11:31:04FromDiscord<mratsim> wasn't there an RFC
11:31:14FromDiscord<mratsim> I think it's in the RFC repo not the nim repo
11:31:33FromDiscord<mratsim> https://github.com/nim-lang/RFCs/issues/46
11:34:13Araqah it got moved, thanks
11:38:22*rockcavera joined #nim
11:38:23*filcuc quit (Quit: Konversation terminated!)
11:55:48FromGitter<alehander92> ooh ic
11:58:30FromDiscord<mratsim> https://github.blog/2019-11-04-github-sponsors-is-now-out-of-beta-in-30-countries/
12:09:42*venk joined #nim
12:17:30PMunchkaushalmodi, well the problem was creating allocating the memory in a way that the GC would care for it
12:19:01FromGitter<kaushalmodi> Hmm, that might explain why I need to mostly use --gc: none when printing stuff I receive from C side in Nim..
12:19:24FromGitter<kaushalmodi> I haven't yet found time to understand that problem properly
12:20:10PMunchHmm, well a cstring you receive from C code should be fine. You just need to remember to deallocate it at some point
12:20:32PMunchBut here I was passing in a buffer that was going to be populated by a string, and then used in my Nim program.
12:21:03PMunchThat's why I created a string of a given length and then passed the address to the first element (which is also the address to the rest of the string buffer)
12:21:09FromGitter<kaushalmodi> Understood
12:21:38PMunchAnd of course I added a myStr.setLen(myStr.find('\0') + 1) in order to have the string be the correct length.
12:27:19Araq?
12:32:05FromGitter<Vindaar> @kaushalmodi I merged the ggplotnim PR. So you don't have to depend on the #addDocs branch anymore. Also means first set of docs are now live :)
12:37:31clyybberAraq: IMO outplace should take the inplace arg of the proc to outplace as a first arg, so instead of `outplace(sort(a))` you would do `outplace(a, sort())` or `a.outplace(sort())`
12:45:18FromGitter<kaushalmodi> @Vindaar yes, I saw that. I'll update the README on my repo accordingly
12:45:49FromGitter<kaushalmodi> Btw a recipe request for ggplotnim is brewing
12:46:12FromGitter<kaushalmodi> Power spectral density plots or FFT plots
12:46:56FromGitter<kaushalmodi> Where the Y axis is in log scale and X axis is -F
12:47:04FromGitter<kaushalmodi> .. to +F
12:47:33FromGitter<kaushalmodi> I'll share more details with an equivalent examples and plot from Matlab
12:47:39FromGitter<Vindaar> that would be great!
12:48:24*tklohna joined #nim
12:53:33FromGitter<kaushalmodi> @Vindaar ggplotnim is doing things stably at least for the brief experimentation I did
12:53:36FromDiscord<mratsim> Seems like Julia has a 400x scheduling overhead to overcome in their new parallel runtime :/ https://github.com/JuliaLang/julia/issues/33762#issuecomment-549806041
12:53:57FromGitter<kaushalmodi> do you want to cut a new release for ginger and seqmath and a new ggplotnim release that depends on them?
12:54:24FromGitter<kaushalmodi> then the instructions to install would be simply `nimble install ggplotnim`
12:54:36*Vladar quit (Quit: Leaving)
12:55:07Araqclyybber, outplace(a, sort()) ?
12:55:13Araqwhy?
12:55:40*nsf quit (Quit: WeeChat 2.6)
12:56:08Araqmratsim brought up x.reverse().outplace().join.outplace()
12:56:28Araqmaybe we can improve this macro somehow
12:56:39FromGitter<Vindaar> @kaushalmodi good to hear! yeah, I could do that I suppose
12:57:50clyybberAraq: For chaining
12:58:06Araqchaining is broken with 'untyped'
12:58:12shashlick@Araq pong
12:58:15Araqbetter solve that one first then?
12:58:30clyybberAraq: I'm ok with mratsims proposal too
12:58:39Araqproposal?
12:58:56Araqanyway, sort it out please, I'm busy
12:59:07Araqdon't mind replacing outplace by something better.
12:59:27Araqshashlick, can I PM you?
13:00:37FromGitter<Vindaar> @treeform: not sure if you're around. I just noticed that you didn't tag the latest release of chroma
13:01:00shashlickYes #shashlick but check if anyone else is idling there
13:01:14shashlickOr use gitter
13:01:24FromDiscord<mratsim> my proposal means creating a library though
13:02:20FromDiscord<mratsim> (and maybe reusing the range keyword, which could happen if we deprecate it once we have this design by contract thing I heard about here and there)
13:02:55clyybbermratsim, Araq: I was referring to the syntax of outplace
13:03:01FromDiscord<mratsim> Anyway if you want a Range library, I'm sure @timotheecour would be very happy to refine his proposal
13:03:03FromDiscord<mratsim> ah
13:03:34clyybberBut I think x.outplace(reverse()).outplace(join()) might be easier to implement
13:06:18FromGitter<Vindaar> @kaushalmodi all done
13:06:48FromGitter<kaushalmodi> 👍
13:09:20FromGitter<yglukhov> Is there a way to prevent implicit converter in a call? Or ban converters in a scope or smth?
13:10:46FromDiscord<Stuffe> is it possible with nim to have code that only runs if it isn't a release build?
13:12:11*shashlick_ joined #nim
13:12:26solitudesfwhen not (defined(release) or defined(danger)):
13:12:41FromDiscord<mratsim> too fast
13:12:45FromDiscord<mratsim> 😛
13:14:18FromDiscord<Stuffe> Ok thanks, didn't know about the when statement
13:14:50FromDiscord<mratsim> wait until you learn about `when compiles(foo)`
13:15:29FromDiscord<Stuffe> compiles?
13:15:46FromDiscord<Stuffe> some of these things are still hard to google
13:15:51FromDiscord<mratsim> the compiler tries to compile an expression and returns true if it's valid or false if you can't compile it
13:16:17FromDiscord<mratsim> it's the last resort escape hatch of metaprogramming
13:17:10FromDiscord<Stuffe> when would that ever be nondeterministic? is anything semantic in nim hardware dependent?
13:17:48*rockcavera quit (Remote host closed the connection)
13:18:13FromDiscord<mratsim> no it's not related to hardware
13:19:04FromDiscord<mratsim> Nim allows code-generation at compile-time and that may depend on user supplied arguments
13:19:34FromDiscord<Stuffe> I see
13:19:43*theelous3 joined #nim
13:20:31FromDiscord<Stuffe> I like that these things exist, even if I wouldn't like to use them. It means I will never have to resort to some even uglier hack
13:21:07FromDiscord<mratsim> well, it's one of the ugliest hacks ever and basically a kludge for something missing
13:21:49FromDiscord<Stuffe> yeah, sure
13:22:12FromDiscord<Stuffe> reminds me of "try"
13:24:25Araqyglukhov: import x except theConverter
13:24:41Araqit's why converters are forced to have names ;-)
13:25:25FromDiscord<mratsim> I wonder who is using converters in a complex codebase
13:25:51FromGitter<yglukhov> right. so my macro is generating some stuff along with a converted. the "stuff" mixins other stuff, and I don't want the converter to kick in anywhere in the generated stuff. so import except is not an option.
13:26:03FromDiscord<mratsim> both in Status codebase and in Arraymancer I had to quickly remove them because of strange bugs/error messages they introduce
13:26:07FromGitter<alehander92> they can be useful if used only in some modules
13:26:15FromGitter<alehander92> e.g. a symbolic math ds
13:26:17FromGitter<alehander92> l
13:27:09FromDiscord<mratsim> In Arraymanceer, my converter were private but they manage to still cause issues to end users: https://github.com/mratsim/Arraymancer/issues/394
13:28:06FromDiscord<mratsim> afaik maybe the issue is just that ambiguous calls should not take existing converters if there is a concrete type that matches
13:28:15Araqmratsim: I know cooldome uses them extensively and his code base is as non-trivial as I can imagine
13:28:31FromGitter<yglukhov> Araq: I've got an idea of limiting symchoice. So that `foo(a, b, c)` becomes `limitSymChoice(foo)(a, b, c)` and limitSymChoice will filter out the symbol (which provokes the converter). But that doesn't work surprisingly: `Error: in expression 'limitSymChoice(say)(unpackedThis, a, b, c)': identifier expected, but found 'limitSymChoice(say)'`
13:34:17FromGitter<yglukhov> Another way would be to declare the converter locally with {.error.} or smth, but apparently converters can be defined only at the top level.
13:35:03FromGitter<alehander92> you can import an override from a special handwritten module?
13:35:14FromGitter<alehander92> no idea if this would compile
13:36:01FromGitter<yglukhov> but imports are top level only too :)
13:37:11FromGitter<alehander92> but anyway even if you could, {.error.} would just inform you the converter is called
13:37:25FromGitter<alehander92> i assumed you want to just choose the next possible overload
13:37:27FromGitter<yglukhov> I'm pretty fine with that one :)
13:38:00FromGitter<alehander92> so cant you use the closest thing to converter in overload order and define locally that instead
13:38:49FromGitter<yglukhov> I expect the user to have the overload, and it should be a compile time error if he doesn't. Unfortunately the converter makes it so that my (wrong) overload is picked.
13:38:50planetis[m]the problem with outplace is that ``let x = outplace(reverse(a))`` works, ``let x = outplace reverse(a)`` also works but ``let x = reverse(a).outplace`` doesn't?
13:39:43FromGitter<alehander92> so you also have a converter overload?
13:43:12*filcuc joined #nim
13:43:15FromDiscord<mratsim> I think it's that outplace is noisy when used in chained manner @planetis
13:43:38FromDiscord<mratsim> i.e. when you want a functional style for applying transformation to sequences
13:43:49planetis[m]cool macro anyway
13:44:02FromDiscord<mratsim> Lua uses ":" for out-of-place results
13:44:30FromGitter<alehander92> but i think outplace would be best with iterators
13:44:38Zevvmratsim: what?
13:44:54FromGitter<alehander92> otherwise chaining would produce too many temp collections
13:45:07FromDiscord<mratsim> yes see: http://lua-users.org/wiki/MethodChainingWrapper
13:45:13clyybberAraq, mratsim, alehander92: https://github.com/nim-lang/Nim/pull/12599
13:45:18clyybberMy approach.
13:46:04clyybberIt works like `let x = a.outplace(reverse())`
13:46:13FromDiscord<mratsim> @alehander42, I agree, but for now inline iterator chaining doesn't work ¯\\_(ツ)_/¯
13:46:17Zevvmratsim: ':' is just sugar, v:name(args) is syntactic sugar for v.name(v,args),
13:46:35FromDiscord<mratsim> I just meant that it's pretty
13:46:40clyybberAnd also allows `let x = a.outplace(reverse(someOptionalArgumentOfReverse))`
13:47:13FromGitter<alehander92> mratsim i know, wondering when would iterator chaining work
13:47:29FromGitter<alehander92> dont know if its in the roadmap to 1.x
13:47:32planetis[m]i agree with you mratsim
13:48:07planetis[m]sorry for a week ago btw I have overreacted
13:49:38FromDiscord<mratsim> not a problem
13:49:47FromDiscord<mratsim> I also overreacted in my answer
13:50:27FromDiscord<mratsim> You're not alone in having 400x speed issues btw see my issue in Julia tracker 😉 https://github.com/JuliaLang/julia/issues/33762#issuecomment-549806041
13:50:36FromGitter<yglukhov> @alehander92 my macro defines a Type, a converter from anything to Type, and a bunch of procs for that Type. Those procs forward to user procs with the same name. So instead of failing when there's no user proc, they end up being called recursively because of the converter. So I want to disable my generated converter in my generated procs.
13:51:26planetis[m]clybber, nice though, ``sort`` can have more arguments
13:52:50*solitudesf quit (Ping timeout: 240 seconds)
13:52:53planetis[m]man, i dont care :p life has more worries for me than how fast is my toy lib :D
13:54:40*shashlick_ left #nim ("Quit")
13:54:55planetis[m]so how is your compute graph experiment going?
13:55:14FromDiscord<mratsim> I didn't work on it for the past 3 months
13:55:31FromDiscord<mratsim> I can't do that with my multithreading experiments at the same time
13:55:59FromDiscord<mratsim> there is an actual example that works here: https://github.com/numforge/laser/blob/master/laser/lux_compiler/lux_dsl.nim#L57-L71
13:56:06FromDiscord<mratsim> and the internals seem quite good to me
13:56:47planetis[m]looks really cool though, I kind of understand what you are doing, but not completly :p
13:56:53FromGitter<kaushalmodi> PMunch: Can you cut a new release of persvector?
13:57:02*GordonBGood quit (Ping timeout: 276 seconds)
13:57:08FromGitter<kaushalmodi> I am looking into the nimble packages that ggplotnim is fetching from head
13:57:27FromDiscord<mratsim> the idea is that you only put the actual math that you need, and you will have something correct
13:57:40FromGitter<kaushalmodi> would be nice to have a nimble install install all dependencies using their tagged versions
13:57:45FromDiscord<mratsim> and then, you can refine the low-level detail for speed but separately
13:57:51clyybberplanetis[m]: Yeah, and thats exactly what my PR supports
13:58:04FromDiscord<mratsim> let me give you some slides examples
13:59:38planetis[m]clybber: i will try it
13:59:57clyybbermratsim: Added an example for chaining
14:00:16PMunchkaushalmodi, done :)
14:00:36PMunchShould've done that a long time ago :S
14:00:46FromGitter<kaushalmodi> thanks
14:01:01FromDiscord<mratsim> @planetis: what I want to do is fig 1: https://people.csail.mit.edu/jrk/halide12/halide12.pdf
14:01:29FromDiscord<mratsim> basically, the Clean C++ example is your code, the Fast C++ example is my code
14:01:44FromDiscord<mratsim> but this is time consuming, very error-prone to optimize
14:01:56FromDiscord<mratsim> the last oen is what I want to do
14:02:22FromDiscord<mratsim> a separation of the algorithm and the scheduling (parallelism, cache optimizations and such)
14:02:32FromDiscord<mratsim> so that anyone can implement the algorithm
14:03:05FromDiscord<mratsim> and then experts or even autotuning can then optimize with the assurance that the algorithm still give good results
14:03:37FromDiscord<mratsim> Also, while an algorithm will be good on both CPU and GPU, the way to execute it on CPU and GPU might differ a lot
14:04:10FromDiscord<mratsim> and I want a DSL that only requires rewriting the schedule when compiling to GPU
14:04:27FromDiscord<mratsim> and not the whole algorithm + schedule
14:05:08planetis[m]yes, I got that part alright, the rest is bit difficult
14:06:03FromDiscord<mratsim> in short, I want people that focuses on algorithm and math and that know that best to be able to focus on it, and people that focus on speed to be able to focus on it.
14:06:37FromDiscord<mratsim> and they would be able to work and experiments on the same codebase because their concerns are cleanly separated.
14:07:12planetis[m]clybber: works fine for me
14:08:07planetis[m]it's just Araq's version makes more sense, you can't deny he makes awesome macros :D
14:08:12planetis[m]i wonder why...
14:09:19clyybberUgh
14:09:45FromDiscord<mratsim> When you say the rest, I suppose you were talking about the expression problem, object algebra, tagless final. That was research on how to design the private and public data structures so that it's extensible
14:09:49planetis[m]mratsim: say i want to implement softmax
14:10:28FromDiscord<mratsim> like this: https://github.com/ravi-teja-mullapudi/Halide-NN/blob/master/layers.h#L48-L73
14:10:40Araqplanetis[m], hey, thank you!
14:10:47FromDiscord<mratsim> and the schedule part is the expert tuning for CPU or GPU
14:12:32clyybberplanetis[m]: Yeah, my macro would make more sense as a kind of dot operator
14:12:51planetis[m]mratsim: nice
14:14:04clyybberplanetis[m]: Because then you would simply write x.<shuffle instead of x.shuffled
14:14:20clyybberReplace `.<` by whatever you want it to be
14:15:19planetis[m]yes that makes more sense
14:18:13FromGitter<cloudcalvin> Hi guys, could I just ask for a sanity check. I am learning about concepts and tried out the Function[A] example from https://nim-lang.github.io/Nim/manual_experimental.html#concepts-concept-derived-values but I get `false` instead of `true`. Is something missing?
14:20:01FromDiscord<mratsim> if the exact example is giving you the wrong result you can raise a bug.
14:20:01FromDiscord<mratsim> AFAIK there is one for the Functor concept as well
14:20:43shashlick@treeform ping
14:23:31FromGitter<cloudcalvin> Thanks will check
14:23:35planetis[m]note there is an rfc for refining concepts: https://github.com/nim-lang/RFCs/issues/168 so it might be to late for that
14:24:41*abm joined #nim
14:25:44FromGitter<cloudcalvin> https://github.com/nim-lang/Nim/issues/5650
14:25:47disbot^ The ``Functor`` example from merged concepts branch doesn't work
14:25:47disbot^ snippet at https://play.nim-lang.org/#ix=20Sa 😏
14:25:50FromGitter<cloudcalvin> yeah this is pretty old
14:26:30FromGitter<cloudcalvin> I'v seen the rfc, looks cool. Probably also means the example wont be fixed soon.
14:26:50*Vladar joined #nim
14:27:13FromGitter<cloudcalvin> I'm just wondering whats actually wrong with the example!
14:27:52FromGitter<cloudcalvin> <I say without reading the entire bug ticket>
14:30:09disruptekcan we just go ahead and fix the compiler to not look in ~/.nimble?
14:31:24FromDiscord<treeform> Vindaar, ok i'll tag it. Why do I need to tag things again?
14:31:30*filcuc quit (Ping timeout: 268 seconds)
14:31:39disruptekwithout tags, dependencies are a pita.
14:33:03FromGitter<kaushalmodi> treeform: Tags allow a nimble package build to be reproducible
14:33:09FromDiscord<treeform> shashlick, pong?
14:33:12disruptekhttps://github.com/nim-lang/Nim/issues/12367 -- if this can be fixed, i will write a package manager for localdeps that uses only nimble and nim.cfg.
14:33:14disbot^ nim.cfg syntax for --define:FOO:VAL undocumented or absent
14:33:14disbot^ snippet at https://play.nim-lang.org/#ix=20Sb 😏
14:33:31FromGitter<kaushalmodi> good boy disbot
14:34:17FromGitter<kaushalmodi> .. though that snippet was not useful
14:34:26FromGitter<kaushalmodi> it will just spam ix.io
14:34:27*disruptek smacks disbot.
14:35:21FromGitter<kaushalmodi> may be just send blocks in ```` ```nim .. ``` ```` to ix.io?
14:35:23disruptekit knows when the snippet is tagged as nim, but there are a lot of snippets that aren't.
14:35:41disruptekix.io won't duplicate ids for identical content.
14:35:48disruptekhttps://github.com/nim-lang/Nim/issues/12367
14:35:49disbot^ nim.cfg syntax for --define:FOO:VAL undocumented or absent
14:35:49disbot^ snippet at https://play.nim-lang.org/#ix=20Sb 😏
14:35:53disruptekso it's pretty harmless.
14:36:02FromGitter<kaushalmodi> cool
14:39:51planetis[m]hey violence against robots is not the answer, besides machines don't forget stuff...
14:41:47Araqdisruptek, --noNimblePath, add it to your global config
14:42:09Araqit should probably become the new default, I use it regularly myself
14:42:30*solitudesf joined #nim
14:42:53FromDiscord<treeform> what does --noNimblePath do?
14:43:15disrupteki will test it again. last time, i think a missing package caused the compiler to pick up one in ~/.nimble.
14:46:01disruptekyeah, you can't use --nimblePath without the compiler looking in ~/.nimble.
14:46:08disruptekwhy can't that be fixed?
14:47:12disruptekyes, i understand that --noNimblePath works.
14:47:21disruptekjust looking for a more convenient solution.
14:47:56AraqI'm sorry, what are you saying? you override --nimblePath and yet .nimble still has to exist?
14:48:32disruptekit doesn't have to exist, but if you try to import a package /not/ in your overriden path, the compiler will search ~/.nimble and import the package from there if it exists.
14:48:36disruptekto me, that's a bug.
14:49:27*fanta1 quit (Quit: fanta1)
14:49:48FromGitter<Vindaar> @PMunch: you also didn't push a tag to github. However, for some reason nimble still understands that version 1.0.0 is the latest (for chroma it didn't)
14:50:28Araqdisruptek, report it please, I still don't understand it completely
14:50:34disruptekPMunch: try using bump; it's pretty good.
14:50:35Araqmaybe --nimblePath is additive
14:50:48PMunchdispruptek, bump?
14:50:50disruptekthat makes the most sense.
14:51:21FromGitter<kaushalmodi> Araq: Yes, --nimblePath is additive
14:51:22disruptekPMunch: it's a thing that cuts a new nimble release for you.
14:51:33FromGitter<kaushalmodi> I have also been looking for a --nimblePathOverride
14:51:33disruptekhttps://github.com/disruptek/bump
14:51:52FromGitter<kaushalmodi> which just overrides the default ~/.nimble even if it's present
14:53:24FromGitter<zaphodef> is there a reason why `compiler/sem.nim:myClose()` calls `rawCloseScope()` after `closeScope()`, while the later already calls the former?
14:53:37disruptekkaushalmodi: yeah, that really should be fixed.
14:54:46Araq@if nimbabel:
14:54:46Araq nimblepath="$home/.nimble/pkgs/"
14:54:46Araq @if not windows:
14:54:46Araq nimblepath="/opt/nimble/pkgs/"
14:54:47Araq @else:
14:54:48Araq # TODO:
14:54:49Araq @end
14:54:51Araq@end
14:55:01Araqyeah, it's additive
14:55:10Araqso it works as designed :P
14:55:33FromGitter<zaphodef> ok ahah
14:56:02Araqzaphodef: there was a reason for that but I forgot
14:56:11FromGitter<zaphodef> no problem
14:57:11Araqit had something to do with "unused identifier" checking
14:57:21FromGitter<zaphodef> i'm still looking for a way to compile all the libs' processes, and i went across this
14:57:32FromGitter<zaphodef> yup, it is related to this check
14:57:49FromGitter<zaphodef> i want to un-optimize the optimization x)
14:57:51AraqI think it's the scope for module imports, no checking for these
14:58:37FromGitter<zaphodef> mhh, any hint where the compiler gets rid of the unused modules?
15:01:58PMunchVindaar, there pushed a tag as well :)
15:02:18PMunchdisruptek, oh that would indeed be useful
15:04:48FromGitter<Vindaar> hehe, thanks!
15:09:58FromGitter<kaushalmodi> @Vindaar @PMunch Thanks, now ggplotnim install installs only tagged versions and it still works great
15:10:57PMunchWoo
15:10:59*PMunch quit (Quit: Leaving)
15:11:42FromGitter<Vindaar> yay
15:12:01disruptekbump was started as a joke but i've really put a lot of work into it. i wish more people used it. it's hard to play the nimble game without tags. we need to be releasing more.
15:15:28FromGitter<Vindaar> you're right. I always feel like I shouldn't release a new version for every small thing. But really, aside from the work to tag a version there isn't really a downside to it
15:16:16disruptekit ends up being super helpful because you can tell someone to roll back to /just prior/ to the misfeature that's breaking them.
15:16:46disruptekit gives you an alternate timeline in which the software in your master-only project is always stable.
15:18:50FromGitter<kaushalmodi> A question from someone ignorant with how GC works: ⏎ ⏎ Where do I start debugging this crash: ⏎ ⏎ ```code paste, see link``` ... [https://gitter.im/nim-lang/Nim?at=5dc192da6570b076740f7389]
15:18:56disrupteki guess it wouldn't be so important if nimble understood the relative position of a git hash.
15:20:37*filcuc joined #nim
15:20:39FromGitter<Vindaar> here I am, already causing you crashes @kaushalmodi :P
15:21:02clyybberafaik its not possible to identify which came first from two git hashes
15:21:13clyybberI would love to be corrected :)
15:21:17FromGitter<kaushalmodi> @Vindaar That's not you :)
15:21:23FromGitter<Vindaar> phew ;)
15:21:30FromGitter<kaushalmodi> I have always seen those, and used --gc:none as a crutch
15:21:38FromGitter<kaushalmodi> trying to understand why I need --gc:none
15:22:05FromGitter<kaushalmodi> all: Here's a minimal code that causes above crash: http://ix.io/20Sl/nim
15:22:06disbot^ play at https://play.nim-lang.org/#ix=20Sl 😏
15:22:56FromGitter<kaushalmodi> It won't work in standalone mode on the playground as it needs to be run by that host C application
15:25:36*letto quit (Ping timeout: 240 seconds)
15:26:12FromGitter<kaushalmodi> Doing some "here debug", I see that the code after here6 in this snippet ( http://ix.io/20So/nim) is causing the crash
15:26:13disbot^ play at https://play.nim-lang.org/#ix=20So 😏
15:26:35FromGitter<kaushalmodi> ```code paste, see link``` ⏎ ⏎ Any hints on how to continue this debug? [https://gitter.im/nim-lang/Nim?at=5dc194aba9f0dc24852bcb85]
15:33:10*bacterio quit (Read error: Connection reset by peer)
15:40:32disruptekgit hashes aren't oids with timestamps embedded, but you can tell which came first by looking at the repo.
15:43:05*letto joined #nim
15:44:02Araqkaushalmodi: you cannot convert from string to cstring in your case
15:44:10*lritter joined #nim
15:44:39Araqyou need to GC_ref the strings before that or do the alloc() dance
15:48:29*shodan45 quit (Remote host closed the connection)
15:53:10*shodan45 joined #nim
15:57:27*floppydh quit (Quit: WeeChat 2.6)
16:03:07FromGitter<kaushalmodi> at the point where it crashes, the code is all in "Nim scope"
16:03:42FromGitter<kaushalmodi> I replaced the call after "here6" with `p.setFontTtf("DejaVuSans.ttf")` which is to a nimble package proc
16:03:53FromGitter<kaushalmodi> so I am confused why it crashes there
16:04:41FromGitter<kaushalmodi> > you need to GC_ref the strings before that or do the alloc() dance ⏎ ⏎ If possible, can you point to some examples?
16:05:31FromGitter<kaushalmodi> I have looked at https://nim-lang.github.io/Nim/gc.html but I'd like to see some code examples
16:08:06FromGitter<kaushalmodi> Looking at an arbitrary Nim file: https://github.com/nim-lang/Nim/blob/f18fcf65b3a61b1960c14aa9503eea34fee76492/tests/deps/zip-0.2.1/zip/zipfiles.nim, seems like `var.GC_ref` needs to be called after its declaration and `var.GC_unref` at the end of the proc?
16:12:16Araqpossibly. Look, the GC doesn't understand 'cstring', it doesn't keep its alive
16:12:38*filcuc quit (Ping timeout: 268 seconds)
16:13:00FromGitter<kaushalmodi> I'm fiddling with GC_ref to make it work.. the complication is that cstring is inside an obj whose ptr I get from C side: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/nim-lang/Nim?at=5dc19f8c3f4ea333f2c52fbe]
16:13:15FromGitter<kaushalmodi> I am getting only `ptr PlotOptions`.. so trying to figure out how to GC_unref that
16:13:37FromGitter<kaushalmodi> I am getting only `ptr PlotOptions` on the Nim side.. so trying to figure out how to GC_ref that
16:13:58*clyybber quit (Quit: WeeChat 2.6)
16:15:06ZevvI don't think you can
16:15:27Araqstop hacking around and understand the real problem
16:17:41FromGitter<kaushalmodi> I tried the below understanding for GC_ref expects but this also did not work: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/nim-lang/Nim?at=5dc1a0a53f4ea333f2c52fc0]
16:18:14FromGitter<kaushalmodi> (I need to get hold of a primer on how this work in Nim.)
16:18:37Araqdon't GC_ref the "optionsRef", the GC is not concerned with 'ptr's
16:19:13Araqlook man, when you do someCStringHere = someNimStringHere the GC is free to collect someNimStringHere afterwards
16:19:30AraqsomeCStringHere will point to garbage
16:19:35Araqsolution:
16:19:40FromGitter<kaushalmodi> so I need to GC_ref only options.cStrVars?
16:19:53AraqGC_ref(someNimStringHere); someCStringHere = someNimStringHere
16:20:09FromGitter<kaushalmodi> got it
16:20:16FromGitter<kaushalmodi> thank you. I will try that out
16:21:04Araqyou also need to call GC_unref afterwards so that you don't produce a memory leak
16:21:20FromGitter<kaushalmodi> yes.. and does that string need to be a `var`?
16:23:12FromGitter<kaushalmodi> confusion: I am not assigning anything to the cstring
16:23:41FromGitter<kaushalmodi> I am only copying the values of the cstrings from a deferenced obj/struct I get from C
16:24:09FromGitter<kaushalmodi> so I am not doing `someCStringHere = someNimStringHere`.. I am doing the opposite
16:24:42Araqmaybe you simply got the wrapper wrong and the GC problem is only a symptom
16:25:22FromGitter<kaushalmodi> the wrappers work functionally well, only with gc:none though
16:25:37FromGitter<kaushalmodi> and I have seen this issue in many wrappers between SystemVerilog/Nim
16:25:48Araqyou get them all wrong :P
16:25:54FromGitter<kaushalmodi> could be :)
16:26:02FromGitter<kaushalmodi> so I am trying to understand what's going wrong
16:26:31Araquse c2nim for the wrapping process :P
16:26:54FromGitter<kaushalmodi> I am not writing C wrappers here
16:27:08FromGitter<kaushalmodi> let me try to explain..
16:27:35FromGitter<kaushalmodi> I have this struct in SystemVerilog: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/nim-lang/Nim?at=5dc1a2f7bbdf5f17b420b69e]
16:27:44FromGitter<kaushalmodi> the SV compiler auto translates to C
16:28:03FromGitter<kaushalmodi> string becomes C style string, real becomes float and so on
16:28:16FromGitter<kaushalmodi> all that translations is defined in IEEE-1800 standard
16:28:39FromGitter<kaushalmodi> on Nim side, I then have a mirror type for that: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/nim-lang/Nim?at=5dc1a3373f4ea333f2c52fc7]
16:29:21FromGitter<kaushalmodi> on SV side, the function "importc-like" decl looks like: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/nim-lang/Nim?at=5dc1a3613f4ea333f2c52fc9]
16:29:36FromGitter<kaushalmodi> on Nim side, it is: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/nim-lang/Nim?at=5dc1a370bbdf5f17b420b6a3]
16:29:42FromGitter<kaushalmodi> that's all the wrapping I am doing
16:29:55FromGitter<kaushalmodi> the intermediate C code generation happens in the SV compiler
16:30:42Araquse the .bycopy pragma on your object declaration
16:30:49Araq(c2nim would have done this... :P )
16:31:01FromGitter<kaushalmodi> *looking into bycopy*
16:32:25FromGitter<kaushalmodi> I am not importcing that Nim obj type because I don't know name of the type identifier defined by SV compiler
16:32:53FromGitter<kaushalmodi> you mean, just use `{.bycopy.}` with no other pragma?
16:33:11Araqyes
16:34:04FromGitter<kaushalmodi> tried: ⏎ ⏎ ```type ⏎ PlotOptions {.bycopy.} = object ⏎ ..``` ⏎ ⏎ but still the same crash [https://gitter.im/nim-lang/Nim?at=5dc1a47cbbdf5f17b420b6ab]
16:34:20Araqit's much better now anyways, keep it
16:39:51FromDiscord<kodkuce> like this chat is becoming like matrix, just some magick writings all across
16:44:52disrupteki just see blonde, brunette, redhead...
16:45:44FromGitter<kaushalmodi> Araq: So far I have this.. but still not able to figure out the cause of the crash: http://ix.io/20SB/nim
16:45:45disbot^ play at https://play.nim-lang.org/#ix=20SB 😏
16:55:48*narimiran quit (Ping timeout: 268 seconds)
16:55:48*narimiran_ joined #nim
16:59:23*abm quit (Ping timeout: 265 seconds)
17:02:55shashlick@treeform sorry been a busy morning, can you please take a look at the nimble local deps rfc and share your thoughts
17:03:54Araqyou can't GC_ref the title before it contains the useful string ;-)
17:04:13Araqbut that's not the cause of the crash either
17:07:05*nsf joined #nim
17:07:35shashlick@disruptek please check out my tissue project on github
17:07:42shashlickIt does this Nim snippet search on issues
17:07:57disruptekyeah, i saw it.
17:08:05shashlickCool deal
17:08:27disrupteki had to impl github api anyway. 😊
17:09:28Araqgithub API? can it be used to search for projects?
17:09:33disruptekof course.
17:12:04*narimiran_ is now known as narimiran
17:13:40FromGitter<kaushalmodi> Araq: does this help? ⏎ ⏎ ```code paste, see link``` [https://gitter.im/nim-lang/Nim?at=5dc1adc4a9f0dc24852bcbc1]
17:14:03FromGitter<kaushalmodi> I was finally able to enable gdb on the SV compiler side and also enabled the gdb symbols on Nim side
17:15:10FromGitter<kaushalmodi> How do I see into the "optimzed out" stuff? Also pinging @krux02
17:16:03FromGitter<kaushalmodi> looks like the typography pkg is causing the crash here?
17:28:17krux02kaushalmodi: do you mean optimized out variables from gdb?
17:28:43krux02from my experience "optimized out" often means "not yet initialized"
17:29:25krux02but when it is truly optimized out it is optimized out, you can't inspect tha value. The only option you will have left is to disable optimizations
17:30:25FromGitter<kaushalmodi> krux02: I am already disbling optimization
17:30:38FromGitter<kaushalmodi> `--debugger:native --opt:none -t="-O0"`
17:30:59*Jesin quit (Quit: Leaving)
17:32:00FromGitter<kaushalmodi> but in the Nim generated .c, I see ` gcc -c -w .. -O0 -g3 -Og`. I don't know why the `-Og` switch gets added
17:33:19Araqit's in the default config
17:33:36Araqwe always optimize, you can edit your nim.cfg to change it
17:33:44FromGitter<kaushalmodi> ok
17:34:02FromDiscord<itmuckel> Hey guys! Can I pass an object by reference in nim? In C++ you can pass a Variable from the stack to a method by doing `changeVar(&var)`. Is that possible in nim? I tried `changePerson(ref person)`, but that didn't work. 🤔 I got `type ref Error Type`.
17:34:53AraqNim passes by const ref if it thinks it's a good idea
17:35:05Araqdon't mess with it, Nim knows better than you do.
17:35:07*dddddd joined #nim
17:36:15FromDiscord<Generic> this is just a stupid thing which sprung to my mind this morning
17:36:28*Trustable joined #nim
17:36:34disruptekuh oh.
17:36:37FromDiscord<Generic> but are/or has anyone considered using a ref
17:36:45FromGitter<kaushalmodi> Araq: got rid of the optimized out stuff with `--gcc.options.debug="-O0 -g3"`, but that didn't reveal anything useful
17:36:54FromDiscord<Generic> when only having a single ref as closure env
17:37:03FromDiscord<Generic> to not wrap it again in a ref object
17:37:14FromGitter<kaushalmodi> now I get http://ix.io/20SS/text
17:37:15FromDiscord<Generic> and instead take it directly as the closure env
17:37:23AraqGeneric: I considered it but lambdas are already the hardest part in the compiler
17:37:36FromDiscord<Generic> ah, ok thanks
17:38:18Araqkaushalmodi: you won't find stack corruptions with gdb, use valgrind
17:38:44*filcuc joined #nim
17:39:01FromGitter<kaushalmodi> that's another learning curve.. I will continue this exploration at a later point
17:39:42FromDiscord<itmuckel> @Araq okay, thx
17:40:57FromGitter<kaushalmodi> Araq: I really wanted to get to the bottom of this today.. I started looking into valgrind but the complication is that a host C appl is running the Nim compiled .so: https://stackoverflow.com/questions/20321753/valgrind-how-to-use-valgrind-for-so-library
17:45:30*Jesin joined #nim
17:49:37*nsf quit (Quit: WeeChat 2.6)
18:15:27*eys joined #nim
18:17:31*bacterio joined #nim
18:17:51*bacterio quit (Client Quit)
18:22:23*bacterio joined #nim
18:22:57*filcuc quit (Ping timeout: 240 seconds)
18:23:53*filcuc joined #nim
18:37:33*filcuc quit (Ping timeout: 268 seconds)
18:52:28*filcuc joined #nim
18:52:54*GordonBGood joined #nim
18:57:14*GordonBGood quit (Ping timeout: 240 seconds)
19:00:58*filcuc quit (Quit: Konversation terminated!)
19:04:37rayman22201@Araq you around?
19:04:56*NimBot joined #nim
19:05:41rayman22201I'm trying an experiment to keep refs to the closure environments with the Future for the Dispose stuff, and I'm hitting a code gen bug maybe? I get GCC casting errors... :/
19:06:38*nsf joined #nim
19:11:31Araqrayman22201:
19:11:34Araqpong
19:11:42FromGitter<mratsim> (I would love to be able to capture environment like a closures or serialize them)
19:12:18rayman22201I made it work by removing some casting code as a prototype.
19:12:41rayman22201this won't work in the general case, but I'm going to see if this will work as a proof of concept
19:12:51rayman22201stand by :-P
19:14:50*rockcavera joined #nim
19:18:34FromGitter<mratsim> Do you have a branch somewhere?
19:19:53rayman22201now it looks like "deepDispose" isn't disposing?
19:21:57*nif quit (Quit: ...)
19:22:08*nif_ joined #nim
19:22:31rayman22201https://www.irccloud.com/pastebin/13Q28ZQO/
19:23:33rayman22201notice that, deepDispose visits the relevant nodes, but the memory doesn't seem to be freed? https://www.irccloud.com/pastebin/ORrXqody/
19:26:17rayman22201test program for context https://www.irccloud.com/pastebin/kUGafxMa/
19:27:58disrupteki wouldn't expect it to return it to the os.
19:28:09disruptekif you alloc the same type again, does it reuse the memory?
19:28:17rayman22201that's not what those stats are showing. Those are the internal GC stats
19:28:30disruptekdoes it leak?
19:28:42rayman22201obviously. That's what it's showing
19:28:55disruptekit shows that X units were freed.
19:29:30disruptekwhat i'm asking is, is it stable?
19:29:38rayman22201It's not, and that's my problem.
19:29:44disruptekokay.
19:29:47rayman22201I would expect it to be, and I'm not sure why it isn't
19:29:58rayman22201I could also be totally mis-understanding those stats
19:31:19disruptekis dumpNumbleOfInstances useful?
19:31:32rayman22201namely, I would expect the "freed objects" to be higher. Since it should free:
19:31:32rayman222011.) The Future
19:31:32rayman222012.) the T inside the future
19:31:32rayman222013.) the closure environment
19:31:32rayman222014.) the closure iterator environment
19:31:38disruptekit seemed to work for me.
19:31:57rayman22201hrmm, good idea. I will try it
19:32:07disrupteks/Numble/Number/
19:32:09rayman22201it looks like it's only freeing the Future
19:32:40rayman22201I should say, "dispose", not "free", since it's not returning the memory the OS.
19:34:03disrupteki don't think i've ever measured something that didn't leak.
19:34:55rayman22201It's leaking, but it's internal to the GC. if that makes sense
19:35:25rayman22201amounts to the same thing, but I get less tools since Nim is handling all the MM internally
19:35:44rayman22201what is the proc? dumpNumberofInstances(T)?
19:35:49disruptekyeah; i'm okay with a small amount of stable leakage.
19:35:51disruptek()
19:36:00disruptekyou need to -d:nimTypeNames though.
19:36:08rayman22201already have that on :-P
19:43:21FromDiscord<kodkuce> is figma just a design tool it dosent build me gkt qt win android or wahter bindings rith?
19:43:47disruptekkodkuce: right, but treeform has a package to turn figma output into ui.
19:46:26rayman22201cool proc. Thank you @disruptek
19:46:45rayman22201definitely confirms that only the Future itself is being "disposed". :-/
19:47:09FromDiscord<kodkuce> is it working?
19:47:15*abm joined #nim
19:47:35disruptek😦
19:47:47disruptekkodkuce: yep.
19:48:29disruptekhttps://github.com/treeform/fidget
19:52:42FromDiscord<kodkuce> will try
19:56:01rayman22201what is the syntax for a destructor on a Generic type?
20:08:52rayman22201how do you "dispose" a seq?
20:25:12*tyler569 left #nim (#nim)
20:38:41*nsf quit (Quit: WeeChat 2.6)
20:40:38FromGitter<zacharycarter> fidget looks cool - but I'd rather have the OpenGL backend at this point than the HTML one
20:40:51FromGitter<zacharycarter> also - I don't think the OpenGL backend should require GLFW... that doesn't make sense to me
20:43:40FromGitter<zacharycarter> oh - maybe I was looking at old code
20:43:44FromDiscord<kodkuce> opengl should work on Phone/Desktops and for web its HTML right
20:44:28FromGitter<zacharycarter> I don't know / understand what the difference is between _backendopengl and backendopengl is
20:44:40FromGitter<zacharycarter> well I think that's the idea - but it doesn't look like the OpenGL backend is complete
20:45:09FromGitter<zacharycarter> maybe it is
20:47:48FromDiscord<kodkuce> it says only HTML is working atm
20:48:30FromGitter<zacharycarter> ah
20:48:42FromGitter<zacharycarter> I can't get the examples to run anyway - some errors in the typography package
20:50:42FromDiscord<treeform> zacharycarter, fidget is not out yet. I am still working on it.
20:51:02FromGitter<zacharycarter> yeah - I figured as much
20:51:03FromDiscord<treeform> It has an OpenGL backend. Why don't you like GLFW?
20:51:20FromGitter<zacharycarter> it's not that I don't like GLFW - it's just IMO it should be window library agnostic
20:51:28FromGitter<zacharycarter> all it should need is an OpenGL context, no?
20:51:52FromDiscord<treeform> they you would have to wire up all of the input stuff?
20:52:04FromGitter<zacharycarter> callbacks I guess
20:52:11FromDiscord<treeform> opening a window yourself is not hard, but what about keyboard input, mouse input, screen resizes ... its a ton!
20:52:19krux02glfw has callbacks for input, SDL has events.
20:52:38FromGitter<zacharycarter> yeah - but like, today if I were going to choose a GUI library solution
20:52:49FromGitter<zacharycarter> I'd go with NanoVG or something similar
20:52:53FromGitter<zacharycarter> and then a layout engine
20:53:10krux02there is an API for all of those things on all platforms. both sdl and glfw provide a wrapper that works also on other systems
20:53:19FromDiscord<treeform> yeah thats a ton of work to integrate. I could not get NanoVG to work on windows. I was looking at maybe making it a backend.
20:53:23FromGitter<zacharycarter> I really don't want my GUI library coupled with my windowing library
20:53:53FromDiscord<treeform> Yeah, fidget will never be for you then.
20:54:14FromGitter<zacharycarter> well then it's more than a GUI library :P
20:54:19FromDiscord<treeform> All I want is people to go, I want to a button that does this, And it will work.
20:54:23FromGitter<zacharycarter> but that's cool
20:54:50krux02I am personally not the biggest fan of antialiased vector graphics. What it usually means in my personal experience is software rendering.
20:55:13FromDiscord<treeform> How so? Most other other GUI libraries include windowing and keyboard as well.
20:55:16krux02and not even the fastest software rendering
20:55:31FromDiscord<treeform> NanoVG is the only one I know that says bring your own windows and input.
20:55:44FromGitter<zacharycarter> nuklear, imgui, etc don't either
20:55:51krux02yea
20:55:55FromGitter<zacharycarter> they just need opengl contexts
20:56:21krux02I wrote my opengl sandbox and I already got feedback why I don't have my own keyboard handling.
20:56:53krux02I really don't like these libraries that start with wrapping GLFW and SDL under yet another abstraction.
20:56:58FromDiscord<treeform> WinForms, uwp, Qt, Coco, GTK... all do.
20:57:00FromGitter<zacharycarter> same
20:57:07FromDiscord<treeform> You right I know of nuklear, imgui and they dont.
20:57:17krux02I think SDL isn't perfect, but it is good.
20:57:25FromDiscord<treeform> I don't like SDL.
20:57:32FromGitter<zacharycarter> GLFW doesn't support iOS or Android either
20:57:35FromDiscord<treeform> Soo big! Soo much things I tries to do.
20:57:40krux02why don't you like SDL?
20:57:48FromGitter<zacharycarter> most of SDL is opt in
20:58:01krux02true sdl is modular
20:58:05FromGitter<zacharycarter> you explicitly load functionality when you intiailize SDL2
20:58:06FromDiscord<treeform> Mainly it's hard for me to read the source. It's written in this odd style.
20:58:07FromDiscord<kodkuce> "I really don't want my GUI library coupled with my windowing library" << what you mean by this?
20:58:29FromDiscord<kodkuce> GLFW doesn't support iOS or Android either? really?
20:58:31FromGitter<zacharycarter> I mean that rendering a GUI and creating a window / handling input are two separate concerns
20:58:35FromDiscord<treeform> GLFW doesn't support iOS or Android either, but its sister library GLFM does.
20:58:39FromGitter<zacharycarter> no it doesn't
20:58:42krux02what do you mean with it is hard to read?
20:59:01FromDiscord<kodkuce> best would be if we you can target all with 1 lib
20:59:06FromDiscord<kodkuce> but i guess life sux
20:59:08krux02I read SDL source only once, and I actually liked it.
20:59:32FromGitter<zacharycarter> yeah but GLFM isn't written / maintained by the GLFW authors is it?
20:59:36krux02SDL can target almost everything, some official and some inofficial implementations.
21:00:42FromGitter<zacharycarter> I think designing a GUI library without having it also handle windowing / input is doable but for a retained mode GUI solution it will be more difficult
21:00:58FromDiscord<treeform> To me GLFW feels light wight and simple wrapper. Some thing I would write myself. SDL feels big and complex ... not some thing I would write.
21:01:35krux02I never felt SDL was big and complex, why do you think like that?
21:01:53FromGitter<zacharycarter> maybe - https://bitbucket.org/duangle/oui-blendish/src/default/ - could be a source of inspiration
21:02:13krux02SDL is industry standard if you care about that
21:02:34FromDiscord<kodkuce> i would try but i am uber newb
21:02:49FromDiscord<treeform> take two examples: https://github.com/treeform/quickcairo/blob/master/examples/realtime_glfw.nim
21:02:55FromDiscord<treeform> and https://github.com/treeform/quickcairo/blob/master/examples/realtime_sdl2.nim
21:03:25FromDiscord<treeform> With SDL you have to do bit fiddling and conversion and stuff:
21:03:26FromDiscord<treeform> https://github.com/treeform/quickcairo/blob/master/examples/realtime_sdl2.nim#L45
21:03:38krux02SDL2 is 3 lines shorter
21:03:40FromDiscord<treeform> The whole thing with Image -> Bitmap -> Surface is odd.
21:03:51krux02that is what I see from barely looking at the sources
21:04:09FromDiscord<treeform> glfw has more comments for some reason
21:04:22krux02treeform: where do you see that?
21:04:24FromGitter<zacharycarter> I'm using sokol_app.h for my windowing / input code
21:04:58FromGitter<zacharycarter> I've used glfw 3 and sdl2 extensively and the biggest difference is like krux02 said, sdl2 uses events and glfw3 uses callbacks
21:05:18FromGitter<zacharycarter> other than that they have basically the same set of fucntionality, with GLFW supporting less platforms
21:05:48FromDiscord<treeform> krux02, my glfw has more comments.
21:05:51FromGitter<zacharycarter> and it's API being perhaps a bit less cumbersome
21:05:58FromDiscord<treeform> krux02, making it longer
21:06:04FromGitter<zacharycarter> but that could also be due to the wrapper
21:06:22krux02regaridng image -> bitmap -> surface
21:06:27krux02I don't know exactly what you mean
21:06:44krux02but SDL2 has two different classes of impages.
21:06:46FromDiscord<treeform> krux02, my comment cairo surface -> sdl serface -> sdl texture -> copy to render
21:06:54Araqrayman22201, `=destroy`(daSeq)
21:07:02FromDiscord<treeform> krux02 , it seems like I am copying the same images 4 times
21:07:08FromGitter<zacharycarter> here's my code for my entry point: https://gist.github.com/zacharycarter/d1b105787fc3153eea9087e60cd8fe89
21:07:37FromGitter<zacharycarter> whenever I'm using SDL2 and OpenGL I never use SDL surfaces or SDL textures
21:07:40krux02The Surface, which is basically a texture in RAM with software operations enabled, and a "Texture" which is the same thing on the GPU for rendering operations.
21:08:00krux02I personally don't use the "texture" class at all, because I don't like the SDL2 renderer.
21:08:30FromDiscord<treeform> Yeah I don't get SDL2 renderer. I though that is the part you guys liked.
21:08:46krux02that means that is Surface left for image loading and changing it's format to write it into GPU memory in my own texture class.
21:09:01krux02yea just skip the sdl2 renderer.
21:09:12FromDiscord<treeform> Well then SDL is a lot smaller 🙂
21:09:25FromGitter<zacharycarter> yeah - unless you are creating a simple 2d game using the SDL renderer doesn't make much sense
21:09:29krux02nice thing, you can skip it.
21:09:40krux02you can decide no not initialize it
21:10:07krux02I think it is still part of th DLL though
21:10:27FromGitter<zacharycarter> that's the main reason I'm using sokol
21:10:29krux02I think even for 2d games the renderer is not really great.
21:10:30FromGitter<zacharycarter> no linking of any libraries
21:10:43FromGitter<zacharycarter> well no, it's not, no sprite batching
21:10:53krux02yea, but I think it makes sense to link sdl dynamically.
21:11:02FromDiscord<kodkuce> nuclear?
21:11:05FromGitter<zacharycarter> I agree
21:11:15krux02libraries that connect to hardware components should be linked dynamically.
21:11:26FromGitter<zacharycarter> unless they're single header files :)
21:11:28krux02so that the hardware may be newer than the software.
21:11:50FromGitter<zacharycarter> then a compile pragma and a preprocessor definition will do
21:12:04krux02not really
21:12:30FromDiscord<treeform> but only like drivers connect to hardware components?
21:12:43FromGitter<zacharycarter> I don't get your point
21:12:52FromDiscord<treeform> I hate dynamical linking ...
21:13:34FromDiscord<kodkuce> https://github.com/vurtun/nuklear
21:13:49FromGitter<zacharycarter> if I can avoid my end users having to build SDl2 / GLFW3 into a shared library by just compiling a single header file
21:13:55FromGitter<zacharycarter> and get windowing / input handling
21:13:56FromGitter<zacharycarter> that's a win to me
21:14:00krux02yea you are probably right, only drivers connect to hardware components. But what if the operating system changes API and new features are enabled only through the new API, for example more axes for joysticks.
21:14:20krux02a dynamic SDL could swap internally to the new internal API.
21:14:28FromGitter<zacharycarter> well then SDL needs to add support for them and you need to build a new version of SDL2 to take advantage of them
21:14:30FromDiscord<treeform> well axes for joysticks, you iterate over these?
21:14:39FromDiscord<treeform> There isn't a fixed amount...
21:14:52FromGitter<zacharycarter> or download a new version of SDL2
21:14:56krux02yes, but on windows there is a maximum of 8 I guess
21:15:03krux02(last time I checked was some years ago)
21:15:05FromDiscord<treeform> there is?
21:15:42krux02On linux I connected my Dualshock 3 controller and got my system told me that I had 23 axes
21:15:48*xet7_ joined #nim
21:16:00krux02every button was an axes with pressure sensitivity.
21:16:14krux02didn't know it before I connected it.
21:16:27krux02plus montion controls
21:16:30krux02no game could handle it.
21:18:34FromDiscord<treeform> wow this is really cool: https://user-images.githubusercontent.com/7249728/60570947-e6787f80-9d72-11e9-8b26-d189f44b1256.gif
21:18:43FromDiscord<treeform> from https://github.com/nimgl/nimgl
21:18:43krux02anyway, point is. There is an advantage if you link SDL2 dynamically. Every game does bundle SDL2 DLL on windows (if it uses it). I don't understand why you really want to strive against the stream here.
21:19:16*xet7 quit (Ping timeout: 264 seconds)
21:19:50FromDiscord<treeform> Bundling your app wit the DLL in the folder is basically static linking but without the optimizations. And yeah I'll do it. But I don't like it.
21:20:40shashlick@treeform, hope you got my message from earlier
21:21:48FromDiscord<treeform> No this? "<shashlick> @treeform sorry been a busy morning, can you please take a look at the nimble local deps rfc and share your thoughts"
21:22:25FromDiscord<treeform> hmm google does not return it
21:22:54FromDiscord<treeform> its not this https://github.com/nim-lang/nimble/issues/131 ?
21:24:04FromDiscord<treeform> oh this https://forum.nim-lang.org/t/5448
21:30:20shashlickyep, both point to the gist
21:30:29shashlickthanks 🙂
21:31:10shashlicksince you've worked on nimby
21:31:35FromDiscord<treeform> @shashlick, I guess my main thing is I don't get why nimble is so complex. And here this thing is asking to add more stuff to it. I just can't get into the problem. I just want to install, remove and update... why are all of the features and flags here? I think I just made my nimby ( https://github.com/treeform/nimby ) thing and kind of forgot problems exists and now you bring me the problem again ... and I am like I just evolved beyond it
21:34:02shashlick@treeform - i cannot answer why it is complex but it has been around since 2011
21:34:27*narimiran quit (Ping timeout: 240 seconds)
21:34:42disruptekagree.
21:35:44FromDiscord<treeform> I feel like I can't get excited bout nimble discussion ... which prevents me from forming an opinion on your RFC. Just reading the comments is making me feel uneasy.
21:36:12shashlicki don't think package management is an easy problem either so I am keen on improving what we have with community feedback
21:36:32shashlicki have attempted to update the main proposal based on those comments so you could probably skip them
21:38:15disrupteki would say a 200-line package manager suggests otherwise.
21:38:20disruptekwhat's hard is arguing about this crap.
21:38:32disrupteki'm done talking about it. i started on nimph today.
21:38:49Zevvwut
21:38:51FromDiscord<treeform> haha lets all make our own package managers 🙂
21:38:53disruptekyou guys do what you want with nimble.
21:39:05FromDiscord<treeform> I am with disruptek on this one.
21:39:16FromDiscord<treeform> Well not with him, I am on a seperate thing.
21:39:43FromDiscord<treeform> I don't get why there is a global json file... just use github urls.
21:40:05FromDiscord<treeform> I don't get why there is a global ~/.nimble dir just put everything locally in like a `libs` folder
21:40:23FromDiscord<treeform> I don't get why it uses version numbers, just use githashes ...
21:40:48shashlickyou are ignoring the fact that you are sitting on years of development in this whole area
21:40:56shashlicknpm, pip, cargo, etc
21:41:00shashlicklots of lessons learned
21:41:22disruptekyep.
21:41:26FromGitter<Willyboar> i personally hate npm
21:41:27FromDiscord<treeform> I love npm... npm install goes locally, npm -G goes globally
21:41:27disruptekthat's the whole point.
21:41:33FromGitter<Willyboar> and i like pip
21:41:39FromGitter<Willyboar> especially freeze
21:41:44FromDiscord<treeform> I hate pip, its always broken for me
21:41:52shashlickthere may be better ways no doubt but throwing out everything without knowing what's in there isn't wise
21:41:53FromDiscord<mratsim> pip is broken
21:41:55rayman22201@araq any clues why deepDispose is not doing the right thing automatically? Shouldn't just calling it on the future invoke the destructor?
21:41:59FromDiscord<treeform> There are like 3 different pip installs and they all do different hings
21:42:04disruptekif i hadn't had any experience with anything else, i wouldn't be unsatisfied with nimble.
21:42:04FromDiscord<treeform> There are like 3 different pip installs and they all do different things
21:42:32*MightyJoe joined #nim
21:42:51shashlickinstead of a variety of efforts in different directions, it would be great to collaborate and improve nimble
21:42:52FromDiscord<mratsim> I don't get why I have to remember this script to update python version: https://gist.github.com/mratsim/8135b4f6824b61955122fdf828652298
21:43:05FromDiscord<treeform> shashlick, I totally agree with you. You can't just throw out nimble as a community.
21:43:12FromDiscord<mratsim> "pip3 freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip3 install -U"
21:43:17shashlickcollaboration isn't easy or without compromise but nothing comes out without it
21:43:25FromDiscord<treeform> shashlick, but me as an individual ... I totally can!
21:43:44FromGitter<Willyboar> well mostly the basic idea of pip
21:43:48Araqrayman22201: I suspect I got deepDispose's logic wrong
21:43:56Araqbut i tested it quite a bit...
21:44:14Araqbut I have to sleep now, sorry
21:44:16Araqgood night
21:44:23FromDiscord<mratsim> night
21:44:26FromGitter<Willyboar> gn
21:44:33*cyraxjoe quit (Ping timeout: 265 seconds)
21:44:46FromGitter<Willyboar> what about rubygems?
21:44:53FromGitter<Willyboar> what do you think?
21:44:56shashlickanyway, i'm trying to get folks together to attack this together, I understand if you are turned off but I wouldn't seek your opinions if I thought your ideas or concerns were bad
21:45:01FromDiscord<mratsim> I never used ruby, except homebrew
21:45:36disruptekshashlick: i will always support you. i'm just not interested in waiting another 5 years.
21:45:48shashlicki'm already coding local deps mode
21:46:02shashlicki've already identified step 2, 3 and am working towards lock files
21:46:03FromDiscord<treeform> shashlick, same what you are doing is very noble
21:46:08disruptekand that's great. i will use it.
21:46:18FromDiscord<treeform> what are lock files?
21:46:26FromDiscord<mratsim> for me it's important to have better control on the version of each packages for production, and for experimentation, it should default to the latest stable release or master but currently it's impossible to know if nim will call mypackage-#head, mypackage-#master or mypackage-0.1.0
21:46:51*Trustable quit (Remote host closed the connection)
21:47:02FromDiscord<mratsim> And give me a nimble update
21:47:15disrupteki'm just going to do this properly, honestly. it's not even worth enumerating what that means.
21:47:19shashlickit will simply move faster with you all as well
21:47:20FromDiscord<mratsim> updating a dependency is a pain, I often have to nuke my .nimble directory
21:47:24disruptekeveryone knows what a proper package manager looks like.
21:47:38FromDiscord<treeform> disruptek, will you have a global json file?
21:47:50shashlickright but everyone lives with legacy
21:47:59disrupteki use nimble's json file if i find it, so that you don't /have/ to use the url.
21:48:01shashlicksome of it dies, some of it transforms, some of it persists
21:48:15disruptekbut i integrate with github directly, so...
21:49:08shashlickthere's a con with every method if you ask enough people honestly
21:49:35FromDiscord<mratsim> tbh, I like what cargo is doing
21:50:10FromDiscord<treeform> Main issue i have with global json is stuff like `nimble install glfw` can install one of 3 packages... I have to know which nimble names map to which github urls to install the right one.
21:50:27FromDiscord<treeform> https://nimble.directory/search?query=glfw
21:50:50FromDiscord<mratsim> we probably need a central repo at one point
21:51:08disruptekit's just too useful to be able to rattle off a bunch of crap you know you'll need.
21:51:12disruptekso i want to support that.
21:51:18FromGitter<Willyboar> personally i think that nim needs central package hosting similar to rubygems and cargo
21:51:21disruptekif it's ambiguous, that's a separate issue.
21:51:24FromDiscord<mratsim> or decentralized, but somewhere we can clone packages so that dependencies don't suddenly disappear when people delete their Githu account
21:51:44FromDiscord<treeform> well then they will delete their nimble.com account.
21:51:45*go|dfish quit (Ping timeout: 250 seconds)
21:51:56FromDiscord<mratsim> but the package will still be there
21:52:12FromDiscord<treeform> so not allow deleting of stuff?
21:52:15disruptekthere are many ways around that problem.
21:52:24FromDiscord<treeform> could they upload a "" file?
21:52:28FromDiscord<mratsim> on Cargo it's says expressly that what you put there will not be deleted unless big issue
21:52:38FromDiscord<mratsim> no, it's versioned
21:52:45disrupteknimph builds immutable distributions, but it could also let you move your dependency to your own github fork and then handle updating it for you.
21:52:50FromDiscord<mratsim> you can use 0.3.0 or 0.4.0
21:53:08FromDiscord<mratsim> this allows everyone to update at its own pace
21:53:15FromDiscord<mratsim> at the cost of storage
21:53:24disruptekgithub storage is free, though.
21:53:33FromDiscord<mratsim> I don't think cargo is on Github
21:53:55shashlickokay so still at step 1 here - can i count on you guys to help with testing, code reviews and contributions on nimble
21:54:01FromGitter<Willyboar> take a look at rubygems.org
21:54:23disrupteki'm happy to look but i'm done with touching.
21:54:47*paxis quit (Quit: Client exiting)
21:54:51FromDiscord<mratsim> more likely testing + opening bugs for me
21:55:44shashlickokay, i'll continue asking for feedback so that we can solve these issues over time
21:55:57shashlick@mratsim - appreciate your review of the gist as well
21:56:01FromDiscord<mratsim> don't hesitate to use the forum btw
21:56:11shashlick@treeform - anything you disagree with on the gist
21:56:15shashlickmain proposal
21:56:38shashlick@mratsim - i've posted it on the forum as well
21:57:14FromDiscord<treeform> shashlick, I just don't feel like it solves any of my problems. If it solves your problems great.
21:58:25*nif_ quit (Quit: ...)
21:58:34*nif joined #nim
21:58:47shashlickyou mentioned you don't like the global ~/.nimble and to use a local libs
21:58:49shashlickthis is exactly that
21:59:39dom96what are you all discussing?
21:59:52FromDiscord<treeform> dom96, nothing...
22:01:07dom96You're discussing nothing?
22:01:13FromDiscord<treeform> yep
22:02:07shashlicktrying to win some love for nimble
22:04:29shashlick@dom96 - question for you - I've explained why i think project isolation is valuable and how it will make lock files easier to build than the user deps mode
22:04:43shashlickwhy do you think this is not accurate?
22:05:13*go|dfish joined #nim
22:05:34*Tyresc joined #nim
22:05:54dom96Can you point me to exactly where you explain how lock files can benefit from this feature?
22:06:22dom96I read your "Motivations" in your RFC and I'm still not certain
22:06:32dom96Presumably "Once a working configuration is reached regardless of deps mode, the user can then generate a lock file that improves on distribution. That design will be discussed separately and not distract this RFC."?
22:06:35*Vladar quit (Quit: Leaving)
22:06:56dom96But in my mind you don't /need/ project-local deps for this
22:08:13shashlicknot for simple project sure - but if you have many active projects and a variety of dependencies installed in ~/.nimble, you have lesser control over which package gets pulled into your active project
22:08:36dom96Also, your motivations do not match Araq's. Your motivations sound a lot like the same motivations for lock files.
22:09:27shashlickthis comment is an example - https://gist.github.com/genotrance/ee2ce321a56c95df2d4bb7ce4bd6b5ab#gistcomment-3073716
22:09:31dom96shashlick, that sounds like a rare issue, and if it happens you can always remove old versions of packages.
22:10:12dom96yes, that comment describes what lock files will solve.
22:10:41shashlickyou cannot create a lock file in the first place when you have such conflicts
22:12:08dom96Cargo manages it somehow, no? :)
22:13:11*letto quit (Quit: Konversation terminated!)
22:13:27shashlickthe whole reason I picked up this local deps mode thing is because you and Araq agreed on it in the first place
22:13:34shashlicki am simply documenting all the nuances
22:13:49shashlickand i'm happy not to do it if it isn't useful
22:15:09shashlickwhere does cargo store dependencies? globally or per project
22:16:11FromGitter<Willyboar> i think globally
22:16:19*pbb quit (Remote host closed the connection)
22:16:25dom96yeah, globally AFAIK
22:17:02dom96Most users of Rust also do not use `rustc` directly, they use `cargo` to build their software
22:18:08shashlickyes but that's not what our community is used to
22:18:25shashlickand we do not have lock files yet or any plan or design
22:20:10dom96our community isn't used to project local dependencies either
22:20:31*pbb joined #nim
22:20:35dom96it's up to us to decide where we go, and I've been advocating for "use Nimble instead of Nim for everything" for a while now
22:21:23shashlickits not like cargo hasn't run into these issues
22:21:23shashlickhttps://stackoverflow.com/questions/25074191/how-to-resolve-multiple-matching-crates-for-package-in-cargo
22:21:27dom96The reason I am asking you to clarify your motivations is because they are different to Araq's motivations as far as I understand
22:21:29shashlickhttps://www.reddit.com/r/rust/comments/3tsohd/cargo_url_version_conflict/
22:21:38shashlickagreed they are old and i have zero rust experience
22:21:46*solitudesf quit (Ping timeout: 265 seconds)
22:22:13shashlickso no idea but this idea of isolating deps has resonated with many folks
22:22:29shashlickwhat are Araq's motivations?
22:22:55dom96Araq's motivations: https://gist.github.com/genotrance/ee2ce321a56c95df2d4bb7ce4bd6b5ab#gistcomment-3072467
22:23:19shashlickthose are my motivations after a bunch of revisions mainly because i understand project local deps do not solve every instance of dependency conflicts but definitely reduce the instances
22:23:38shashlickand lock files remove them once and for all but you even need to get to that point where a stable lock file can be created
22:24:33dom96You're presenting this as an alternative to lock files, which is why I am asking for clarification
22:24:36shashlicklooking at that comment, it is exactly what i'm saying
22:24:49shashlicki'm not saying this is an alternative to lock files
22:24:53dom96Perhaps that is the way to go, but if that is what we're considering then we need to be clear about it.
22:25:09shashlickOnce a working configuration is reached regardless of deps mode, the user can then generate a lock file that improves on distribution. That design will be discussed separately and not distract this RFC.
22:25:15shashlickfrom motivations ^^
22:25:45shashlickbasically local deps will provide project isolation which will help reduce dependency conflicts
22:25:55dom96Okay, but all of the things you want to implement seem like a replacement for lock files to me
22:26:01shashlickand lock files will solve the distribution and reproducible builds concerns
22:26:23shashlickwhich aspects in particular?
22:27:26dom96You say that you want to provide "dependency isolation", to me that is what lock files are about as well.
22:28:24*letto joined #nim
22:28:39dom96I think many people here also see it that way.
22:29:16dom96But on the other hand, if we say that this isn't a replacement for lock files, then I'm not sure it solves a big enough problem to be worth so much effort.
22:29:56dom96Maybe I'm overestimating the effort required though
22:30:07shashlickthe code change for this is quite minor - just leveraging nimbleDir functionality
22:31:17shashlicklock files have bigger impacts
22:32:00dom96I could say that changes to implement lock files are quite minor too to be honest.
22:32:15dom96All it is is a list of URLs and commit hashes
22:32:30dom96Nimble already understands those and can install them into isolated directories
22:33:34dom96At a high level it would just involve reading the lock file and use the list of deps that is specified there instead of in the .nimble file.
22:34:40dom96Let's look at this another way though
22:34:43shashlicklet me ask this question
22:34:53dom96okay, go ahead
22:35:18dom96btw just noticed this in your RFC "Checking in $prj/deps/* - vendoring or poor man's lock files"
22:35:39shashlickif you have prj1 and prj2 - both need dep1 but prj1 needs v1 and prj2 needs v2
22:36:01dom96okay, I'm with you so far
22:36:29shashlickso prj1 nimble file says dep1 >= v1 and prj2 says dep1 >= v2
22:36:43dom96right
22:37:18shashlickso somehow, v1 of dep1 is already installed in ~/.nimble by some other project
22:37:19*ng0 joined #nim
22:37:56shashlickif you work on prj2, it will now install dep1v2 by nimble and when you create its lock file, it will be created correctly
22:38:11dom96right, I think see where you're going with this
22:38:21shashlickbut if you now switch to prj1 and attempt to create a lock file, it will just pick up v2 again which is not the right version
22:38:27dom96prj1's `dep1 >= v1` is wrong then
22:38:32shashlicki'm curious how cargo solves this, or if the sequence is off
22:38:44dom96the way cargo solves this is with semantic versioning
22:39:01dom96`dep1 ~= 1.*.*`
22:39:50dom96In Nim you could write: `dep1 >= 1.0.0 && dep1 < 2.0`
22:40:08dom96or sorry, dep1 >= 1.0.0 && < 2.0
22:40:15dom96That's the correct syntax IIRC
22:40:44dom96Cargo has syntax sugar for this, and Nimble should get this too: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#caret-requirements
22:41:15dom96bah, I got the syntax wrong again, it's just one ampersand
22:41:27dom96https://github.com/nim-lang/nimble/blob/master/src/nimblepkg/version.nim#L300
22:41:52dom96This has been implemented in Nimble since 2012 :)
22:41:54shashlickso now the package author has to be very prescriptive in his package ranges instead of project isolation which avoids this whole thing
22:42:43dom96the package author has to be prescriptive anyway
22:42:50dom96even with project isolation
22:43:02dom96Do you expect everyone to commit their local deps folder into git?
22:43:23dom96if the answer is yes, then consider the implications
22:43:29shashlickI don't want local deps to be used to solve distribution issues
22:43:33shashlickthat is a lock file domain
22:43:56dom96the local deps folder is the source of truth for dependencies, so how can Nimble install the package? It'll need to copy the packages in the local deps directory into wherever it is installing I guess?
22:43:58shashlickthat's why i mentioned vendoring or poor man's lock files - it doesn't really solve anything beyond the immediate developer's issues
22:44:35dom96okay, so the developer will still need to specify the dependency requirements accurately
22:44:47dom96so that others can install their packages
22:45:31shashlickwhen a local deps package is installed, it goes back into standard behavior
22:45:33dom96(remember that lock files only make sense for binary packages, so for library authors lock files will not save the developers from having to specify good requirements)
22:45:40shashlickuntil lock files come, we won't solve the distribution issue
22:46:06shashlickwhich is why i said isolation is perhaps a foundation, not crucial for or a replacement for lock files
22:46:37dom96once again, if all it solves is the example you gave above then it's a misfeature
22:46:51dom96package authors will *need* to specify good package requirements anyway
22:51:04dom96Does that make sense?
22:51:23shashlickya am thinking about it
22:51:47shashlicklike i said, i started this based on the assumption that you and Araq agreed that $prj/deps is a simple/easy thing
22:53:09dom96I actually wanted Araq to implement this so that I could discuss these issues with him. I figured that once he would start to implement it we would have a more concrete idea of what this feature will be like
22:53:20dom96So in principle, yes, I agreed to this.
22:53:44shashlickhttps://irclogs.nim-lang.org/30-10-2019.html#13:18:47
22:55:50shashlickhow often do people override CARGO_HOME
22:55:55shashlickor GOROOT or whatever
22:57:06dom96yes, I discussed it with Araq and gave him some ideas on how to implement this with the intention of iterating on the solution until we got to something we would be happy with.
22:57:41dom96I would have challenged him in the same way I am challenging you if I didn't understand the motivation behind his plans.
22:59:40shashlickokay i understand if this wasn't clear at the time but i don't see my motivations as different from what Araq has mentioned
23:00:35dom96Okay, well now I know that they are the same, but now I've become less convinced that this is a necessary feature after all these discussion.
23:00:39dom96I hope you can understand why
23:02:14shashlickyour solution to this is effectively to be more prescriptive of the dependency version in nimble
23:03:36shashlickthe topic of communicating nimble dep selection to nim and removing nim's knowledge of nimble is still separate and open
23:04:06dom96I argue that packages should /already/ be prescriptive
23:04:19dom96But I agree that Nimble can do more to encourage that
23:05:00shashlickthat's not necessarily an easy problem though - lock files + caret requirements and other magic will take time to get right
23:05:29dom96Btw now that I think about it a bit more, I actually don't think Araq would have given the same example as you when speaking about his motivations. I think he just doesn't want to bother writing .nimble files, and instead wants to install the packages he needs with a command and be done with it.
23:06:10shashlickthat's a separate issue of nimble updating the nimble file on install/uninstall
23:06:29shashlickit's not quite as easy since nimble files are code and not data
23:06:37dom96Maybe it's a separate issue to you, but I believe that is his motivation for this feature.
23:07:05shashlicki mean it is a potential nimble feature
23:07:38dom96true, and it would solve the same problem as the "local deps" solution
23:08:06dom96but it might actually be much easier to do
23:08:16*Tyresc quit (Ping timeout: 268 seconds)
23:08:29dom96oh, the only problem is you wouldn't be able to run `nim c` to compile the code
23:09:09dom96but even for "local deps" you'd need a `nim` modification for this to work
23:09:41shashlickya but from our earlier discussion, you said let's figure it out with nimble c before we work out the nim <=> nimble improvements
23:09:41dom96maybe instead we can give Araq a little command line tool that modifies his nim.cfg file with `--path` statements :D
23:10:21shashlicki'm not sure how this use case has anything to do with local deps really
23:10:54dom96yeah, what worries me the most about this local deps feature is that you intend to modify `nim` as well for it
23:11:00*ng0 quit (Ping timeout: 260 seconds)
23:11:15dom96which I'm glad we agreed not to do for now
23:11:39dom96Here is what I see might work for Araq:
23:11:54dom96nimble edit-cfg-mode # TODO: better name
23:12:19dom96nimble install pkg # Installs the package into ~/.nimble and adds its path to nim.cfg
23:12:57*ng0 joined #nim
23:13:24shashlicki think we can share this transcript with him and see what his thoughts are
23:13:31dom96The reason I suggest this is because I'm rather worried that Araq's problems don't extend to the wider Nim community, hence the very specialised command for this
23:13:51shashlickmy concern with the nim.cfg method is that it works fine if you install/uninstall packages in a folder - nim.cfg will be kept up to date
23:14:13dom96right, but won't you have to do the same with the "local deps" folder?
23:14:31shashlickbut if you never use nimble and simply try to run nim commands on some .nim file, none of the already installed packages will get picked up since there won't be any nim.cfg
23:15:02shashlicklike i said, i tabled that entire nim <=> nimble design for later
23:15:34dom96well, this particular thing seems important, I can't imagine what you're planning the work flow here to be
23:15:47shashlickthat's why local deps was simply isolation
23:15:51dom96It might in fact help to specify this in future RFCs: a typical normal user's workflow for this feature
23:16:10dom96Do you expect users to manually copy dependencies into the local deps folder?
23:17:07shashlicki know there are nuances - that's why i want them discussed well before we code up anything
23:17:39shashlickfor local deps, once you mkdir, any nimble command you run will setup deps locally
23:17:46shashlickany command that runs processDeps
23:18:18shashlickand a user would have to use nimble since that's the only way to download and install deps
23:18:21dom96right
23:18:37dom96so I don't understand your concern above
23:18:52dom96for the nim.cfg method
23:19:50shashlickassume that a package is already installed in ~/.nimble and there isn't a nim.cfg, there's no need to run nimble
23:20:19dom96but the whole idea is isolation? no?
23:20:46shashlicki'm not talking isolation, i'm talking about your edit-cfg-mode
23:21:42shashlickagain, without Araq here to speak for himself, it is hard to guess what he wants
23:22:25shashlickI didn't cover any nim <=> nimble interop in the proposal and he liked it
23:22:38dom96I'm trying to compare local deps to edit-cfg-mode
23:22:55dom96your concern is that it requires nimble
23:23:01dom96but local deps requires nimble too...
23:23:21shashlicki see edit-cfg-mode as the solution to remove nim's awareness of nimble
23:23:42shashlickthat way, nim gets told what packages to load, regardless of whether it comes from $prj/deps or ~/.nimble
23:24:02shashlickit does not have anything to do with isolation
23:24:31shashlickperhaps it does in some way if nim's algorithm to pull pacakges is not as fine grained as nimble's
23:24:49shashlickthat's why you are arguing that nimble should be the front end
23:25:02shashlicki haven't reviewed nim's dependency search algorithm
23:25:20dom96it has everything to do with the motivation behind "local deps"
23:25:26shashlickquoting araq: It's to avoid bugs when nim c picks the wrong version of a package for a build
23:25:35dom96and it does solve isolation too
23:25:53dom96the only difference is that packages are installed in the same place they always have been
23:26:03dom96and that Nim doesn't need to be modified
23:28:15shashlickso you are saying it provides isolation since once the nim.cfg file is created, it now has a hard-coded path to a version of the dep
23:28:39shashlickbut i don't understand how the package can be distributed like this with no `requires`
23:28:56shashlickthere will just be a nim.cfg pointing to stuff that isn't installed yet
23:29:32dom96yes, but "local deps" cannot be distributed either
23:29:55shashlicklocal deps still requires requires
23:30:24dom96I don't think it does
23:30:31dom96not when running `nim`
23:31:30shashlickhow will those deps show up on a second machine
23:31:43shashlicknimble won't look at the nim.cfg and install them
23:32:41shashlickso in `edit mode`, nimble install will install to ~/.nimbe and update nim.cfg
23:33:01dom96again, this is how "local deps" would work too
23:33:14shashlickso the location will be hard-coded to that specific package in global ~/nimble
23:33:18dom96if local deps is enabled, you run `nimble install blah` and it gets put into the local deps
23:33:42shashlickbut user will still have to specify requires dep1, etc
23:33:52shashlickthat way when project is installed, they will redownload the deps
23:34:14dom96Will you force them to do that?
23:34:29dom96You cannot force them because Nim will "just work" with the local deps
23:34:29shashlickif they don't, project won't be redistributable
23:34:43dom96Yes, and this is why it's bad to encourage this
23:34:58shashlicki'm not talking local deps at all - i'm talking edit mode
23:35:18shashlickcan you describe step by step, i'm not sure what the problem is that is being solved
23:35:29dom96argh
23:35:42dom96I know you're not talking edit mode
23:35:51dom96er
23:35:52dom96local deps
23:36:02dom96I'm trying to show you that these are very similar
23:36:07dom96to show you the problems with the proposal
23:36:45shashlickyes i'm getting that it is possible to get isolated deps with nim.cfg but i'm trying to get the rest of what you are saying
23:38:48dom96in edit-cf-mode: nimble install blah # -> .nimble and into .nim.cfg
23:39:10dom96in local deps mode: nimble install blah # -> into $PWD/deps
23:39:18dom96in edit-cfg-mode: nim c project.nim
23:39:35dom96(Reads the .nim.cfg and knows the paths)
23:40:03dom96in local deps mode: nim c project.nim (Looks for $PWD/deps and adds any packages in there to the path automatically)
23:40:44dom96Both solve the same problem, both have the same problems.
23:44:54shashlickthe problem of distribution?
23:45:47dom96They solve isolation, and indeed they have the problem of distribution
23:47:04shashlicki think nim.cfg method solves the interop issue as well without requiring duplicate dep pkgs per project
23:47:09shashlickbut would the user then check in the nim.cfg
23:47:57shashlickit almost sounds like we can promote the nim.cfg into nimble.lock or something instead and that can be checked in
23:48:31dom96yes, I'm intentionally trying to raise these parallels between these
23:48:34shashlickbut we need to solve the issue of paths - perhaps $nimbleDir/pkg/123 and nim will use the std nimble dir for that platform
23:49:13dom96For isolation I would be happy with just lock files
23:49:18shashlickhow would nimble c then work? in edit mode, would it no longer pass stuff to nim?
23:49:31dom96But then Araq won't be happy because he'll need a .nimble file in order to get a lock file
23:50:03dom96My suggestion of edit mode isn't 100% serious, I just wanted to demonstrate why I think local deps isn't what we should be pursuing
23:50:08shashlicki'm not sure that should be true - every pkg manager expects you to tell what version range you want
23:50:40shashlicki'm cool with that, that's why i'm asking questions of everyone - i don't have a strong opinion either way
23:50:56shashlickwhat I want though is to solve the community's concern with nimble
23:51:29dom96That's brilliant, in order to do that though you need to understand the concerns
23:52:01dom96If Nimble becomes a mess of features which achieve the same goals then no one will have a good experience
23:52:27dom96it's important we get behind a single solution that solves 95% of the problems
23:52:37dom96and suggest fair workarounds for the rest of the use case
23:52:39dom96*cases
23:53:38shashlickok here's a thought - we can certainly create a nim.cfg format file with paths to specific versions
23:54:13shashlickthis will provide isolation (path to specific version not impacted by other packages) which is simultaneously a lock as well
23:54:19shashlickit can be checked into source control
23:54:39shashlickit is also reducing nimble specific code in nim
23:54:48shashlickall nim would need to know is the nimbleDir
23:54:58dom96okay, this sounds like a separate proposal
23:55:01shashlickrest of the paths are in the nim.cfg
23:55:13shashlickbig question - how can nimble now recreate this configuration
23:55:13dom96honestly I'm too tired now and need to go to bed. Feel free to write it up though
23:55:30dom96I think this is just an implementation detail of how lock files will be implemented though
23:55:34shashlickfor that nimble will need to read this nim.cfg, figure out the specific pkg versions and install those
23:56:37disrupteki'm doing this in nimph, but it requires a compiler tweak.
23:58:02shashlickwhy does it need a compiler tweak
23:58:10disruptek'cause the parse isn't exported.
23:58:15disrupteks/parse/parser/
23:58:31disrupteki know. it's dumb.
23:58:45shashlickyou mean it will import the nim.cfg using the compiler as a lib?
23:58:50disruptekyeah.
23:59:08shashlickit's just a cfg file, we can just read --path:
23:59:13shashlickanyway nimble no longer imports compiler
23:59:18disrupteki don't see the point in maintaining my own parser for nim.cfg.
23:59:19shashlickit calls nim as a separate binary
23:59:38disruptekyou can do whatever you want. 😉
23:59:59shashlickcome on, don't walk away randomly