<< 20-12-2019 >>

00:04:29*leorize joined #nim
00:05:12*dillonb quit (Quit: WeeChat 2.2)
00:05:51*loading joined #nim
00:05:53loadinghi
00:05:59disruptekhello
00:06:06loadinghows life
00:06:43disruptekfair to middling.
00:06:46disruptekyou?
00:07:22clyybberstill loading
00:07:59clyybbersup loading
00:08:19clyybbergn8 ppl
00:08:21*clyybber quit (Quit: WeeChat 2.7)
00:09:47*gmpreussner quit (Quit: kthxbye)
00:10:55loadinghi
00:12:48*gmpreussner joined #nim
00:20:12*krux02 quit (Remote host closed the connection)
00:26:50shashlickyay choosenim 0.5.0 is finally out - https://github.com/dom96/choosenim/releases/tag/v0.5.0
00:27:59*gmpreussner_ joined #nim
00:29:12*gmpreussner quit (Ping timeout: 260 seconds)
00:32:04*loading quit (Remote host closed the connection)
00:43:20*voltist joined #nim
01:11:03*setenforce joined #nim
01:12:26*zedeus joined #nim
01:26:59*russellb joined #nim
01:27:49russellbfolks
01:27:59russellbnim beginner
01:28:15russellbany sources and example projects to learn nim is much appreciated
01:28:25*icebattle quit (Ping timeout: 258 seconds)
01:29:54*icebattle joined #nim
01:30:16disruptekrussellb: what kinda projects are you looking to author?
01:34:19russellbphysics simulations
01:34:30russellbnumerical computations
01:34:37russellb@distruptek
01:35:10disruptekscientific computing is mratsim's department.
01:35:30disruptek!repo arraymancer
01:35:32disbothttps://github.com/mratsim/Arraymancer -- 9Arraymancer: 11A fast, ergonomic and portable tensor library in Nim with a deep learning focus for CPU, GPU and embedded devices via OpenMP, Cuda and OpenCL backends 15 533โญ 48๐Ÿด 7& 6 more...
01:36:02disruptek!repo weave
01:36:03disbothttps://github.com/mratsim/weave -- 9weave: 11A state-of-the-art multithreading runtime: message-passing based, fast, scalable, ultra-low overhead 15 70โญ 6๐Ÿด
01:36:35disrupteki'm a guy that writes the dogshit that smart folks are too busy to bother with.
01:37:18russellbI am coming from rust
01:37:52russellbI find nim libraries documentation is not elaborate in comparison to rust.
01:38:01russellbi m firm on nim though.
01:38:14russellbexcellent combo of syntactic ease and compiled power
01:38:46russellblibraries are good start from first impression
01:38:50disruptekyeah, the tech is there, it's just early days for the community.
01:39:03*voltist quit (Quit: Quit)
01:40:49russellbhowever, I find lot of similarities conceptually b/w rust and nim
01:40:59russellbexcept borrow checker and gc
01:41:04russellbbc & gc
01:41:11russellb;-P
01:41:20russellbalgebraic data types
01:41:40leorizewell, languages designed to make programming safer will always be kinda the same :P
01:41:58russellbtypedefs and methods (in nim lingo - procs)
01:42:31*voltist joined #nim
01:43:27russellb@leorize: rust has all the mines burried under the hood with walk paths paved off from them
01:44:00russellblot of unsafe code in the std library
01:44:18leorizethat's the same everywhere :P
01:44:26russellbjust not allowing hte novice user to make some memory error
01:44:35leorizejust that we don't label code paths in Nim as "unsafe"
01:44:37russellbbut ofrces to think ahead of typing
01:44:47leorizeif you see cast, addr, and ptr, then it's unsafe
01:45:00russellbbut others doesn't claim to be memory safe as rust does
01:45:44russellbptr are inherently unsafe? is it?
01:46:06leorizeyep, due to the fact that they are not managed
01:46:14leorizeref on the other hand is totally safe
01:46:21disruptekit's a feature.
01:48:56russellbany overhead on "ref"?
01:49:02leorizerussellb: of course as with all "unsafe" feature, you can write abstractions on top of them that make them safe :)
01:49:15leorizeother than the gc, no
01:50:00leorizeand we are experimenting with different models that eliminate the full-fledged GC we have
01:50:31russellbwell I need to study nim's GC mech yet.
01:51:02russellbany novel ideas in it, so far?
01:51:15*voltist_ joined #nim
01:51:43disrupteki mean, yeah.
01:52:13leorizehttps://github.com/nim-lang/RFCs/issues/144
01:52:15disbotโžฅ Proposal to add 'owned' refs to Nim ; snippet at 12https://play.nim-lang.org/#ix=24U9
01:52:18leorizehttps://github.com/nim-lang/RFCs/issues/177
01:52:22disbotโžฅ Unify Nim's GC/memory management options ; snippet at 12https://play.nim-lang.org/#ix=24Ua
01:52:23*voltist_ quit (Read error: Connection reset by peer)
01:52:45*voltist_ joined #nim
01:53:06*voltist_ quit (Client Quit)
01:53:55*voltist quit (Read error: Connection reset by peer)
01:57:23russellbowned 'ref's would be great
02:02:26leorize[m]it'll be a long road there
02:02:40leorize[m]the majority of written nim code is incompatible with it
02:03:31leorize[m]with that said, the current system still works pretty well as long as you do things single threaded
02:04:12leorize[m]or if you multi thread without sharing data
02:04:38*watzon joined #nim
02:06:00russellbmulti threading would be great in this era of multi-core processors
02:06:23russellbBut for an evolving stage it should be O.K.
02:06:57russellbHow do you people forsee the nim's position in next 3-5 years?
02:07:18russellbIs it being used in production somewhere?
02:07:35disruptekproduction? sure.
02:07:46leorize[m]!repo nimbus
02:07:47disbothttps://github.com/status-im/nimbus -- 9nimbus: 11Nimbus: an Ethereum 1.0 & 2.0 Client for Resource-Restricted Devices 15 311โญ 41๐Ÿด 7& 7 more...
02:08:34leorize[m]!repo reelvalley
02:08:34disbotno results ๐Ÿ˜ข
02:09:59leorize[m]!repo nimforum
02:10:00disbothttps://github.com/nim-lang/nimforum -- 9nimforum: 11Lightweight alternative to Discourse written in Nim 15 438โญ 35๐Ÿด 7& 1 more...
02:10:29watzonI'm fairly certain every semi-popular language is being used in production somewhere. I just got done working for a company that was using Crystal in production
02:11:00russellbCrystal in production?
02:11:08russellbThat's interesting
02:11:21watzonYep. NeuraLegion uses Crystal for pretty much their whole stack
02:11:26russellbnimbus sounds like a serious project
02:11:59russellbwatzon: that's interesting and inspiring to hear
02:14:49watzonI'd say there's definitely hope for Nim in that area. It's a great language, and a lot of people love the Pythonic syntax.
02:14:56watzonNot to mention it's fast
02:15:47disruptekmore go than go.
02:16:00disruptekand less google.
02:17:17disruptekthis is pretty exciting:
02:17:19disruptek!repo nlvm
02:17:20disbothttps://github.com/arnetheduck/nlvm -- 9nlvm: 11LLVM-based compiler for the Nim language 15 245โญ 18๐Ÿด 7& 1 more...
02:20:57russellbthat's nice.
02:21:04russellbdisruptek: Have you tried this?
02:21:30disruptekyeah, but i need to follow devel/1.0 for now.
02:22:00disrupteki'm hoping to run nim/nlvm in graalvm.
02:23:41russellbo.k
02:24:05russellbpost your experiences, best through a blog
02:25:02disrupteki don't really understand blogs.
02:25:10disruptekwho has time to search out content like that?
02:25:37disrupteki'd rather write code. but, i'm old.
02:25:45disruptekonly a few more years left, if i'm lucky.
02:26:35russellb!!
02:27:31disrupteki'm working on this:
02:27:33disruptek!repo nimph
02:27:34disbothttps://github.com/disruptek/nimph -- 9nimph: 11a nim package hierarchy manager from the future ๐Ÿงš 15 22โญ 1๐Ÿด 7& 1 more...
02:28:57russellblemme check this out
03:12:56*icebattle quit (Ping timeout: 268 seconds)
03:14:19FromGitter<iffy> Since I didn't find a library for this already: https://github.com/iffy/nim-keyring I'll work on Linux when I next get a chance
03:33:28*endragor quit (Remote host closed the connection)
03:35:04*endragor joined #nim
03:39:54*endragor quit (Ping timeout: 258 seconds)
03:43:16*russellb left #nim ("WeeChat 2.7")
03:56:42*kevinchau joined #nim
03:59:03*kevinchau quit (Client Quit)
04:11:55*voltist joined #nim
04:14:39voltistI find it very hard to believe that nothing has been said on this channel while I have been away. Something must be wrong with my ZNC server...
04:23:48*chemist69 quit (Ping timeout: 252 seconds)
04:25:56*chemist69 joined #nim
04:26:28shashlickits been quiet for the last hour at best
04:28:55*endragor joined #nim
04:37:31*nsf joined #nim
05:06:39*oculux quit (Ping timeout: 246 seconds)
05:07:21*oculux joined #nim
05:23:32disruptek$ nimph downgrade sdl2_nim
05:23:37disruptekrolled sdl2_nim from 2.0.10 to v0.95
05:23:50disrupteki swear this person hates me.
05:24:26disruptekrolled sdl2_nim from 0.95.0 to v2.0.10.0
05:24:35disruptekit's madness, is what it is. sheer madness.
05:27:18shashlicksomeone's got to disrupt you too buddy
05:41:25*voltist quit (Quit: Leaving)
05:51:27FromGitter<zacharycarter> (https://files.gitter.im/nim-lang/Nim/nrIm/image.png)
05:51:33FromGitter<zacharycarter> starting to look pretty good I think
05:52:10FromGitter<zacharycarter> it doesn't look as tiled anymore
05:59:05FromGitter<juancarlospaco> New choosenim is not updating?. Info: Already up to date at version 0.4.0
06:01:28*marmotini_ joined #nim
06:06:23shashlicklooks like it is not updated on http://nim-lang.org website, need to ping dom96
06:07:13watzonHmm mine says version 0.5.0
06:08:27shashlickhttps://nim-lang.org/choosenim/stable still shows 0.4.0
06:09:04shashlickalso unclear where it downloads the binaries from
06:09:21shashlickwhen you update or run the init.sh script
06:14:50*marmotini_ quit (Ping timeout: 265 seconds)
06:19:11*gour joined #nim
06:29:06*actuallybatman quit (Quit: leaving)
06:39:42*voltist joined #nim
06:40:04*voltist quit (Client Quit)
06:40:29*solitudesf joined #nim
06:44:00*sealmove quit (Quit: WeeChat 2.6)
06:44:53*disbot quit (Ping timeout: 245 seconds)
06:45:17*disruptek quit (Ping timeout: 265 seconds)
06:46:19*marmotini_ joined #nim
06:46:41*marmotini_ quit (Remote host closed the connection)
06:46:57*marmotini_ joined #nim
06:51:40*marmotin_ joined #nim
06:52:26*marmotini_ quit (Ping timeout: 240 seconds)
06:53:42*dddddd quit (Ping timeout: 268 seconds)
07:00:31*narimiran joined #nim
07:08:53*disbot joined #nim
07:09:23*disruptek joined #nim
07:21:00*marmotin_ quit (Read error: No route to host)
07:21:11*marmotini_ joined #nim
07:28:04*PMunch joined #nim
08:00:00*gmpreussner_ quit (Quit: kthxbye)
08:04:49*gmpreussner joined #nim
08:16:55*Zevv quit (Ping timeout: 265 seconds)
08:37:36Araqping mratsim
08:38:27*Zevv joined #nim
08:38:45Araqinteresting how things are done in Swift land, https://gist.github.com/lattner/429b9070918248274f25b714dcfc7619
08:40:28Araqthey did without the Future abstraction
08:41:14Araqnot sure if it's a big difference in practice, the closures still need to allocate anyway
08:41:50FromDiscord<Milerius> Hey i'm learning threads with nim i have a question about threadpool
08:42:15FromDiscord<Milerius> I have a variable that is global inside of my package, but i know this variable will be thread safe, how can i specify it ?
08:42:42FromDiscord<Milerius> (i get a Error: 'mm2_init_thread' is not GC-safe as it accesses 'mm2_instance' which is a global using GC'ed memory)
08:43:12Araqit never is threadsafe IME
08:43:22Araqwhen the compiler tells you that it isn't
08:43:48Araqcan't outsmart the system. well, you can easily do
08:43:54Araq{.gcsafe.}:
08:44:06Araq use global here # I know what I'm doing
08:44:15FromDiscord<Milerius> Yeah i tried that
08:44:59FromDiscord<Milerius> Ah nice that compile now
08:45:00FromDiscord<Milerius> thanks !
08:45:14Araqbut keep in mind that it's unsafe, the memory backing up refs/strings/seqs is thread-local and "it's immutable" doesn't count either as the GC introduces write barriers
08:45:20Araqwhich are not threadsafe either
08:45:24FromDiscord<Milerius> It's because this variable is accessed once at the beginning of my program
08:45:28FromDiscord<Milerius> and once at the end of my program
08:45:34FromDiscord<Milerius> (It's an osproc.Process)
08:45:44FromDiscord<Milerius> I want to create the process in an async way
08:45:50FromDiscord<Milerius> And close it at the end of the program
08:46:28FromDiscord<Milerius> So far i got: https://gist.github.com/Milerius/4dbdad26e6021b3b6a0074225e110607
08:46:33FromDiscord<Milerius> Not sure it's the good way to do that
08:47:58FromDiscord<Milerius> I think Since i access this variable only Twice in the program it's "safe"
08:48:02FromDiscord<Milerius> Not sure too.
08:49:03FromDiscord<Milerius> i use it in the main like: initProcess()
08:49:03FromDiscord<Milerius> and then: defer closeProcess()
08:52:37Araqsounds ok to me too
08:52:49Araqthere is also an async osproc package somewhere
08:53:46FromDiscord<Milerius> ๐Ÿ˜ฎ
08:54:19FromDiscord<Milerius> Also, another question
08:54:20FromDiscord<Milerius>
08:54:20FromDiscord<Milerius> Is the equivalent of std::atomic_bool from c++ create a regular integer and nim and use atomicInc/atomicDec ?
08:54:25FromDiscord<Milerius> Or we have an atomic boolean ?
08:54:44FromDiscord<mratsim> @Araq I've been thinking on coroutine based multithreading. This one is a very efficient, very concise and also performant multithreading library based on whaat looks like coroutines: https://github.com/chaoran/fibril
08:54:57FromDiscord<mratsim> import std/atomics and use Atomic[bool]
08:55:14FromDiscord<Milerius> :OOOO
08:55:16FromDiscord<Milerius> Perfect
08:55:20FromDiscord<Milerius> thanks ratsim
08:55:23FromDiscord<mratsim> Actually it's the only library that is more efficient than mine on fibonacci ๐Ÿ˜‰
08:56:04FromDiscord<mratsim> it would be easier as well to mix async/await with spawn/sync
08:56:35FromDiscord<mratsim> but AFAIK the current design of weave still allows to switch to coroutines-based tasks
08:56:39FromDiscord<Milerius> @mratsim Where is the doc for atomics ?
08:57:37*clyybber joined #nim
08:57:39FromDiscord<mratsim> no docs, but C++ reference would work
08:58:01FromDiscord<mratsim> there are 2 competing atomics package and no final API was chosen
08:58:04FromDiscord<mratsim> you can read here: https://github.com/nim-lang/Nim/blob/devel/lib/pure/concurrency/atomics.nim
08:58:20FromDiscord<Milerius> I read but
08:58:25FromDiscord<Milerius> i don't understand how we set a value
08:58:31FromDiscord<Milerius> when i set = true it's not workin
08:58:32FromDiscord<Milerius> when i set = true it's not working
08:58:42FromDiscord<mratsim> foo.store(true, moRelaxed)
08:58:52FromDiscord<mratsim> if you want relaxed memory semantics
08:59:21narimiranNim Community Survey 2019 is here! https://nim-lang.org/blog/2019/12/20/community-survey-2019.html
08:59:35FromDiscord<Milerius> ah nice
08:59:41FromDiscord<mratsim> here is a simple example of Atomic bool on SPSC channel: https://github.com/mratsim/weave/blob/master/unused/channels/channels_spsc_single_object.nim#L45
09:01:16Araqthe C++ memory model is quite good but the names are terrible
09:01:36FromDiscord<mratsim> fetchAdd and AddFetch ๐Ÿ˜›
09:01:41FromDiscord<mratsim> and no fetchXor
09:01:51FromDiscord<mratsim> sorry fetchNeg
09:03:36FromDiscord<mratsim> btw, I started to use formal verification, I think a backend to a formal verification language 'maybe spin?) would be helpful
09:04:12FromDiscord<mratsim> I used TLA+ but it's higher level, both supports goto though
09:04:46AraqI planned to nimZ3
09:05:21FromDiscord<mratsim> ah right
09:05:50AraqZ3 supports separation logic iirc and everything that lacks separation logic isn't future proof :P
09:06:10FromDiscord<mratsim> TLA+ can use isabelle or Z3 for proofs as well
09:06:52FromDiscord<mratsim> i.e. it does model checking (exhaustively check all states your application can be in and ensure no deadlock, livelocks or any other constraint you don't want violated)
09:07:16FromDiscord<mratsim> or it does proofs by deferring to a SMT like Z3 or a proof assistant like Isabelle
09:07:37FromDiscord<Milerius> @mratsim Are you using Thread Sanitize with nim?
09:07:42FromDiscord<Milerius> To verify that you are thread safe
09:07:52FromDiscord<mratsim> planned but not yet
09:08:20FromDiscord<mratsim> probably will be my own tool, I was thinking of the name "Lage Nim COllider" :p
09:08:23FromDiscord<Milerius> I'm supposing i can just link to check
09:08:30FromDiscord<mratsim> See: https://github.com/mratsim/weave/issues/18
09:08:31disbotโžฅ [Testing] Concurrency: Race detection / Model Checking / Formal Verification
09:08:58Araqso ... as I also asked on the forum, what does 'spawn' use ideally?
09:09:04FromDiscord<mratsim> for now I've used Valgrind/Helgrind but it's very noisy the output is not usable
09:09:19FromDiscord<mratsim> what do you mean by "what"?
09:09:47FromDiscord<mratsim> ah
09:09:51FromDiscord<mratsim> sink move or deepCopy
09:12:17FromDiscord<mratsim> It does like this "spawn fnCall(x, y, z)"
09:12:17FromDiscord<mratsim> x, y, z will be serialized into a task
09:12:18FromDiscord<mratsim> I create an "async_fnCall" function that is also referenced in the task and is just in charge of passing a pointer to the serialized x,y,z and returning the future: https://github.com/mratsim/weave/blob/master/weave/parallel_tasks.nim#L125-L150
09:13:53Araqyeah I'm familiar with this idea
09:15:21Araqyou use pointers for everything, right? thread local heaps are dead
09:16:06FromDiscord<mratsim> I have a thread-local context and a custom threadsafe memory pool
09:16:53FromDiscord<mratsim> when I refactor the thing in an explicit state machine I will reduce the context
09:17:03FromDiscord<mratsim> it's there: https://github.com/mratsim/weave/blob/master/weave/datatypes/context_thread_local.nim
09:17:05FromDiscord<Milerius> How we add a default flags when using nimble build ?
09:17:15FromDiscord<Milerius> i want to compile with --threads by default
09:17:33FromDiscord<mratsim> either you use a .cfg: https://github.com/mratsim/weave/blob/master/weave.cfg
09:17:40FromDiscord<mratsim> which will work with both nimble and nim
09:17:49FromDiscord<Milerius> Nice !!
09:18:00FromDiscord<mratsim> or you configure nimble with flags like this: https://github.com/mratsim/weave/blob/master/weave.nimble#L26
09:18:18FromDiscord<mratsim> that would only apply to nimble commands
09:18:55FromDiscord<Milerius> i like cfg
09:19:40FromDiscord<Milerius> you need to specify the cfg to nimble ?
09:19:57*theelous3 quit (Ping timeout: 265 seconds)
09:20:04FromDiscord<mratsim> no
09:20:06*Vladar joined #nim
09:20:11FromDiscord<mratsim> the nim compiler picks it up automatically
09:20:20FromDiscord<Milerius> It's not working for me ๐Ÿ˜ข
09:21:14FromDiscord<Milerius> (i mean nimble doesn't pickup the flags inside my cfg)
09:21:17Araqmratsim: what's on your opinion on this design: 'new' uses a shared memory heap but the RC ops are *non*atomic
09:21:36FromDiscord<mratsim> My memory management scheme is explained here: https://github.com/mratsim/weave/tree/master/weave/memory
09:21:36FromDiscord<mratsim> And the issues with cactus stacks and such here: https://github.com/mratsim/weave/blob/master/weave/memory/multithreaded_memory_management.md
09:21:36FromDiscord<mratsim> And the memory access patterns of the runtime here: https://github.com/mratsim/weave/blob/master/weave/memory/memory_access_patterns.md
09:21:36FromDiscord<mratsim>
09:21:36FromDiscord<mratsim> But in short my memory pool covers all my needs and its pointers all the way down.
09:22:14FromDiscord<mratsim> can't we have type FooShared {.atomic.} = ref object
09:22:25FromDiscord<mratsim> for non atomic ref counting
09:22:35FromDiscord<mratsim> and type FooTL = ref object
09:22:50FromDiscord<mratsim> for thread local ref counting so non-atomic?
09:23:14Araqwe can do everything C++ can but we're getting into composability problems
09:23:39FromDiscord<mratsim> @milerius, it must be called with the same name as your nim file that imports everything
09:23:49Araqyes, ok so now I have shared_ref[T], can I put JSON inside it?
09:24:39FromDiscord<mratsim> I think it would be less likely to miss a use-case by listing use cases we want to support
09:24:54Araq(JSON is my favorite example because it's so common)
09:25:15clyybberAraq: You mean because json itself doesn't return shared_refs?
09:25:17FromDiscord<mratsim> I don't mind having non-atomic by default, atomic is costly
09:26:32Araqindeed it is
09:26:59Araqclyybber: exactly, we're sitting on a codebase full of refs
09:27:18Araqand as far as I'm aware so is almost everybody else
09:27:28clyybberHmm, that is indeed a problem
09:27:45Araqit's also a problem in C++ and Rust btw
09:27:57Araqwhat pointer type to choose for my library
09:28:16AraqI've seen JSON implementations in C++ based on shared_ptr
09:29:18clyybberIdeally shared would be a top level type attribute like var or static
09:29:29clyybberBut I don't know how that can work at construction
09:30:08Araqat the same time, pretending that you can "just use X" if only Nim had a shared heap and atomic refcounting is a terrible idea, all you do is to turn data races into race conditions
09:31:18clyybberAraq: Could a normal ref be promoted to an atomic ref?
09:31:22Araqtake the Table[string, string] data structure and put a lock around it, it doesn't work.
09:31:51Araqbecause you cannot query a table about its size when it's concurrently being added to
09:32:33*watzon quit (Remote host closed the connection)
09:33:01*watzon joined #nim
09:33:03Araqclyybber: yes, we can traverse the subgraph and set a flag ("now shared!")
09:33:08clyybberOk
09:33:20clyybberWe can move normal refs around threads safely though
09:33:22clyybberRight?
09:33:30clyybberBut only move
09:33:35Araqright
09:33:48FromDiscord<mratsim> concurrent collections need dedicated maintenance
09:34:16FromDiscord<mratsim> a data race detector would be nice as well
09:34:19FromDiscord<mratsim> (Go has one)
09:34:29Araq(I know)
09:34:47Araqrace detection is far worse than race prevention though
09:35:07clyybberAraq: So with respect to threads a normal ref is like an owned ref and an shared ref like a normal ref
09:35:16clyybberweird analogy I know
09:35:41Araqclyybber: you can also assert ref.refcount == 1 before passing it to a thread
09:36:11clyybberYeah
09:37:00FromDiscord<mratsim> I've noted race detection techniques here: https://github.com/mratsim/weave/issues/18#issuecomment-565858939
09:37:00FromDiscord<mratsim>
09:37:00FromDiscord<mratsim> I'm pretty sure Go race detector is based on this: https://github.com/dvyukov/relacy as Dmitry Vyukov wrote the Go scheduling runtime as well (and also Tensorflow/Eigen scheduler)
09:37:01disbotโžฅ [Testing] Concurrency: Race detection / Model Checking / Formal Verification
09:37:49FromDiscord<mratsim> there are links to writeups
09:38:45clyybberAraq: We need something like lent/sink for threads
09:38:52FromDiscord<mratsim> and Rust has this one which uses some techniques from a paper to limit state explosion: https://github.com/tokio-rs/loom
09:39:13FromDiscord<mratsim> @Clyybber, like Send/Sync?
09:39:37clyybberyeah
09:39:48clyybberI'm coming more from pony though, but its the same
09:39:59FromDiscord<mratsim> oh you did Pony?
09:40:09clyybberyeah
09:40:14FromDiscord<mratsim> but the behaviour: isolate and stuff are a bit to numerous
09:40:45FromGitter<alehander92> i think they were mostly a combination
09:40:52FromGitter<alehander92> of 2-3 orthogonal things
09:41:35FromDiscord<mratsim> ah I see
09:43:05FromDiscord<mratsim> @Clyybber: https://forum.nim-lang.org/t/5692#35488
09:43:37Araqmratsim: I think I nailed this problem a couple of years ago with the .guard annotation for when you need locking/atomics and analysable array slices for true parallelism
09:43:52FromGitter<alehander92> https://tutorial.ponylang.io/reference-capabilities/capability-matrix.html
09:44:08Araqand nothing else comes close because it's a static mechanism
09:44:13FromGitter<alehander92> so it seems to me one could do it with less primitives
09:44:21FromGitter<alehander92> but yeah its still relatively many
09:44:34FromGitter<alehander92> but its more obvious why
09:44:58Araqthe "disjoint check" is exactly what I want in reality and Z3 should give it us
09:45:32Araq*to us
09:46:48Araqclyybber: what do you mean by that?
09:46:51Zevvso did you ever get started with Z3?
09:46:59Araq"sink" and "lent" for threads?
09:47:09clyybberownership basically
09:47:10AraqZevv: I managed to build it...
09:47:36Zevvthat's something
09:48:24FromGitter<alehander92> so is z3 in 2020 program
09:48:28FromGitter<alehander92> or 2021
09:49:35clyybberAraq: Owned ref is equivalent to ponys iso. When we send it to another thread/actor nothing should point to it. It must also behave like a sink arg
09:50:10clyybberso we can't use it until it is returned to us again
09:51:23Araqin 2020 program because we're insane
09:51:26*fanta1 joined #nim
09:51:47Araqclyybber: same as unique_ptr, you can write it as a library in about 30 lines
09:51:49FromDiscord<mratsim> replied to detail task packaging: https://forum.nim-lang.org/t/5692#35490
09:52:09clyybberAraq: Yeah
09:53:44clyybberI just had an idea for an optimization for atomic ref counting.
09:54:31clyybberEach thread stores its own non atomic thread local refcount along it, and the atomic refcount only gets decremented when the thread local refcount is 0
09:54:40*Trustable joined #nim
09:55:29Araqyeah, known to me
09:55:30FromDiscord<mratsim> that means that all threads need to keep a hashtable though
09:57:20Araqproblem with optimizing RC ops is that I'm naive and believe in hardware. eventually atomicInc will have the cost as inc if there no contention
09:58:01Araqso far this doesn't happen though for reasons I don't know, plenty of runtimes are betting on refcounting
09:58:23AraqPython, PHP, Perl, Swift, C++, Rust, ...
09:59:05*narimiran quit (Quit: leaving)
09:59:26FromDiscord<mratsim> on x86 atomicInc relaxed is the same cost of inc
09:59:44Araqnot on my benchmarks, it was significantly slower
09:59:46FromDiscord<mratsim> the high cost is because you need to flush and reload the cache
10:00:05Araqno, the cache is ok, it's the write buffer that gets flushed
10:03:59Araqmratsim: anyhow, the real underlying issues are:
10:04:10Araq- how can I use weave with async?
10:04:47Araq- can weave replace async?
10:05:20Araq- how to make it work well with Nim's strings/seqs, maybe refs
10:07:34Araq- how to use it with openArray
10:09:00FromDiscord<mratsim> I don't know (for all of those)
10:09:38FromDiscord<mratsim> 1. Async is a complex beast as well and i'd rather have cheatfate work on it or someone who deals with it on a day to day basis
10:09:53FromDiscord<mratsim> I can only make sure we work well by providing good channels primitives
10:10:04FromDiscord<mratsim> and allow event loop in threads or spawning threads from event loops
10:10:44FromDiscord<mratsim> strings/seq/refs: depends on the GC: that's probably the hardest. I looked into the nim channels implementation and I was completely lost
10:11:05FromDiscord<mratsim> openarray should work as long as we can have them as values
10:11:49FromDiscord<mratsim> however, the escape analysis is a bit harder and you would need a "sync" before returning
10:11:59FromDiscord<mratsim> to ensure there is no escape of the pointer
10:12:31AraqI know, that's why there is 'parallel' + 'spawn' in Nim, spawn alone doesn't cut it
10:13:24Araqit's also where concurrency and parallelism diverge, parallelism is like "structured programming" for me, in the end there is a 'join'
10:13:56FromDiscord<mratsim> in the end, I started without those answers and by avoiding to requiring them because it's too hard
10:14:02FromGitter<alehander92> https://plg.uwaterloo.ca/~migod/papers/2019/scam19.pdf might be interesting
10:15:45clyybberlooks like a scammy link :p
10:18:46FromGitter<alehander92> A Study on the Effects of Exception Usagein Open-Source C++ Systems
10:18:51FromGitter<alehander92> yeah, its strange :P
10:21:21Araqskimmed it, but doesn't look that interesting, sorry
10:21:46Araqalso, once again: I don't even like exceptions anyway, it's just that the proposed alternatives are worse
10:22:26FromGitter<alehander92> yeah, i mostly like the methodology, its useful to build more tools enabling some kind of metrics on corpuses of code
10:23:00Araqand the points brought up against them are often *objectively* wrong.
10:23:41FromGitter<alehander92> lang design can use some more "data" in decisions, but its very hard to measure it
10:27:12Araqmaybe some day I'll finish my "quirky exceptions", the C backend seriously needs it
10:28:00Araqmratsim: maybe 'spawn f(args)' is the wrong idea too, the args have marshalling semantics in
10:28:05Araq- your implementation
10:28:08Araq- my implementation
10:28:31Araq- for async too (cannot use a 'var T' over there either)
10:29:17Araqit's cute syntax but maybe we are better off with an explicit task type that programmers are responsible for
10:29:39Araqeasier to implement, clearer cost model
10:31:43FromDiscord<mratsim> or both
10:32:39clyybberdisruptek: 10 now https://github.com/nim-lang/packages/pull/1280/files :p
10:32:40disbotโžฅ Fix vcs protocol for diff
10:32:47FromDiscord<mratsim> I have both implemented in TBB, the closure approach takes 600ms on my machine on fib(40) and 1000ms with the task approach:
10:32:47FromDiscord<mratsim>
10:32:47FromDiscord<mratsim> https://github.com/mratsim/weave/blob/master/benchmarks/fibonacci/tbb_class_fib.cpp
10:32:47FromDiscord<mratsim>
10:32:47FromDiscord<mratsim> https://github.com/mratsim/weave/blob/master/benchmarks/fibonacci/tbb_closure_fib.cpp
10:32:57FromDiscord<mratsim> the task approach is also very verbose
10:33:24Araqverbosity is where Nim shines, you can always hide it via macros
10:33:49FromGitter<alehander92> but those macros might end up looking as spawn f(args) :P
10:33:49FromDiscord<mratsim> also var T on multithreading is bad anyway
10:34:21Araqalehander92: yes but then the underlying task structure remains exposed
10:34:31FromDiscord<mratsim> go disables it, you have to use channels
10:34:49FromDiscord<mratsim> it's not composable also, if you want to do "andThen"
10:34:54Araqwhat? Go doesn't have references anyway, only pointers
10:37:10FromGitter<alehander92> the task thing does sound interesting
10:37:31FromGitter<alehander92> if its easy to sugar-ize it for the simple usecases
10:41:34*endragor quit (Read error: Connection reset by peer)
10:41:34*endragor_ joined #nim
10:42:37Araqalso what sometimes bothers me: f(a, b, c) is itself not composable, in stack based languages it's push a; push b; push c; call f
10:43:13Araqand it's rather easy to push to somewhere else (a channel?)
10:44:02Araqassembler is much more flexible than C code, calling C a "portable assembler" means you have no clue about assembler
10:44:34FromGitter<alehander92> hm, but how do you want to compose
10:45:04Araqfor example, I wrote a VM, it needs to support calling into native code
10:45:31Araqthe calling convention is known. at runtime. enjoy doing that with C (or C++, Nim, D...)
10:46:28FromDiscord<mratsim> The whole point of weave was to be usable from JIT code
10:46:40PMunchHmm, why doesn't this work? https://play.nim-lang.org/#ix=24Vb
10:46:43FromDiscord<mratsim> because I want to JIT some linear algebra kernels
10:46:45PMunchSure x is static..
10:47:51PMunchs/(Sure)/\1ly/
10:50:13AraqPMunch: it's not static enough
10:50:27Araq const x = 100 should work
10:50:56PMunchNot static enough?
10:56:51clyybberAraq: How would I prepend an element in your owned ref doubly-linked list?
10:57:39Araqvia proc prepend. what's the problem?
10:59:59clyybberIf we do `head = Node(value: newValue, next: head)` that wont work
11:01:17Araqalehander92:
11:01:24Araqhowever, popular async frameworks for the Rust programming language, such as tokio.rs, have also chosen to incorporate error handling directly into their Future constructs, because doing so was found to be more practical and ergonomic than trying to compose theoretically-orthogonal Future<T> and Result<T> constructs."
11:01:31Araqfrom https://gist.github.com/lattner/429b9070918248274f25b714dcfc7619
11:01:53Araqin other words, Result<T> is junk that doesn't really work... ;-)
11:02:31FromGitter<sheerluck> hi all. I stumbled upon funny thing. I have working code with `template until(cond: typed): typed = if cond: break` from https://forum.nim-lang.org/t/1970 โŽ But as soon as I add the line `import strutils` nim says "Error: invalid control flow: break"
11:03:03Araqsheerluck: import struilts except until
11:03:11FromGitter<sheerluck> oh. Thank you
11:03:15Araqbut don't use 'until', write real Nim code please
11:03:49Araqtemplates and macros don't exist just because you cannot let go of Rubyisms
11:04:21Araqor of Pascal (do we have people coming from Pascal?)
11:04:52Araqclyybber: well 'head' is the last read
11:05:09Araqas it gets overwritten just after that
11:05:18Araqthere is some support for this in the DFA
11:05:34FromGitter<sheerluck> @Araq You've convinced me. I will fix my code immediately.
11:06:02Araqwow, Christmas is near
11:06:10Araqgotta buy a tree, bbl
11:11:48FromGitter<alehander92> yeeey
11:12:03FromGitter<alehander92> otherwise Araq, interesting link ill read more of it later
11:12:06FromGitter<alehander92> thanks
11:12:52*sealmove joined #nim
11:16:55FromDiscord<Milerius> Hello, i'm discovering thread in nim:
11:16:55FromDiscord<Milerius>
11:16:55FromDiscord<Milerius> https://gist.github.com/Milerius/bf2884fba202c911c2a32e02b4565447
11:16:55FromDiscord<Milerius>
11:16:55FromDiscord<Milerius> I know i'm doing something wrong, (i'm trying to execute a task every 30s in my background thread)
11:16:56FromDiscord<Milerius>
11:16:58FromDiscord<Milerius> What is the idiomatic way according to my code snippet ?
11:19:13dom96https://nim-lang.org/blog/2019/12/20/community-survey-2019.html
11:19:24dom96Has narimiran created this from scratch?
11:29:50federico3one response per row for the tools? odd
11:36:44*marmotin_ joined #nim
11:37:25FromDiscord<mratsim> is there an issue for the templates eating stacktraces? That's so annoying
11:37:26*marmotini_ quit (Read error: No route to host)
11:41:31*jonafato quit (Quit: ZNC - http://znc.in)
11:42:55*jonafato joined #nim
11:46:55FromGitter<alehander92> mratsim i have that "runtime stacktrace including macro expansion points" idea started in a branch somewhere
11:47:19FromGitter<alehander92> but for now it mostly generates info that i use in gdb
11:54:17clyybberAraq: It fails to compile though.
11:56:25clyybberseems like a dumb bug though
12:00:06*marmotin_ quit (Read error: Connection reset by peer)
12:00:48*marmotini_ joined #nim
12:01:58*luis_ joined #nim
12:06:26clyybberAraq: See #12941
12:06:28disbothttps://github.com/nim-lang/Nim/issues/12941 -- 3Newruntime last read analysis broken ; snippet at 12https://play.nim-lang.org/#ix=24VA
12:12:14FromGitter<bung87> how to handle this `"en1๏ฟฝ\x13\b\x06๏ฟฝ@โ€œ`
12:12:48FromGitter<bung87> when echo a string converted from a cstring
12:15:04FromDiscord<mratsim> @dom96 wasn't that fixed in nimble 0.11? https://github.com/fragcolor-xyz/nimtorch/issues/18#issuecomment-565824215
12:15:05disbotโžฅ Nimble installation fails
12:16:22*luis_ quit (Ping timeout: 265 seconds)
12:18:46FromDiscord<niv> hello. where could i go for some sample code and/or guidance to make a C-imported function awaitable?
12:19:18*Vladar quit (Quit: Leaving)
12:20:09FromGitter<sheerluck> I have completed my toy project https://github.com/sheerluck/Toy-Nim-Project-with-Kaitai โŽ I would like to thank โŽ โŽ 1) @sealmove (Stefanos Mandalas) for KaitaiStruct Runtime Library for Nim โŽ 2) @solitudesf for letting me print inside pure functions with debug_echo ... [https://gitter.im/nim-lang/Nim?at=5dfcbc7944e1fb33f6fb46e2]
12:20:58sealmovewow sheerluck, what does it do?
12:21:11FromDiscord<mratsim> you should rename it to video downloader or what you are doing with it
12:21:54sealmovehow did you parse ksy?
12:22:04FromDiscord<mratsim> one day I'll write a video processing tool in Nim. The current tools are meh
12:22:49clyybbermratsim: How do you reference repo code from an issue?
12:23:01FromGitter<sheerluck> @sealmove it just walks path and prints top10 longest movies (mkv+webm+mp4)
12:23:10clyybberI pasted the link with #L123-#L456 but it just appears as a link
12:23:32sealmovehow did you parse ksy?
12:23:40FromDiscord<mratsim> right click on the line and get permalink or highlight lines, press Y and copy the URL
12:23:55FromGitter<sheerluck> @sealmove I cheated I just ported generated code from c++ :(
12:23:55clyybberthanks
12:23:56FromDiscord<mratsim> you need a precise commit or tags for github to inline the code
12:24:01clyybberah, ok
12:24:07FromDiscord<mratsim> master:devel won't work
12:24:11FromDiscord<mratsim> v1.0.4 would
12:24:40*luis_ joined #nim
12:25:12sealmovesheerluck: ah, ok, hope you can use nimitai soon
12:25:20sealmovei am making progress
12:25:34sealmove~10/132 pass right now
12:25:40clyybbermratsim: Doesn't seem to work: https://github.com/nim-lang/Nim/issues/12941
12:25:41disbotโžฅ Newruntime last read analysis broken ; snippet at 12https://play.nim-lang.org/#ix=24VA
12:26:14*luis_ quit (Client Quit)
12:26:33clyybberoh
12:26:34FromDiscord<mratsim> edited in
12:26:35clyybbernow it works
12:26:39clyybberah, thanks!
12:27:02clyybberah, so it was one hashtag too many
12:27:36Araqclyybber: we don't try to analyse global vars
12:28:00clyybberHmm
12:28:09clyybberI think I can reproduce it without a global var, let me see.
12:28:24*luis_ joined #nim
12:29:17*luis_ quit (Client Quit)
12:29:20clyybberah, nevermind
12:36:47*nsf quit (Quit: WeeChat 2.6)
12:37:18clyybberAraq: Btw, your append proc in your RFC is broken
12:41:02Araqwhy?
12:41:30clyybberIt doesn't compile
12:41:32clyybberdangling refs
12:41:43clyybberI can correct it if you want
12:42:01clyybberor send the correct variant
12:42:44clyybberAraq: This is how it should look I think: https://hastebin.com/fomexaciso.php
12:42:52clyybberoh
12:43:00clyybbernevermind, wrong paste
12:45:14clyybberAraq: Here it is: http://ix.io/24VK
12:46:07FromGitter<iffy> @zacharycarter what's that you're making?
12:48:20*xet7 quit (Quit: Leaving)
12:50:07FromDiscord<mratsim> @iffy, I'm looking into keyring, nice. THis might be relevant for you: https://github.com/status-im/nim-beacon-chain/issues/545 though we don't have a solution for secure heap management
12:50:08disbotโžฅ Protection of users private keys
12:50:12*xet7 joined #nim
12:51:52FromDiscord<mratsim> Go is adding macros: https://github.com/dave/jennifer
12:52:52lqdev[m]no, it's not :) it's a separate generator. I'd be surprised if they actually merged it into mainstream, but I know they won't.
12:53:04FromDiscord<mratsim> of course I was joking ๐Ÿ˜‰
12:53:20FromDiscord<Milerius> PMunch are you around ? :p
12:55:59PMunchYup
12:56:07PMunchAlways :P
12:56:16FromDiscord<Milerius> according to: https://gist.github.com/Milerius/6a72ca18eace612ea5d27ace7f20b74e
12:56:16FromDiscord<Milerius>
12:56:16FromDiscord<Milerius> is possible to represent correctly the json using jsonschema ?
12:56:40FromDiscord<Milerius> my json can be success.json or error.json
12:57:54PMunchWhat is ElectrumAnswer supposed to be?
12:58:09FromDiscord<Milerius> Either success.json or error.json
12:58:12FromDiscord<Milerius> may be i did it wrong
12:58:34PMunchYeah.. You can't have an object that's either one kind or another
12:58:41FromDiscord<Milerius> When i receive success.json i would like to have ElectrumAnswerSuccess, otherwise ElectrumAnswerError
12:58:53PMunchBut you can do answer: ElectrumAnswerSuccess or ElectrumAnswerError
12:59:03FromDiscord<Milerius> yeah but i don't have field answer
12:59:10FromDiscord<Milerius> The rpc is not from me :/
12:59:24PMunchThen you need to create the types and use isValid to check which one it is
12:59:43FromDiscord<Milerius> ok !
12:59:51FromDiscord<Milerius> Thank's for explanation !
13:00:29PMunchNote that isValid takes a paremeter "allowExtra" which dictates if extra fields is an error or not
13:00:55FromDiscord<Milerius> Oh this is cool
13:02:00PMunchI guess the extends mechanism could be expanded to include `or` functionality
13:02:12FromDiscord<Milerius> It's will be insane !
13:02:23FromDiscord<Milerius> For one specific reason
13:02:33FromDiscord<Milerius> If i want to store it in a container for Example
13:02:43FromDiscord<Milerius> It's will allow me to do: container[ElectrumAnswer]
13:02:56PMunchAh, true
13:04:53FromDiscord<Milerius> I would love to help you integrate the functionnality, but i'm really a beginner in nim, i read all your code already
13:04:57FromDiscord<Milerius> But it's really advanced ^^'
13:05:12PMunchHaha, yeah the jsonschema module is quite messy..
13:05:15FromDiscord<Milerius> (bit magic for mec)
13:05:18FromDiscord<Milerius> (bit magic for me)
13:05:29PMunchTBH it's a bit magic to me as well..
13:06:13FromDiscord<Milerius> Yup i understand
13:06:20FromDiscord<Milerius> Maybe what can i do is
13:06:23FromDiscord<Milerius> when i receive the json
13:06:33FromDiscord<Milerius> I can put the whole contents into answer
13:06:40FromDiscord<Milerius> But it's will be a bit inneficient
13:06:50FromDiscord<Milerius> Especially for big json
13:08:00PMunchI mean for putting it in a container you can just cast it back to JsonNode
13:08:13PMunchThat's free (same object in memory)
13:08:25PMunchAnd manually cast it when you get it out
13:08:33PMunch(This can of course be hidden with some templates)
13:08:48FromDiscord<Milerius> Or i can use the equivalent of std::variant ?
13:08:50FromDiscord<Milerius> in nim
13:09:00PMunchYeah, that is another option
13:09:02FromDiscord<Milerius> Container = TypeA or TypeB
13:09:10FromDiscord<Milerius> it's work this way ?
13:09:31PMunchDepends
13:09:38PMunchOn what you actually want to do
13:09:53FromDiscord<Milerius> well i really want
13:10:10FromDiscord<Milerius> electrum["error"].isSome:
13:10:54PMunchHmm
13:11:01PMunchhttps://nim-lang.org/docs/tut2.html#object-oriented-programming-object-variants
13:11:09PMunchThat is one option, but it's a bit much for this..
13:12:47*xet7 quit (Read error: Connection reset by peer)
13:13:19*xet7 joined #nim
13:14:03FromDiscord<Milerius> Yup anyway i will consider that is success
13:14:08FromDiscord<Milerius> :p
13:14:20FromDiscord<Milerius> But if you implement the include functionnality
13:14:22FromDiscord<Milerius> let me know
13:14:39PMunchWill do
13:14:56*marmotini_ quit (Remote host closed the connection)
13:14:56*xet7 quit (Read error: Connection reset by peer)
13:15:07PMunchLooking at the code now and trying to figure out what that would actually look like
13:15:31*xet7 joined #nim
13:15:45FromGitter<bung87> `"bridge0๏ฟฝ\x13\b\x06๏ฟฝAโ€` how to handle this? print to console , converted from cstring
13:15:46FromDiscord<Milerius> (if it's possible without specifying a name field)
13:16:23PMunchbung87, you ace probably given a length somewhere
13:16:30FromGitter<Willyboar> sealmove are you greek?
13:17:04sealmoveyup
13:17:12PMunchOr that string is meant to mean something special
13:17:14FromGitter<Willyboar> me too
13:17:22sealmovenice
13:18:50sealmovethere is at least another one, "planetis"
13:19:19FromGitter<Willyboar> I think i saw one in the forum
13:19:21sealmoveand another one from Cyprus (forgot nickname)
13:19:47FromGitter<bung87> `name = castcstring (sdl.sdl_data.addr) ` then `$name `
13:19:55FromGitter<Willyboar> drkameleon
13:23:11lqdev[m]sealmove, Willyboar: planetis is on irc too. he uses matrix.
13:23:30Araqoh I just realized it's PR friday
13:24:34clyybberAraq: I think we'll have to decide between deep-immutability or deep-copy for multithreading
13:24:41clyybberit accomplishes the same task
13:24:58AraqNim v1 says we do deep copies
13:25:42clyybberI know, what will we do in the future?
13:25:53AraqI like neither though, I like unique-ness and move semantics
13:25:59clyybberMe too
13:26:30clyybberAraq: Btw, pony uses owned refs moving and stuff too
13:26:44clyybberLike their iso thing is exactly like owned ref
13:26:51clyybberand their ref, well. Its like ref
13:27:13Araqcan you have a ref inside an iso?
13:27:27clyybberLemme see..
13:28:46FromGitter<zacharycarter> @iffy - 3d rts
13:28:47clyybberAraq: Yeah, but you cant read or write to it
13:28:55clyybberits a "tag" only used for identity
13:30:34Araqdoesn't sound that useful
13:30:58FromGitter<zacharycarter> I really want to know what disruptek thinks about the improvement
13:31:51clyybberAraq: You can convert the iso to a ref though
13:32:07clyybberAnd then you can access it normally
13:32:18clyybberafterwards you can recover it as a iso again
13:34:13Araqhow does it do that?
13:34:20clyybberIt has a recover statement
13:34:32clyybberIts like a block statement
13:34:36clyybberwhich returns an owned ref
13:35:25Araqhttps://stdlib.ponylang.io/json--index/#sending-json
13:35:38Araqbut how does 'recover' work? runtime check?
13:36:02clyybberAnd inside it you can have result be some unowned ref. The ref is not allowed to be referenced by variables from outer scopes though, and this way they can guarantee that it is convertible to owned ref/iso
13:36:07clyybberAraq: No at compile time
13:36:20clyybberIts a smart idea.
13:36:21FromGitter<Willyboar> @narimiran no PHP in the survey? :P
13:37:17Araqclyybber: for sure, but I don't understand it
13:37:44clyybberAraq: https://tutorial.ponylang.io/reference-capabilities/recovering-capabilities.html
13:37:50clyybberThis explains it a bit better than I can
13:38:28clyybberThis means that when the recover expression finishes, any aliases to the result of the expression other than iso, val and tag ones wonโ€™t exist anymore. That makes it safe to โ€œliftโ€ the reference capability of the result of the expression.
13:38:46clyybberQuote from that link
13:39:30sealmoveponylang is still active?
13:39:54FromGitter<kaushalmodi> Milerius: I just `exec("curl ..")`
13:40:20FromGitter<kaushalmodi> Milerius: https://github.com/kaushalmodi/nim_config/blob/bda6f591a0cdd1ff2f158882a31dcc921eb103ba/config.nims#L168-L172
13:40:47*endragor_ quit (Remote host closed the connection)
13:42:01FromGitter<Willyboar> @sealmove looks like it is, they have a release few days ago
13:42:08*nsf joined #nim
13:42:40Araqclyybber: I think it only works when Pony already knows json.parse returned an iso
13:44:13clyybberNo, it works also when f() would return a ref
13:45:57clyybberAraq: Inside a recover block you can't use variables from outer scopes to alias the result, that means when the recover block is finished the result can be safely turned into an owned ref
13:46:20Araqyeah I understand this part but it's not enough
13:46:30Araqyou also need to know the constructors
13:46:31clyybberYeah, it works in pony because refs cannot be shared
13:46:38clyybberAraq: Why?
13:47:03Araqand it looks like this is known by ^ " A constructor always returns an ephemeral type, because itโ€™s a new object."
13:48:29*endragor joined #nim
13:50:10clyybberAraq: Yeah, if you think about it in nim terms it seems unneccessary, its kind of like a workaround for the fact that their constructors dont return an owned ref
13:50:39Araqthey seem to return the roof though (^)
13:52:49Araqah but I think I still misunderstand it
13:53:08*endragor quit (Remote host closed the connection)
13:53:11Araqso ... recover cannot access any location from outside?
13:53:17clyybberNope
13:53:35clyybberNo refs
13:53:40Araqstring literals?
13:54:05clyybberYeah
13:54:09clyybberIts not from outside
13:54:16clyybberSince its created
13:54:28Araqhow can I parse json and recover it to be an iso?
13:55:34clyybber`recover json.parse`
13:55:57clyybberThough that doesn't make sense in pony..
13:56:10Araq// sending an iso doc
13:56:10Araqlet json_string = "{\"array\":[1, true, null]}"
13:56:10Araqlet sendable_doc: JsonDoc iso = recover iso JsonDoc.>parse(json_string)? end
13:56:12Araqsome_actor.send(consume sendable_doc)
13:56:23Araqhttps://stdlib.ponylang.io/json--index/#sending-json
13:57:04Araqproblem is that the JSon could be in a file and then you have pray file wasn't modelled as 'ref'
13:57:29clyybberYeah
13:57:38clyybberBut you can prove it at compile time
13:57:45clyybberBut yeah thats the gist
13:58:03clyybberdon't use refs from outside and what you'll be left with can be safely turned into an owned ref
13:58:41Araqdefinitely a new insight
13:58:47clyybberyeah
13:58:50clyybberseems useful
13:59:36clyybberI think it should be possible to do it transparently implicitly
13:59:54clyybberIn static analysis
14:00:16clyybberFor nim this could mean we could make working with owned ref much simpler
14:00:18clyybbereasier
14:00:32clyybberBy implcitly unowning it and recovering it again
14:00:40*akitoshi joined #nim
14:02:15clyybberThis is really cool and makes me all excited about newruntime with owned refs again :D
14:04:16*fanta1 quit (Quit: fanta1)
14:05:00Araqtoo early. B/D is both simpler and avoids a cycle collector
14:05:26Araqhard to beat
14:07:03*krux02 joined #nim
14:12:49PMunchHmm, interesting: http://ix.io/24VW/
14:14:13FromGitter<alehander92> sealmove: yes stefanos82 is from cyprus iirc
14:14:48FromGitter<alehander92> i and several other people are from bulgaria, so we almost can do a meetup :D
14:15:19FromGitter<alehander92> clyybber, interesting, one thing i wonder is how often is `tag` useful in pony
14:15:51AraqI don't really understand it so it must be wrong.
14:16:00Araq(kidding, of course)
14:16:09*leorize quit (Quit: WeeChat 2.6)
14:36:29disruptekhearts and minds, people; hearts and minds!
14:38:59*tane joined #nim
14:39:19disrupteki can't get out of a hardware store without spending $200 and i can't implement any new nimph feature without adding 200 lines.
14:40:29*PMunch quit (Quit: Leaving)
14:41:37FromGitter<zacharycarter> disruptek: did you see the map rendering improvements I shared last night?
14:42:09FromGitter<zacharycarter> curious about your thoughts on them
14:42:36ldleworkzacharycarter you still working on your game engine?
14:42:43disruptekno, sorry, irssi reset. where are they?
14:42:52FromGitter<zacharycarter> I'll re-post
14:43:08FromGitter<zacharycarter> https://imgur.com/a/PYEBMNJ
14:43:15FromGitter<zacharycarter> and here's a short video
14:43:33FromGitter<zacharycarter> https://imgur.com/a/9vFj0J7
14:43:37FromGitter<zacharycarter> vs before
14:43:50FromGitter<zacharycarter> https://i.imgur.com/SC4WiAJ
14:44:07dom96That's awesome :)
14:44:12FromGitter<zacharycarter> thanks :D
14:45:44FromGitter<zacharycarter> ldlework: no, actually working on build a game now :)
14:46:07FromGitter<zacharycarter> but still writing a lot of the plumbing code myself
14:49:40*Vladar joined #nim
14:57:28disruptekwow, that's /much/ better.
14:57:51FromGitter<zacharycarter> thanks!
14:58:13disrupteki always wondered how they did that. ๐Ÿ˜
14:58:18FromGitter<zacharycarter> those two techniques combined - procedural stochastic texturing and triplanar mapping really worked well together
14:58:31disruptekyeah, it's night and day.
14:59:03disruptekone of those things that we noticed right away when it started arriving in games.
14:59:15FromGitter<zacharycarter> yeah
15:02:29disruptekthanks for sharing this stuff with us. it's really inspirational. ๐Ÿ‘
15:04:15*ng0_ joined #nim
15:04:21*ng0 quit (Disconnected by services)
15:04:23*ng0_ is now known as ng0
15:06:42dom96zacharycarter: what kind of game are you working on? Looks like an RTS to me
15:07:47clyybberbbl
15:07:54*clyybber quit (Quit: WeeChat 2.7)
15:08:50shashlickdom96: saw the file name issue, will fix, meanwhile what else needs to be done for a choosenim release?
15:09:31dom960.5.0 has technically only just been released, we might want to wait a bit before making another release
15:13:40FromGitter<zacharycarter> dom96: yup!
15:13:54*leorize joined #nim
15:13:56FromGitter<zacharycarter> disruptek: haha of course, I appreciate the positive feedback
15:14:32FromGitter<alehander92> this is too complicated for me
15:14:44FromGitter<alehander92> you literally said like two unclear words for me in one sentence
15:15:10*Hideki joined #nim
15:15:33*Hideki is now known as Guest52746
15:18:16FromGitter<zacharycarter> :P I didn't know about them until yesterday
15:18:37FromGitter<zacharycarter> https://www.martinpalko.com/triplanar-mapping/
15:18:42FromGitter<zacharycarter> https://blogs.unity3d.com/2019/02/14/procedural-stochastic-texturing-in-unity/
15:18:56*dddddd joined #nim
15:20:45dom96zacharycarter: written in Nim? using any engine or doing everything yourself?
15:22:38FromGitter<zacharycarter> written in Nim and doing everything myself
15:22:53FromGitter<zacharycarter> using a few libraries - like bgfx etc
15:24:02dom96Cool. I'm currently finishing off a Nim game written in SDL2, implementing so many drawing primitives has been a pain.
15:24:25FromGitter<zacharycarter> nice!
15:25:12FromGitter<zacharycarter> yeah - this terrain renderer has taken quite a bit of my time, but I think it's worth it - starting to look decent enough to actually use in a game
15:25:27*silvernode joined #nim
15:25:31FromGitter<zacharycarter> and if I can get PBR materials in, it will really pop
15:27:28FromDiscord<mratsim> PBR? is taht the raytracing book?
15:27:49*luis_ joined #nim
15:28:23FromGitter<zacharycarter> I think the raytracing book does implement PBR - but it's really just a shading model
15:28:47FromGitter<zacharycarter> so they're not 1:1 you can have PBR materials and not have raytracing
15:34:11*luis_ quit (Quit: luis_)
15:38:14madpropsapparently some people find nim's crown creepy lol
15:38:20Yardanicowhat
15:38:37madprops"the crown is creepy and so was the previous name, Nimrod."
15:39:20Araqwell we're getting a new mascot
15:39:28Yardanicoreally?
15:39:32Yardanicoor :D
15:39:36Araqno.
15:39:44madpropsthe logo is perfect as it is
15:40:11madpropswith that font
15:40:56federico3dom96: are you using *GL stuff or plain SDL?
15:42:38leorizeAraq: is there a way to make the current GC no longer requiring NimMain? This would be useful in making LD_PRELOAD libraries, where you hijack symbols in the target binary so NimMain can't be called
15:43:04leorizeor should I just update to devel and use --gc:arc to get away from all that?
15:43:04Araqleorize: use --gc:arc already
15:43:33FromDiscord<mratsim> Come, the crown is reasonable, have they seen gopher or Ferris the crab
15:43:37FromDiscord<mratsim> on*
15:44:48dom96federico3, plain SDL
15:44:50Yardanicopython's one is literally a snake XD
15:44:57federico3ouch
15:45:02dom96Anyone else find this sort of thing incredibly frustrating? https://play.nim-lang.org/#ix=24Wf
15:45:14Yardanicolenientops ?
15:46:02dom96ahh yes, I keep forgetting about this module.
15:46:14dom96Makes me uneasy about what else it allows though
15:46:53federico3dom96: there's a wrapper for sdl-gpu https://vladar4.github.io/sdl2_nim/sdl_gpu.html
15:47:17dom96federico3, it's a 2D game, raw SDL2 isn't so bad
15:47:29federico3:-/
15:48:34dom96I was tempted to switch to SFML though
15:48:43Yardanicoyeah csfml is kinda nice
15:48:51Yardanicoand there's a nim wrapper for it :P
15:49:05shashlickdom96: no I was asking about getting choosenim update self to work, and the init script
15:49:12Yardanicohttps://github.com/oprypin/nim-csfml
15:49:15shashlickThey still only install 0.4.0
15:49:20Yardanico"This library consists of class wrappers implemented as ptr object. Because Nim does not allow attaching pointers to the garbage collector, disposal of objects is not implemented and needs to be manual, by calling the destroy methods." right now this can be implemented I think
15:49:28dom96shashlick, are you sure? I update the `stable` channel for choosenim
15:50:07*Guest52746 quit (Remote host closed the connection)
15:50:15shashlickOk it wasn't last night so
15:50:24dom96Yardanico, I used that package for https://github.com/dom96/ld40/
15:51:12dom96probably should have stuck to it since I managed to make some sort of game with it in 48 hours
15:51:32dom96but sunk-cost and all that
15:51:48dom96shashlick, updated today
15:52:34dom96Yardanico, I'm also certain that SDL2 can be used with Nim and webasm, not sure about SFML on that
15:52:53Yardanicoyeah, it seems there's no such support
15:53:22FromGitter<alehander92> madprops i actually agree with those people, the previous name is not good
15:53:51YardanicoThe previous name was okay for me since I don't really knew or used "Nimrod" in its bad definition :P
15:53:58Yardanicodidn't*
15:55:26FromGitter<alehander92> madprops interested where you saw that
15:56:49FromDiscord<Fern & Simula (They/Them)> is there a way to specify that an argument passed to a macro can't be a literal?
15:57:17FromDiscord<Generic> it can be if you use static
15:57:31FromGitter<alehander92> you can do a macro which takes a literal with static
15:57:33FromDiscord<Generic> e.g. macro blarg(x: static[int]): untyped = discard
15:57:41FromGitter<alehander92> and make it produce an error on compile time
15:57:43FromDiscord<Fern & Simula (They/Them)> ah, perfect. thanks!
15:57:45FromGitter<alehander92> and then!
15:57:57FromGitter<alehander92> make another overload which cant take a literal which will only work
15:58:37FromGitter<alehander92> Fern, Generic: notice you need this workaround if the wish is that it *can not* be a literal
16:00:11FromDiscord<Fern & Simula (They/Them)> yes, that's exactly what i want
16:00:15FromDiscord<Fern & Simula (They/Them)> thank you :)
16:08:32*ng0 quit (Quit: Alexa, when is the end of world?)
16:09:53disruptektoday we make cookies.
16:09:57disruptekwhat's a good cookie to make?
16:16:37livcd_.erlang.cookie
16:17:17disruptekerlang gives me hives.
16:17:58FromGitter<matrixbot> `grantmwilliams` don't be jealous of Erlang Gang
16:18:39FromGitter<matrixbot> `grantmwilliams` Has anyone seen a good implementation of an AMQP library in Nim? I've only seen an implementatin of STOMP so far
16:19:53disrupteknot aware of anything.
16:19:56FromGitter<bung87> there is zmq
16:19:59*icebattle joined #nim
16:20:07disruptek!repo mqtt
16:20:08disbothttps://github.com/barnybug/nim-mqtt -- 9nim-mqtt: 11mqtt wrapper for nim 15 5โญ 1๐Ÿด 7& 4 more...
16:20:18FromDiscord<mratsim> I can also play this game. As anyone seen a tensor libraries in Erlang? ๐Ÿ˜›
16:20:20disruptek!repo zevv/nmqtt
16:20:21disbothttps://github.com/zevv/nmqtt -- 9nmqtt: 11Native Nim MQTT client library 15 5โญ 0๐Ÿด
16:30:54FromDiscord<Fern & Simula (They/Them)> i have a nimble package split up into multiple files. is there any way to get that to work in just one import statement? should i just use `include`?
16:35:11*endragor joined #nim
16:35:34disruptekyou can use commas to separate multiple import targets.
16:35:46*Hideki joined #nim
16:36:09*Hideki is now known as Guest84791
16:36:17dom96gotta love that trailing comma being ignored https://play.nim-lang.org/#ix=24Wo
16:36:34disruptekfeature.
16:37:40madpropsweird echo
16:38:14madpropsi always inline it, without parens
16:38:47dom96It's a repro of a longer piece of code
16:39:37dom96currently trying to work out why colors.`$` isn't called on my colour but instead the `system` one.
16:40:44dom96ugh, so annoying to get stuck on such silly things
16:42:17FromDiscord<Fern & Simula (They/Them)> disruptek: i meant import one module (the "main" one if you will) and have the rest silently come along?
16:42:37*Guest84791 quit (Ping timeout: 268 seconds)
16:46:48dom96Fern: in the main module use "export moduleA, moduleB" then import that module
16:55:56FromGitter<bung87> when wrap macos sdk, how to declare a proc return expected result type or a error number ?
16:58:00FromGitter<bung87> I realize other language wrap c not like the Nim way, clearly declare a type or proc coming from which header file.
16:58:04disrupteklet your wrapping proc set a var argument. return an error code or zero.
16:58:52FromGitter<bung87> ` result type or a error number`
16:59:13disruptekthe proc returns a type?
16:59:19FromDiscord<badassiel> I was wondering if anyone was working on a client sdk for nim?
16:59:25FromGitter<bung87> a type or number
16:59:39disruptekclient sdk for what serv(er|ice)?
16:59:50FromDiscord<badassiel> *client matrix sdk
16:59:53*silvernode quit (Ping timeout: 268 seconds)
17:00:01FromGitter<bung87> https://developer.apple.com/documentation/iokit/1514741-ioiteratornext?language=occ
17:00:20disruptekshashlick knows things about matterbridge... wicked, wicked things.
17:00:40FromGitter<bung87> yeah,I knew him
17:01:30FromDiscord<badassiel> oh wow didn't know matterbridge existed
17:01:34ozdisruptek: well matterbridge is wicked to start with. :)
17:01:34disruptekif you want to wrap that, just make a real iterator that only returns values.
17:01:40FromGitter<bung87> I know Nim has Option type not sure can be used in wrap
17:01:50disruptekit can, but to what end?
17:02:02disruptekiterators are a thing nim programmers like to use.
17:03:15FromGitter<bung87> I want things to be simple, this task mainly is reading document and source. not like I am programingโ€ฆ..
17:04:11FromGitter<bung87> almost 1k line during wrap this on macOS...
17:04:22FromGitter<matrixbot> `grantmwilliams` Are there any ETL libraries in Nim?
17:06:03FromDiscord<Fern & Simula (They/Them)> disruptek: thanks!
17:06:06FromGitter<bung87> there are several lib, tools
17:06:30disruptekwhat did i do?
17:06:57FromGitter<bung87> not aware of all in one ETL project.
17:07:22disruptekthe whole concept of ETL is too vague, honestly.
17:08:01FromGitter<matrixbot> `grantmwilliams` Interesting. It looks like Nim has a great sql library in the std lib so seems like a nice language for etl
17:09:23FromGitter<matrixbot> `grantmwilliams` > <@gitter_fromirc:matrix.org> *<disruptek>* the whole concept of ETL is too vague, honestly. โŽ โŽ To me ETL libraries end up being a set of connections (with a generic way to create new conneciton types) and some way to pipe data between those connections
17:09:40FromGitter<bung87> I know there are ,xml,csv,docx libs
17:11:02disrupteki'm not aware of a framework like that. i've never even used something like that in another language.
17:12:45disruptekit does feel like AQMP but i think you'd be better-served by something simpler.
17:13:01FromGitter<matrixbot> `grantmwilliams` There are a number of different approaches to the problem. You could probably consider spark an ETL library (or maybe something like pandas in python), then you have apache airflow which is more cron based etl approach
17:13:08FromGitter<alehander92> disruptek ohh cookies
17:14:55FromGitter<matrixbot> `grantmwilliams` You might consider a stream based library an ETL one too. So I agree that its a very vague concept.
17:15:50disruptekit's just hard to imagine a glue-like product that seeps into all the specific cracks needed for application.
17:16:13disruptekusually, you end up needing to customize pretty extensively.
17:17:04solitudesfdisruptek, is it really necessary for nimph to write hints of every nimble package i have installed every time i perform any operation with it? it is the compiler's output, but i think you should silence it.
17:17:19salotz[m]is this the new nim mascot? https://img.scryfall.com/cards/large/front/c/3/c3a2c39b-b302-4cc3-b507-e4fe00614036.jpg?1562157213
17:17:31disruptekcan i see the output?
17:17:31FromGitter<matrixbot> `grantmwilliams` I think my ideal solution would give you async backpressure pipelines between connections and you'd be responsible for making the connections yourself and getting data out of them (via query or whatever)
17:17:45disrupteksolitudesf: compile nimph with -d:release and it will be quiet.
17:17:56solitudesfits compiled with -d:danger
17:18:06disruptekweird, lemme see.
17:18:07solitudesf`/home/solitude/.nimble/pkgs/nimes-0.1/nim.cfg(14, 178) Hint: line too long [LineTooLong]` here's sample.
17:18:43disruptekoh, that's from the compiler's parser?
17:18:50disrupteki should be able to toggle that hint off.
17:18:57disruptekwhat other hints are spamming you?
17:19:06solitudesfthats the only one
17:19:39disrupteki will figure that out, or you can try toggling it in config.nim.
17:19:50disruptekthat's where i toggle hinting about conf reads...
17:20:19*akitoshi quit (Quit: Connection closed for inactivity)
17:20:32disruptekwhat does nim consider a "too long" line in a config file, and why?
17:20:57solitudesfim just gonna uninstall the package. is there a reason for nimph to relay these things to a user?
17:21:19disruptekit's not in nimph code. it's code imported from the compiler.
17:21:40disrupteki don't think users need to see it, but i cannot directly control side-effects of parsing.
17:21:53solitudesfnice
17:22:08disrupteki'm pretty sure we can just toggle the hint.
17:22:30disruptekeg. line 94.
17:22:32solitudesfwell, i only see that because of `verbosity:2`, im pretty sure
17:22:36disruptekhow is nimph working other than that?
17:23:34solitudesfno clue, i just ran it on bunch of my existing packages and didn't need to do anything. im gonna try using it with a new one.
17:24:37*jonafato quit (Quit: ZNC - http://znc.in)
17:24:50solitudesfim going to need a name for it. its a program that expands text snippets as you type by *monitoring your input and abusing clipboard*. i couldn't come up with anything other that String EXpander.
17:24:51lqdev[m]could someone look into this? it's preventing me from continuing my projects. https://github.com/nim-lang/Nim/issues/12942
17:24:51disrupteknimph 0.5.7 should fix that spam.
17:24:53disbotโžฅ Default procedure parameters are untyped ; snippet at 12https://play.nim-lang.org/#ix=24WF
17:25:19disruptekdisbot: you're terrible. go back to school.
17:25:20disboton it. ๐Ÿ‘
17:26:59FromGitter<matrixbot> `grantmwilliams` i think echo was an interesting choice
17:27:06*jonafato joined #nim
17:27:21lqdev[m]@grantmwilliams: why?
17:27:59FromGitter<matrixbot> `grantmwilliams` i just wouldnt expect many languages to choose echo over print or procedure over function
17:28:05FromDiscord<Milerius> Hello
17:28:13FromGitter<matrixbot> `grantmwilliams` i dont have any problems with it, but i do think its interesting
17:28:17FromDiscord<Milerius> Is it normal that the hash of 2 string that have the same content are different ?
17:28:57disruptekfunction is a thing; a side-effect-free procedure.
17:29:04disruptekkeyword `func`.
17:29:16YardanicoFromDiscord: what do you mean by "hash"?
17:29:40FromDiscord<Milerius> I want to retrieve a unique id from a string in nim, this id should be the same if 2 string have the same word
17:29:42disrupteksolitudesf: how does it abuse the clipboard?
17:29:53FromDiscord<Milerius> hash("foo") == hash("foo")
17:30:06disruptekmilerius: sounds amazing.
17:30:13FromGitter<matrixbot> `grantmwilliams` i just think its interesting that the term procedure made it into the language
17:30:36disruptekwhat would you use, noting that `function` is taken by functions?
17:31:14FromGitter<matrixbot> `grantmwilliams` i mean you could have a pure keyword infront of function for ones without side effects
17:31:31FromGitter<matrixbot> `grantmwilliams` but i dont actually have a problem with proc being in the language. i just said it was interesting not bad in any way
17:31:32solitudesfdisruptek, well, it just copies needed text into it and simulates ctrl-v or whatever. just dont know if there is a better way. and it will going to be X only.
17:31:45Yardanico!eval echo(hash("foo") == hash("foo"))
17:31:47NimBotCompile failed: /usercode/in.nim(1, 6) Error: undeclared identifier: 'hash'
17:31:55disruptekxclip-like, then?
17:31:55FromGitter<matrixbot> `grantmwilliams` rust's ownership model is interesting too
17:31:59Yardanico!eval import hashes; echo(hash("foo") == hash("foo"))
17:32:02NimBottrue
17:32:21FromDiscord<Milerius> This is not working for me
17:32:33Yardanico!eval import hashes; echo(hash("foo") == hash("foo"))
17:32:35NimBottrue
17:32:39Yardanicohm
17:32:50FromDiscord<Milerius> can i show my example ?
17:33:10disruptekif you use a pastebin. ๐Ÿ˜
17:33:12solitudesfdisruptek, it should be like this thing https://github.com/federico-terzi/espanso but not filled with useless garbage, and not dropping to cpp for half the code.
17:33:44disruptekcool.
17:33:57disruptekwhat do you need to do?
17:34:41solitudesfi need to write it
17:34:58disruptekto make it work on wayland. ๐Ÿ˜ˆ
17:35:38solitudesfis it possible on wayland? its basically a keylogger
17:35:43FromDiscord<Milerius> ok hash work, my problem come from some thing else
17:35:51disruptekwell, xclip works, somehow.
17:35:58disrupteki'm using it in my ix paster.
17:36:08federico3if you give it permissions...
17:37:14disrupteksolitude don't take no shit. i like that.
17:37:38disruptekwe need more unsatisfied users.
17:38:12FromDiscord<Milerius> But i have a serious problem understanding what is appening here: https://gist.github.com/Milerius/f12cbd83e727ec788383d7198644b13f
17:38:30disruptekyou uploaded some code to a github gist.
17:39:12FromDiscord<Milerius> yep
17:39:50disrupteki do believe that RICK is the tickler.
17:40:00disruptekat least, it felt like RICK.
17:40:41FromDiscord<Milerius> Yeah...
17:40:43FromDiscord<Milerius> hash is the same
17:40:48FromDiscord<Milerius> string are equal
17:40:51FromDiscord<Milerius> len is the same
17:41:03FromDiscord<Milerius> but when use key it's working, when using ticker is crashing
17:41:05FromDiscord<Milerius> ๐Ÿคท
17:42:39*tane quit (Quit: Leaving)
17:43:03disruptekcm_at has a side-effect?
17:43:12FromDiscord<Milerius> const
17:43:22Yardanicowhere is is_ticker_present defined?
17:43:33FromDiscord<Milerius> I updated the gist
17:44:33*Trustable quit (Quit: Leaving)
17:46:19disrupteki'm assuming that it only crashes when you uncomment the earlier cm_at call against ticker.
17:46:31FromDiscord<Milerius> nop
17:46:33FromDiscord<Milerius> even in the loop
17:46:35disruptekis that wrong? are you changing the second call?
17:46:37FromDiscord<Milerius> i replace key by ticker
17:46:42FromDiscord<Milerius> it's not working
17:46:45FromDiscord<Milerius> in the loop
17:46:56disruptekwhat if you compose a new instance of a string?
17:47:23disrupteki'm thinking that it's the magical cstring semantics.
17:48:09FromDiscord<Milerius> ok if i use an int as key
17:48:11FromDiscord<Milerius> it's working
17:48:13FromDiscord<Milerius> instead of string
17:48:17disruptekie. $typeof(key) == "cstring"
17:48:17FromDiscord<Milerius> i use the hash
17:49:00FromDiscord<Milerius> Yeah key is a cstring
17:49:02disrupteklet cticker: cstring = ticker ... cm_at(cticker)
17:49:27FromDiscord<Milerius> i'm checking
17:49:37disruptekI NEED ANSWERS NOW
17:49:45FromDiscord<Milerius> second
17:49:46disruptekomg cookies. we forgot cookies.
17:50:38*Hideki joined #nim
17:50:56FromDiscord<Milerius> crashing with cticker
17:50:58FromDiscord<Milerius> @disruptek
17:51:02*Hideki is now known as Guest39222
17:51:34disruptekcuriouser and curiouser.
17:54:07disruptekso the problem here is that your indexer, at(), isn't able to match keys in the hash/ass-array/dict/map.
17:54:38disruptekwhy not modify that code to see what input it's receiving?
17:54:57FromDiscord<Milerius> idk, this class work for sure in C++ i'm using it with strings
17:54:59FromDiscord<Milerius> i never get problems
17:55:03FromDiscord<Milerius> i'm switching to nim now
17:55:10FromDiscord<Milerius> May be it's my fault, probably
17:55:17FromDiscord<Milerius> but i cannot understand where is my prob
17:55:24FromDiscord<Milerius> anyway i will move forward with integer as key for now
17:55:50disruptekwell, this will bite you again until we understand it.
17:55:58*Guest39222 quit (Ping timeout: 260 seconds)
17:56:17disruptekyou can look at the code nim generates by investigating the nimcache.
17:56:23FromDiscord<Milerius> Yup, but i have deadlines for work, so i will move forward and take more time on it latter
17:57:17FromDiscord<Milerius> PMunch are you around?
17:57:43disrupteki think your cm_at() is not comparing strings but is instead comparing pointer values. hence key works because it came right out of the map.
17:58:04disrupteki'm just guessing as to how it's implemented, though.
17:58:10FromGitter<alehander92> but let cticker: cstring = ticker
17:58:14FromGitter<alehander92> isnt really what you want
17:58:30disruptekno, it's irrelevant. i was just curious.
17:58:44FromGitter<alehander92> you want to convert the nim string to c string, and iirc the nim c string starts on ->data
17:58:50FromGitter<alehander92> which is not the first field
17:58:54FromGitter<Willyboar> Hello guys
17:59:07disruptekit doesn't matter; nim converts it all for us.
17:59:33disruptekhello mr. boar.
17:59:48FromGitter<alehander92> does it??
17:59:50FromGitter<Willyboar> hello dis
17:59:52FromGitter<alehander92> ticker.cstring does
18:00:00FromGitter<alehander92> but maybe the let thing does also
18:01:04disruptekyeah, i was thinking maybe it was due to the ephemeral key var but now i'm pretty sure it's just a simple error in cm_at.
18:01:33disruptekoccam's razor.
18:02:31FromDiscord<Milerius> yeah but my cm_at is just importing the C++ function
18:02:32FromDiscord<Milerius> as it
18:02:49disruptekyes, bugs exist in c++, too.
18:02:51disruptekit is known.
18:03:08FromDiscord<Milerius> probably
18:03:46disruptekso. cookies.
18:03:52disrupteki'm thinking molasses.
18:08:24*opi joined #nim
18:10:40FromDiscord<Milerius> I'm missing PMunch so much my guardian :p
18:11:16*qwertfisch quit (Quit: ZNC - http://znc.in)
18:11:22opihi, I'm trying to build Nim out of source on RPi, it was working before, but now invoking build.sh throws an error, any hints?
18:11:23opi typedef int Nim_and_C_compiler_disagree_on_target_architecture[sizeof(NI) == sizeof(void*) && NIM_INTBITS == sizeof(NI)*8 ? 1 : -1];
18:12:24Yardanicothat tells you what's the problem
18:14:23opiYardanico: I understand what the problem is, but I don't really know how to solve it, otherwise I wouldn't ask. I have limited knowledge about compiler internals
18:14:45Yardanicowell, what exactly are you running?
18:14:48Yardanicosh build_all.sh ?
18:15:22opiI did both cd csources && sh build.sh and build_all up top
18:15:35opithe kernel is 32 bit but the target says 64
18:15:54Yardanicowell, you don't need to do that manually
18:16:03Yardanicojust clone the nim repo, cd into it and run `sh build_all.sh`
18:16:12FromGitter<alehander92> Araq
18:16:25Yardanicoopi: maybe your C compiler is 64-bit for some reason?
18:16:32FromGitter<alehander92> lets have `smellonly` variables, @Willyboar gave me a great idea to model food
18:16:39FromGitter<alehander92> sorry, vacation mood already
18:17:03opiYardanico: that's a possibility, I've been tinkering around on that system without paying much attention
18:17:53FromDiscord<mratsim> if there is an mismatch between the compiler and the kernel you need to pass ucpu=aarch64 or ucpu=armv7 it's an environment variable
18:18:17FromDiscord<mratsim> for example this is my build for building 32-bit nim on 64-bit: https://github.com/mratsim/weave/blob/master/azure-pipelines.yml#L43
18:18:26FromDiscord<mratsim> I get arch mismatch otherwise
18:20:58opithank you mratsim, I'm going to look into it
18:23:16opiyeah, I see the lines that overwrite the CPU in build.sh, that may be it
18:23:19*krux02 quit (Remote host closed the connection)
18:24:38opi./build.sh --cpu armv7 worked for me, thanks!
18:57:21*MarquisdeFalbala joined #nim
19:00:51*luis_ joined #nim
19:01:28shashlickSome new nimterop cli features cooking: --output to to file, --prefix --suffix to strip symbols without cPlugin, --check to Nim check the generated wrapper, and --stub to stub out undeclared identifier errors as objects automatically
19:01:45*NimBot joined #nim
19:03:05*luis_ quit (Client Quit)
19:03:30disruptekhow does stub work?
19:04:00disrupteki mean, will that fix my nimsuggest?
19:11:15shashlickNope that's still on the backlog
19:11:58shashlickIf certain symbols are not in the header or nimterop can stub them for you
19:12:18shashlickAssuming you don't really need them for your use case
19:12:36disruptekoh, i see.
19:13:11disruptekso this would let us pull the nimterop requirement out of nimgit, right?
19:13:35disruptekassuming we lock it to a particular version, etc.
19:15:56*icebattle quit (Ping timeout: 265 seconds)
19:18:21shashlickThe cimport stuff maybe, depending on what all needs done
19:18:29shashlickBut not the getHeader stuff though
19:19:04shashlickYou are asking about https://github.com/nimterop/nimterop/issues/125
19:19:06disbotโžฅ Provide stand-alone operation
19:19:57disruptekright.
19:20:44disruptekwhen we add staticCurrentDir we'll be able to simplify some of this.
19:20:57disruptekie. we can make relativePath work.
19:22:14disruptekleorize: this would be pretty cool for nim.nvim: https://github.com/ryanluker/vscode-coverage-gutters
19:23:15lqdev[m]why do tests fail on `--gc:orc`? I just forked and cloned
19:23:43disruptekit's not yet christmas.
19:23:46Yardanicoarc* :P
19:23:52lqdev[m]orc.
19:24:00lqdev[m]I can read logs, mate.
19:24:05Yardanicoxd
19:24:29lqdev[m]iirc orc was a variation of arc, but I can't really remember what's the difference
19:26:10disruptekone doesn't work, and the other one is broken.
19:26:56shashlickdisruptek: I don't think we will get there with nimterop
19:27:05disruptekwhaaa
19:27:15disruptekwhy not?
19:27:20shashlickUnlike c2nim which is a dev tool, nimterop is used at build time on the target system
19:27:46disruptekhmm, fair point.
19:27:52shashlickSo the wrappers you generate are specific to the build system since preprocessor is already run
19:28:10shashlickI don't see how we can resolve this with this model
19:28:15disruptekwe obviously need another layer of wrappers.
19:28:31disruptekintroducing nimteropterop.
19:28:51shashlickI don't see the value in managing the cross platform stuff typically done in preprocessor
19:28:58shashlickHard enough dealing with C
19:29:02FromDiscord<mratsim> I think I'll rename one of my library Urukh-Hai to go along gc:orc
19:29:21shashlickMaybe some day
19:29:41shashlickI'd rather spend time improving what we have and get to c++
19:29:45shashlickOpen to feedback though
19:30:18FromDiscord<mratsim> maybe read this: https://github.com/status-im/nim-beacon-chain/issues/640
19:30:19disbotโžฅ [RFC] producing more robust wrappers for external C libraries
19:31:44*opi quit (Quit: WeeChat 1.6)
19:31:58*clyybber joined #nim
19:33:37shashlickWill do
19:36:02*ofelas joined #nim
19:38:28clyybberAraq: We can apply this advanced form of static analysis to B/D though, and thats the great thing.
19:38:41clyybberIt is essentially automatically inserting unown
19:38:52clyybberand *own* into the right places
19:38:53FromDiscord<mratsim> somehow I read can apply as crappy
19:39:54FromGitter<bung87> @shashlick what do you think about rust and go have libc wrap?
19:41:26Araqclyybber: probably
19:42:26shashlickbung87: will have to research, sori no idea
19:44:54FromGitter<bung87> ok
19:47:14clyybberAraq: This could be big, as evident from your wrong prepend proc :p
19:47:23clyybbers/prepend/append
19:47:59*rockcavera joined #nim
19:48:49disrupteki can emit (key: key, val: value) from a pairs() iterator but only (key, value) from an mpairs().
19:49:08clyybberhmm
19:49:14clyybberreport it
19:53:24*Hideki_ joined #nim
19:58:55*Hideki_ quit (Ping timeout: 265 seconds)
20:00:33*leorize quit (Remote host closed the connection)
20:01:03*leorize joined #nim
20:07:28disruptekhttp://ix.io/24XB
20:16:52clyybberdisbot: You sleepin?
20:17:07clyybberor is he smart now?
20:18:53shashlick@mratsim: so he wants to have access to preprocessor macros?
20:19:25shashlicki do get that info in nimterop, could be converted into templates but the RHS is not trivial since you just get a blob of code which needs to nimmized
20:21:24*endragor quit (Remote host closed the connection)
20:23:53disruptekdisbot doesn't share ix links anymore because pmunch.
20:24:19FromGitter<Willyboar> ???
20:26:08*MightyJoe quit (Ping timeout: 245 seconds)
20:26:25*cyraxjoe joined #nim
20:30:36FromDiscord<Milerius> imariscal in in the chat ?
20:38:35FromGitter<zetashift> you mean @lmariscal?
20:41:24*exelotl joined #nim
20:44:59*pbb quit (Ping timeout: 246 seconds)
20:46:54*pbb joined #nim
20:46:54FromDiscord<mratsim> we want to minimize manual intervention in crazy wrappers
20:47:23disruptekwhat fun would that be?
20:49:11*sagax quit (Ping timeout: 265 seconds)
20:49:22shashlickthat's exactly what i care about
20:49:29shashlicki don't like anything manual as much as possible
20:50:04shashlickam replying to that thread, but meanwhile, will also run through ncurses and libbacktrace and see what a nimterop wrapper will look like
20:54:06*sagax joined #nim
20:54:22clyybberdisruptek: Oh, why?
20:54:40disruptekhe felt it was spammy.
20:55:20disrupteki guess he pastes a lot of non-nim stuff to the channel and it was uselessly posting playground links for it.
20:55:44*endragor joined #nim
20:59:17clyybber:9
20:59:19clyybber:(
21:00:39*endragor quit (Ping timeout: 258 seconds)
21:05:14*qwertfisch joined #nim
21:10:02disruptek`nimph graph` can now dump releases and version-changing commits: https://github.com/disruptek/nimph#graph
21:17:53*pbb quit (Ping timeout: 246 seconds)
21:20:50*pbb joined #nim
21:28:33lqdev[m]can anyone help me with a workaround for this? https://github.com/nim-lang/Nim/issues/12942
21:28:34disbotโžฅ Default procedure parameters are untyped ; snippet at 12https://play.nim-lang.org/#ix=24WF
21:28:54lqdev[m]I've been struggling at this for hours now, and I'm simply unable to come up with something reliable.
21:31:26disruptekcan you get the type of the later occurence of thing?
21:32:24disruptekjust discard it so you can fetch the type and then literally discard your discard statement if you wanna be anal.
21:32:54*MarquisdeFalbala quit (Remote host closed the connection)
21:36:03lqdev[m]disruptek: not really, because `thing` could be defined in a different module, at least afaict.
21:36:21disruptekwhy does that matter?
21:36:53disruptek1) have a macro put discards in for every param.
21:37:03disruptek2) have a macro read those discards to get the types.
21:37:06disruptek3) profit!
21:37:39lqdev[m]it's not related to `discard`s, take a look at the output I provided in the issue
21:38:01lqdev[m]the fact that the default parameter is untyped makes it impossible for me to get its type
21:38:05disrupteki did. i noticed that you have sym for thing in the discard statement.
21:38:06FromDiscord<Fern & Simula (They/Them)> is there a way for a macro to traverse a nested data structure?
21:38:42disruptekfern: sure.
21:38:59disruptekfern: the ast is one such data structure.
21:39:40FromDiscord<Fern & Simula (They/Them)> hmmm, trying to figure out how to word this properly
21:39:55lqdev[m]disruptek: the thing is, once I get to that parameter, I can't really add another semantic pass without introducing large amounts of complexity into my lib
21:40:42FromDiscord<Fern & Simula (They/Them)> nvm, it was getTypeImpl i was looking for
21:40:57FromDiscord<Fern & Simula (They/Them)> oh crap, that requires a typed param and i can't do those
21:41:20*solitudesf- joined #nim
21:41:36Yardanico an untyped param can't have a type because it's not semchecked by the compiler yet (IIRC)
21:41:39lqdev[m]fern: defer that to another macro that you `newCall(bindSym"someMacroThatAcceptsTyped")`
21:41:52*solitudesf quit (Ping timeout: 265 seconds)
21:42:27FromDiscord<Fern & Simula (They/Them)> what does `newCall` do?
21:43:09lqdev[m]fern: it creates a new call node to the procedure in the first parameter, passing arguments from the rest of the parameters.
21:43:23lqdev[m]disruptek: take a look at https://github.com/liquid600pgm/euwren/blob/master/src/euwren.nim#L482
21:43:54*solitudesf joined #nim
21:44:08lqdev[m]this is where the default parameter causes a problem
21:44:30FromDiscord<Fern & Simula (They/Them)> lqdev[m]: so does that `newCall(bindSym...)` add type information for an untyped macro?
21:44:47*endragor joined #nim
21:44:48lqdev[m]fern: no, it just generates a call like `someProc(a, b, c, โ€ฆ)`
21:44:56*livcd_ quit (Quit: Lost terminal)
21:45:03disrupteki would rewrite it in a lower macro.
21:45:25lqdev[m]fern: you can output that from your `untyped` macro, and the call can contain the parameters you need as `typed`
21:45:33disruptekyay, nimph doesn't work with cpp.
21:45:37FromDiscord<Fern & Simula (They/Them)> not sure that would help me. i think i'll just rewrite the macro as typed and use discard statements
21:46:13*solitudesf- quit (Ping timeout: 265 seconds)
21:47:10lqdev[m]disruptek: what do you mean, "lower macro"?
21:47:35disrupteka macro that rewrites the ast prior to L482 in euwren.nim.
21:48:39lqdev[m]maybe I could implement `getParamList` itself as a macro, and call it somewhere inbetween, or something
21:48:43lqdev[m]I don't know
21:49:36*endragor quit (Ping timeout: 265 seconds)
21:53:26disruptekthat's the idea.
21:53:51disruptekyou have something else consume the proc and annotate it with discards that'll get sym'd for later.
21:55:31lqdev[m]it doesn't really have to be annotated with discards and stuff, just do anything that'll cause these poor untyped values to get semchecked
21:55:38disruptekyes.
21:55:46*Hideki joined #nim
21:56:10*Hideki is now known as Guest12527
22:02:42lqdev[m]guess something like this https://play.nim-lang.org/#ix=24Yf
22:03:09lqdev[m]too bad I can't use tuples here, would make for much cleaner code
22:04:42disrupteki was thinking addProcAux would just rewrite the proc with a discard as the first line of the body. then anything that operates on it can just read that line to determine types.
22:04:54disruptekthat's what i meant by annotation.
22:05:38*Guest12527 quit (Ping timeout: 260 seconds)
22:06:05shashlickthat took longer than I hoped, but was fun nonetheless - https://github.com/status-im/nim-beacon-chain/issues/640#issuecomment-568105020
22:06:05disbotโžฅ [RFC] producing more robust wrappers for external C libraries
22:06:46shashlickended up making libbacktrace and libncurses wrappers
22:06:50*rockcavera quit (Remote host closed the connection)
22:07:10shashlick@mratsim - hope it is valuable to your team
22:07:19*gangstacat quit (Quit: ฤœis!)
22:09:01disruptekshashlick, you are bringing to reality the as-yet merely promised potential of nim.
22:10:11disruptekthe pragmatic point is, if it's too burdensome to create wrappers, it doesn't matter how good the ffi is.
22:10:34*nsf quit (Quit: WeeChat 2.6)
22:16:13shashlickyep and i'm still at the `create wrappers` step, there's still the part of making it easy to use the wrappers
22:16:52shashlickraw C wrappers aren't all that nice
22:16:56disruptekso much potential.
22:17:59disruptekso nimph doesn't work with cpp.
22:19:57disrupteksomething related to mutable iteration, i think.
22:21:10*sagax quit (Ping timeout: 268 seconds)
22:30:04dom96I'm personally still of the opinion that we can get an awesome experience by creating a macro which generates wrappers at compile-time using libclang
22:31:46disrupteknimterop will be able to generate wrappers for myriad languages, though, and without the weight of clang.
22:34:51shashlickdom96 - nimterop is exactly you statement with s/libclang/tree-sitter/
22:38:48dom96it generates wrappers at nimble install-time though, not compile-time, right?
22:39:29FromDiscord<mratsim> @clyyber, I finally solved my Glibc bug, and I confirm it's Glibc which has a flaky condition variable implementation
22:40:05disruptekdom96: nimterop works at project compile-time, just the way you'd expect.
22:40:10FromDiscord<mratsim> I remimplemented condvar from scratch ๐Ÿ˜„
22:40:45*sealmove quit (Quit: WeeChat 2.6)
22:48:09clyybbermratsim: Damn, good job. I'll have to take a look
22:48:26FromDiscord<mratsim> it's short: https://github.com/mratsim/weave/pull/58/files
22:48:27disbotโžฅ Me 1 - 0 Glibc: replace buggy Glibc condvar by futex
22:48:34Yardanicodid you report it?
22:48:39Yardanicojust curious to see the devs responses
22:48:42FromDiscord<mratsim> nop
22:48:59FromDiscord<mratsim> I don't want to deal with their bug tracker from the 2000s
22:49:40FromDiscord<mratsim> + reproducing a C test case would be too time-consuming
22:49:46FromDiscord<mratsim> creating a C test case*
22:50:01clyybbermratsim: Wait, and it made it faster? Or at least more mem efficient?
22:51:00FromDiscord<mratsim> obviously
22:51:09FromDiscord<mratsim> everything in pthread is based on futex
22:51:16FromDiscord<mratsim> mutex, condvar, semaphore
22:51:27FromDiscord<mratsim> at a low-level it's the unique way to put a thread to sleep
22:51:36shashlickdom96: you are thinking of nimgen
22:51:40FromDiscord<mratsim> condvar with timeout, lock with timeout
22:51:52FromDiscord<mratsim> so it's also faster
22:52:08clyybberWell thats just fucking nice :D
22:52:26FromDiscord<mratsim> benefits of formal verification ๐Ÿ˜‰
22:52:39FromDiscord<mratsim> I know that naked wait + wake are enough
22:53:08clyybberWhy is it only enabled on linux though?
22:53:09FromDiscord<mratsim> locks and condvars have a lots of if/else/if/else to avoid race conditions and misuses
22:53:20FromDiscord<mratsim> Only Linux and Windows have futex
22:53:23dom96shashlick, oh, I see. that's awesome.
22:53:28FromDiscord<mratsim> MacOS and BSD don't have them
22:53:35clyybberThats a shame
22:53:43clyybberwell, at least they don't have that bug
22:53:48shashlickNimarchive used in choosenim is a nimterop based wrapper
22:54:04FromDiscord<mratsim> here is an intro: https://eli.thegreenplace.net/2018/basics-of-futexes/
22:54:26*gour_ joined #nim
22:54:26dom96shashlick, how mature is it? What are the chances it will just work (TM) if I throw any header file at it?
22:56:17dom96also, does it support C/C++/ObjC equally well?
22:57:06clyybbermratsim: Hmm, I'm pretty sure BSD has futex
22:57:22clyybberat least OpenBSD, and then probably Free and Dragonfly too
22:57:57*gour quit (Ping timeout: 258 seconds)
23:00:14FromDiscord<mratsim> seems like it's from 2016
23:05:14*pbb quit (Read error: Connection reset by peer)
23:06:32*pbb joined #nim
23:07:46FromDiscord<niv> dom96: hi! can i do await sleepAsync(0) as a valid "yield to scheduler" thing?
23:07:55*solitudesf quit (Ping timeout: 258 seconds)
23:08:22dom96niv: sure. that will work, but what is your use case?
23:08:26FromDiscord<mratsim> you can do cpuRelax() if you compile with threads:on
23:09:06FromDiscord<niv> im calling into a C lib in a while loop, so i need to yield once in a while to allow other fibers to run
23:09:38FromDiscord<niv> while true: { mydata = recv(timeout=5); handle(myadata); await sleepAsync(0) }
23:09:59FromDiscord<mratsim> oh, don't use cpuRelax then ๐Ÿ˜‰
23:10:01shashlickdom96: it only supports C, and restricts to header files only, no implementation
23:10:03FromDiscord<niv> yeah!
23:10:07dom96yes, that will work, but it's not ideal: it'll busy loop your CPU
23:10:24FromDiscord<niv> no, it wont. the recv call sleeps on a cv/lock until the timeout has passed
23:10:29FromDiscord<niv> so sleepAsync gets called every 5ms
23:10:39shashlickdom96: it works well enough since it only wraps what it recognizes
23:10:51shashlickdom96: so you don't error out
23:10:53dom96niv: isn't `recv` awaited?
23:10:57FromDiscord<niv> seems to work fine in testing. can i do sleepAsync(0) or is there something that will short-circuit it on some platforms to "do nothing"?
23:11:16FromDiscord<niv> dom: its not actually recv, its a custom function that's just named like that but doesnt use sockets underneath
23:11:35FromDiscord<niv> its a wrapper around openssl DTLS. its somewhat hairy.
23:11:55FromDiscord<niv> i wouldnt mind making it async itself, but i havent had a chance to really dig into what would be needed to do that on the C side
23:12:54dom96sleepAsync(0) shouldn't be short circuited, but you might wish to use `1` instead to be certain
23:13:09dom96for future proofing :)
23:13:20FromDiscord<niv> ok! thanks.
23:13:33FromDiscord<niv> how do i make something awaitable from the C side? where can i start looking?
23:14:43dom96https://github.com/nim-lang/Nim/blob/devel/lib/pure/asyncdispatch.nim#L1339-L1367
23:15:12FromDiscord<niv> ok, i guess i can do that. thanks. it's been a very long day so far
23:15:25dom96it could be tough depending on what you're doing
23:15:55FromDiscord<niv> the mentioned recv call just blocks on a condition_var until a queue can cough up one or more packets, then it returns them
23:16:07dom96the basic approach is: register an FD with the underlying selector, call `addRead`/`addWrite` to get a callback when the FD is readable/writeable, wrap that in a proc which handles the callback and completes the future appropriately
23:16:20FromDiscord<niv> i dont get access to the fd unfortunately. i'd have to fake it
23:16:36FromDiscord<niv> DTLS abstracts all of that pretty much away, best i can tell
23:16:46dom96you might be able to use the condition var, it's possible that epoll/kqueue gives readiness info for it
23:17:19FromDiscord<niv> i'll look into it next year. for now, this should be enough not to suck too badly perf wise
23:17:38dom96sure
23:18:40FromDiscord<niv> i am excited to see how well this will perform :)
23:20:13FromDiscord<niv> are you on discord perchance, where i could brazenly PM you?
23:20:47dom96yeah, I'm there but don't open it very often
23:21:03FromDiscord<niv> i'll tell you a bit about what this is for, you might get a kick out of it
23:21:26*pbb quit (Ping timeout: 246 seconds)
23:34:46*Vladar quit (Remote host closed the connection)
23:36:55*hexeratops joined #nim
23:40:49*gangstacat joined #nim