<< 22-10-2015 >>

00:01:14*strcmp1 joined #nim
00:20:33*desophos joined #nim
00:35:36*johnsoft quit (Quit: Leaving)
00:49:09*johnsoft joined #nim
00:52:03*FPanda joined #nim
00:55:50*zama quit (Ping timeout: 244 seconds)
00:56:24*zama joined #nim
00:56:24FPandahey, is someone here and has short time to answer a question?
01:03:40desophosFPanda, don't ask to ask; just ask
01:09:30FPandak i want to create a table
01:09:45FPandait looks like this right now but isnt there a different way?
01:09:58FPandavar keyTable = initTable[string, int](rightSize(100))
01:10:04FPandakeyTable["a"] = VK_A
01:10:08FPandakeyTable["b"] = VK_B
01:10:11FPandaand so on
01:11:25FPandalike creating a seq like this let test = @[1, 2, 3}
01:12:25*no_name quit (Remote host closed the connection)
01:12:25*devzerp quit (Remote host closed the connection)
01:13:43*devzerp joined #nim
01:13:43*no_name joined #nim
01:24:16ephjaFPanda: http://nim-lang.org/docs/tables.html#toTable,openArray[] http://nim-lang.org/docs/manual.html#statements-and-expressions-table-constructor
01:29:53FPandaah thx for the 2nd link
02:01:24*zaquest quit (Quit: Leaving)
02:09:22*desophos_ joined #nim
02:10:19*jakesyl quit (Ping timeout: 240 seconds)
02:13:53*desophos_ quit (Ping timeout: 265 seconds)
02:21:59*brson quit (Ping timeout: 252 seconds)
02:23:18*jakesyl joined #nim
03:10:22*ulyssesdwolfe joined #nim
03:38:19*darkf joined #nim
04:21:03*ldlework quit (Quit: ZNC - http://znc.in)
04:30:09*ldlework joined #nim
04:44:03*desophos_ joined #nim
04:48:04*desophos quit (Ping timeout: 265 seconds)
04:54:20*ephja quit (Ping timeout: 246 seconds)
05:43:34*linkedinyou joined #nim
05:52:40*desophos_ is now known as desophos
06:20:13Araqdesophos: true but c2nim makes it really easy to create more wrappers
06:33:42*gsingh93 quit (Ping timeout: 250 seconds)
06:36:23*gsingh93 joined #nim
06:36:23*FPanda quit (Read error: Connection reset by peer)
06:37:39*desophos quit (Read error: Connection reset by peer)
06:42:13*Ven joined #nim
06:49:16*strcmp1 quit (Remote host closed the connection)
06:57:18*ulyssesdwolfe quit (Remote host closed the connection)
07:23:06*ldlework quit (Remote host closed the connection)
07:23:48*ldlework joined #nim
07:36:20*desophos joined #nim
07:40:59*desophos quit (Ping timeout: 264 seconds)
07:41:21*yglukhov joined #nim
07:55:55*Trustable joined #nim
07:56:28Araqdamn, my critical fix breaks 2 tests
08:04:54*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
08:06:46*Ven joined #nim
08:07:38yglukhovHmm, seems like travis doesn't run tests. Is this intended?
08:09:08*gokr joined #nim
08:11:16Araqit does run the tests, that's why it's all red
08:13:08yglukhove.g. https://github.com/nim-lang/Nim/pull/3419 this one is green
08:13:23yglukhovmoreover, there are no tests in the build log
08:13:48Araqthat predates our test activations
08:16:26*coffeepot joined #nim
08:25:27NimBotnim-lang/Nim devel 3f24a7f Araq [+0 ±1 -0]: mitigates unclear nimsuggest problem
08:25:27NimBotnim-lang/Nim devel d93507f Araq [+1 ±3 -0]: fixes #3338
08:25:57*NimBot joined #nim
08:38:06*linkedinyou quit (Read error: Connection reset by peer)
08:38:57*bjz joined #nim
08:39:55*bjz quit (Read error: Connection reset by peer)
08:44:38*coffeepot quit (Quit: http://www.kiwiirc.com/ - A hand crafted IRC client)
08:44:51*coffeepot joined #nim
08:52:55*Ven quit (Read error: Connection reset by peer)
08:53:27*Ven joined #nim
08:56:20*Arrrr joined #nim
09:03:51*shevy left #nim ("I'll be back ... maybe")
09:04:34*joelmo joined #nim
09:17:08*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
09:22:54*Ven joined #nim
09:38:33NimBotnim-lang/Nim devel c894f6f Yuriy Glukhov [+0 ±1 -0]: Fixed broken links
09:38:33NimBotnim-lang/Nim devel bf6211d Dominik Picheta [+0 ±1 -0]: Merge pull request #3463 from yglukhov/patch-1... 2 more lines
10:04:11Araqyglukhov: if you could make travis green that would be most welcome
10:04:29Araqyou can disable what currently doesn't work, I think.
10:04:41Araqmostly some boehm GC related tests iirc
10:15:19NimBotnim-lang/Nim devel e722770 Araq [+0 ±4 -0]: doc\advopt.txt... 2 more lines
10:15:19NimBotnim-lang/Nim devel ec2d370 Araq [+0 ±1 -0]: added --reportConceptFailures switch
10:15:19NimBotnim-lang/Nim devel 9cc25f8 Araq [+1 ±2 -0]: fixes #3452
10:15:19NimBotnim-lang/Nim devel a90e23a Araq [+0 ±1 -0]: added --reportConceptFailures switch to the manual
10:23:25ArrrrIf im not mistaken, 'shallowCopy' does not perform a deep copy *until* you to modify it? Otherwise, i dont get it
10:24:09Araqyou're not supposed to modify it at all after a shallowCopy but we don't enforce that yet at runtime
10:24:20Araqoh wait
10:24:37AraqI was thinking of shallow(), not shallowCopy()
10:25:05AraqshallowCopy() is simply unsafe, you need to understand what it means to have a single indirection to the seq/string.
10:25:33Araqwe don't have 2 indirections like Python does it, so we cannot do it like Python does it. Simple as that.
10:25:43Araqbbl
10:26:00*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
10:27:06ArrrrYes, im aware of that, but then i dont understand this http://ideone.com/xG3nSs
10:27:55Arrrrif you are not actually copying everything, then why modifying b does not affect a
10:31:12dom96This may be wrong, but my understanding is that in that case shallowCopy will only copy the sequence without copying any of its items.
10:36:01ArrrrI thought the same, but it is not how it works http://ideone.com/2BRYbC
10:36:21ArrrrI would expect line 9 to only affect one MyRef if it actually does a deep copy
10:37:06Arrrrso i dont know what's the point of shallowCopy, other than turn let to var
10:40:19*cryzed quit (Ping timeout: 240 seconds)
10:42:43*cryzed joined #nim
11:02:39*Jehan_ joined #nim
11:04:32Jehan_Arrrr: shallowCopy works differently outside a procedure. I don't recall why (i.e. whether it's a bug or necessity). But if you wrap it inside a `proc main()` and then call `main()`, it works as intended.
11:04:55Jehan_That said, shallowCopy with a non-var right hand side is inherently unsafe.
11:05:42Jehan_This is why I've been arguing to deprecate it as unsafeShallowCopy and create a safe version `shallowAssign[T](x, y: var T)`.
11:06:32Arrrrwow, you are right Jehan_ http://ideone.com/xG3nSs
11:06:35ArrrrThank you
11:06:43Jehan_The reason why it's unsafe is that if the rhs is a constant (or references a constant, such as when you assign one to `let` or pass it as a non-var parameter), then it points to static memory and can trash memory.
11:07:10Jehan_I.e. you're making what's supposed to be immutable memory suddenly mutable.
11:07:32*yglukhov quit ()
11:08:25Jehan_The problem here is that there is zero warning that shallowCopy is unsafe in these cases. Even the documentation is sort of vague about it.
11:10:52ArrrrWell, in my case, and i suppose that in most cases, it is just for seqs
11:11:13Jehan_Yeah, but seqs can be constant.
11:11:28Arrrroh
11:11:37Jehan_@["x", "y", "z"], for example, will be stored entirely in static memory and not on the heap.
11:11:58Jehan_Unless and until you assign it to a `var` variable, basically.
11:12:08Jehan_Or a field of a heap object.
11:12:49Arrrrso, let a = @[1, 2, 3, 4] is static too?
11:17:32*yglukhov joined #nim
11:17:40Jehan_Arrrr: I'd actually have to check how that works right now and if `let` doesn't do anything different (the semantics for copying are a bit ... involved). But I do remember that passing as a non-var parameter doesn't allocate anything on the heap and `let` should normally mimic this behavior (so that you can have it in templates).
11:19:37*elrood joined #nim
11:19:45*Ven joined #nim
11:21:12*thotypous joined #nim
11:39:55reactormonkhttps://github.com/nim-lang/assets/blob/master/Art/logo.svg somehow renders empty in chromium?
11:43:36*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
11:45:44elroodreactormonk, not chromium's fault, it's the same for firefox
11:47:22*Ven joined #nim
11:53:54*zaquest joined #nim
11:56:03*strcmp1 joined #nim
11:56:05*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
12:03:13*smodo joined #nim
12:11:38yglukhovdoes anyone know what is the correct spelling of apt-get package for boehmgc in ubuntu?
12:11:49yglukhovdoes anyone has ubuntu in the first place? ;)
12:13:02*ayia joined #nim
12:15:29r-kuyglukhov apt-cache search ...
12:15:40elroodnot as primary system, but probably libgc(-dev)
12:15:49yglukhovdoesn't work on macos :(
12:24:11*strcmp2 joined #nim
12:24:19elroodyglukhov, oh, fun, it appears to be libgc1c2 and libgc-dev, so much for consistent naming schemes. http://packages.ubuntu.com/
12:24:23*strcmp1 quit (Ping timeout: 250 seconds)
12:29:52*no_name quit (Remote host closed the connection)
12:29:52*devzerp quit (Remote host closed the connection)
12:35:31yglukhovyeah, already tried libgc-dev and it worked. thanks! =)
12:37:27Araqah, do we need -dev packages to deploy things again? what a joy.
12:41:46yglukhoverr.. no, that's for travis tests
12:42:12*strcmp2 quit (Remote host closed the connection)
12:43:04*coffeepot quit (Quit: http://www.kiwiirc.com/ - A hand crafted IRC client)
12:43:28*coffeepot joined #nim
12:43:58*strcmp1 joined #nim
13:01:18Araqif travis needs it, we also need it on other linux machines
13:03:18ayiaHi friends! Do I understand correctly, that `type Person = ref object ... var person: Person` is the same as `type Person = object ... var person: ref Person` in context of final person variable?
13:03:34Araqyes
13:05:17yglukhovAraq: what is nimrtl_newObj? it cannot be imported by dll client. and it is not among exported symbols in libnimrtl.dylib
13:05:33yglukhovhowever, libnimrtl.dylib exports "newObj"
13:06:23Araqit's a mangled newObj
13:06:49Araqthat means some pragma usage is inconsistent I think
13:07:01Araqread lib/system/incrtl.nim carefully
13:07:37Araqit's tiny, but you need to read it carefully anyway.
13:07:50*Jehan_ quit (Quit: Leaving)
13:12:12*pregressive quit (Remote host closed the connection)
13:13:20*Ven joined #nim
13:14:14*pregressive joined #nim
13:14:42reactormonkgotta switch to arch for no dev packages >:)
13:18:19*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
13:27:12*pregressive quit (Remote host closed the connection)
13:28:56ayiacoming back to ref and non-ref objects... I have read the documentation... And it still unclear to me, what are general guidelines/best practices about when to use what... and in what style... Can somebody point me to some additional place to find the answers? or shortly explain here...
13:30:06ayiaI am also curious what is more idiomatic: `type Node : ref object of ... ` or `type Node: ref NodeObj ... NodeObj: object ...`
13:30:17Araqayia: there are 2 answers.
13:30:33ayialistening:)
13:30:52Araqif you are coming from Python or Ruby, 'ref object' is much more natural to work with (albeit produces slower code unless you know what you're doing)
13:31:31Araqand so it is the default to pick if you're after a scripting like experience.
13:31:49ayiaI am coming from "everywhere"... But really in coding I am big fun clojure-like languages... i.e. with usage of immutability as mush as possible
13:32:11Araqif you're familiar with systems programming and care about control, use 'object' and pass it around but be aware that these are copied.
13:32:41Araqand so what usually happens that eventually it gets too messy to avoid the copying and so you evolve the code to use 'ref object' instead
13:33:54ayia(i am not familiar with systems programming) So "only the overhead in copying" may be a problem with non-ref objects?
13:34:30ayiaCan there be also some problems with buffer overflow like in c++ ?
13:34:55Araqyes and no.
13:35:19Araqyes if you ask for it via 'cast' or perhaps .emit.
13:35:51Araqno, if you simply like to be careless.
13:36:50AraqNim knows the bounds of the seqs, strings and arrays and so does perform bound checks.
13:38:44Araqand contrary to popular belief, -d:release works with --boundChecks:on just fine, even though it's not the default configuration.
13:40:01Arrrr!
13:42:01*ephja joined #nim
13:45:09*Kingsquee quit (Quit: http://i.imgur.com/EsXzoum.png)
13:45:28yglukhovAraq: nim uses it's own mechanism for dynamic linkage. right?
13:45:42Araqnot if you use --dynlibOverride
13:45:54Araqthen it uses the usual C stuff.
13:56:49*smodo quit (Remote host closed the connection)
13:57:28yglukhovOk, i'm facing some black magic here.
13:57:36yglukhovFAILS: nim c -d:useNimRtl -r tests/dll/client.nim
13:57:48yglukhovSUCCEEDS: nim c -d:useNimRtl tests/dll/client.nim; ./tests/dll/client
13:58:39yglukhovThe failure: could not load: libnimrtl.dylib
13:59:34*smodo joined #nim
14:00:19yglukhovFAILS AS WELL: LD_LIBRARY_PATH=lib nim c -d:useNimRtl -r tests/dll/client.nim
14:01:23Araqwell there is a reason why I don't use shared objects on unix.
14:03:19*Ven joined #nim
14:12:13*pregressive joined #nim
14:18:45Araqperhaps somebody can help us.
14:18:52*Araq looks at OnO
14:19:58*nande joined #nim
14:23:15Araqyglukhov: the tester doesn't use 'nim c -r' though.
14:24:52yglukhovyeah, i know, but the problem seems to be the same
14:27:44yglukhovah, maybe LD_LIBRARY_PATH does not survive in the child process for some security reasons...
14:38:19Araqmaybe try to set it permanently via /etc/ldconfigbananajoe.rc
14:40:58yglukhovno such thing on macos =)
14:41:18Araqbut watch out, it only supports single tabs as separators and needs to end in a newline. because text based interfaces are best when you don't support free form.
14:41:22yglukhovi've made a dirty workaround. let's see if it works on travis.
14:50:06elroodyglukhov, you sure your third attempt didn't just fail because you haven't included tests/dll in your LD_LIBRARY_PATH and libserver.so couldn't be found?
14:51:01yglukhovoh good point, thanx
14:51:53yglukhovactually that may even explain the magic im facing =))
14:56:35*yglukhov_ joined #nim
14:59:17*barosl quit (Read error: Connection reset by peer)
15:02:23*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
15:04:19*dtscode joined #nim
15:04:25*Yaiyan_ joined #nim
15:05:56*flyx|znc joined #nim
15:06:22*someplac- joined #nim
15:06:46*yglukhov quit (*.net *.split)
15:06:47*cryzed quit (*.net *.split)
15:06:47*darkf quit (*.net *.split)
15:06:47*jakesyl quit (*.net *.split)
15:06:48*nchambers quit (*.net *.split)
15:06:50*someplace quit (*.net *.split)
15:06:50*flyx quit (*.net *.split)
15:06:50*onionhammer quit (*.net *.split)
15:06:50*Yaiyan quit (*.net *.split)
15:06:52*dtscode is now known as nchambers
15:06:52*flyx|znc is now known as flyx
15:07:26*lokulin quit (Quit: bye!)
15:07:28*darkf joined #nim
15:08:49*barosl joined #nim
15:10:52*desophos joined #nim
15:11:10*cryzed joined #nim
15:11:13*onionhammer joined #nim
15:18:31*ayia quit (Remote host closed the connection)
15:22:34*Guest46705isaway is now known as Guest46705
15:38:17*jakesyl joined #nim
15:40:12*allan0 joined #nim
15:43:29*Matthias247 joined #nim
15:44:06OnOAraq: regarding dll issue, is it Linux or OSX?
15:44:34yglukhov_ЩЫЧ
15:44:37yglukhov_OSX
15:44:58OnOokay, can you show me otool -L yourapp?
15:45:45yglukhov_if you're on OSX, you can just run ./koch test c dll
15:46:42OnOok, lemme try
15:50:44yglukhov_bbl
15:55:23*yglukhov_ quit (Ping timeout: 264 seconds)
15:55:32OnOthis dll client test fails here with message: could not load: libgc.dylib
15:55:41OnOI can't find any libgc.dylib anywhere
15:59:20*strcmp1 quit (Ping timeout: 246 seconds)
16:02:43*linkedinyou joined #nim
16:11:37*Ven joined #nim
16:24:45*coffeepot quit (Quit: http://www.kiwiirc.com/ - A hand crafted IRC client)
16:28:40*edaaa_ quit (Quit: leaving)
16:32:52*UberLambda joined #nim
16:41:19*Ven quit (Quit: My MacBook has gone to sleep. ZZZzzz…)
16:41:20*Guest46705 quit (Ping timeout: 244 seconds)
16:44:15*jaco60 joined #nim
16:45:47*yglukhov joined #nim
16:50:48*yglukhov quit (Ping timeout: 272 seconds)
16:53:31*brson joined #nim
16:57:54*Guest46705 joined #nim
17:08:35*yglukhov joined #nim
17:09:14yglukhovOnO: brew install boehmgc
17:15:40*irrequietus joined #nim
17:20:31OnOyglukhov: what's the reason it must use Boehm for this test?
17:20:58yglukhovit tests several gcs including boehm
17:22:38OnOhmm... I know, but isn't the test about something else? okay will install boehm
17:30:03yglukhovyeah, it tests dlls with different gcs
17:35:24OnOyglukhov, Araq: For some reason Nim on OSX use some Mac specific discouraged API instead simple dlopen: https://bz.apache.org/bugzilla/show_bug.cgi?id=41386
17:35:27OnOany reason for that?
17:36:10OnOsee link above, DYLD_LIBRARY_PATH is not respected when using NSCreateObjectFileImageFromFile, so there is no way to tell where the libnimrl.dylib is
17:37:03AraqOnO: no reason except legacy code.
17:37:28AraqI took inspiration for this code from Lua iirc
17:42:12*joelmo quit (Quit: Connection closed for inactivity)
17:45:17OnOI think we need to remove osx specific code from dyncalls and use just posix dlopen/dlsym
17:45:28OnOthen the DYLD_LIBRARY_PATH will be respected
17:45:31Araqsure, go head
17:46:23OnOhmm... just stupid Q, is when defined evaluated in order?
17:46:33Araqof course
17:46:39yglukhovwow, i completely missed that there's another impl for mac. so my next question is: isn't defined(posix) on mac? =)
17:46:44OnOcoz there's when defined(posix): then elif defined(windows) finally elif defined(osx):
17:46:59OnOisn't osx posix?
17:47:10AraqI think so. let me check
17:48:31yglukhovso, yeah, mac is posix, and the C code is actually dlopen and not NSCreateObjectFileImageFromFile
17:48:37yglukhovjust checked it
17:48:45Araqstatic:
17:48:46Araq when defined(posix):
17:48:48Araq echo "yes"
17:48:55Araqproduces yes for --os:macosx
17:49:09yglukhovOnO, the first question is back =)
17:54:50Araqmaybe DYLD_LIBRARY_PATH is not LD_LIBRARY_PATH
17:56:12yglukhovDYLD_LIBRARY_PATH works the same way for me.
17:56:26yglukhovthat is, as if not passed to child processes
17:56:33*Araq wonders if ld_library_path will be allowed in 2450.
17:57:19OnOargh... nim compiler does not pass it to ran process
17:57:48OnODYLD_LIBRARY_PATH=/Users/ono/Code/SDK/Nim/lib nim c -r dy doesn't print anyting where DYLD_LIBRARY_PATH=/Users/ono/Code/SDK/Nim/lib dy does
17:58:48OnOany reason compiler is not passing full environment to child?
17:59:19Araqwell I guess it just passes NULL as a "pick something reasonable"
18:00:46yglukhovno. arbitrary environment variables are passed correctly.
18:00:56yglukhovLD_LIBRARY_PATH is not passed
18:01:07yglukhovthat really looks like system behavior
18:01:47OnOweird, you mean fork+exec?
18:02:18OnOoh... oh.... I got it, """The new OS X release 10.11 "El Capitan" has a "security" feature that prevents passing DYLD_LIBRARY_PATH to child processes"""
18:02:54OnOuse DYLD_FALLBACK_LIBRARY_PATH then
18:03:04yglukhovdamnit
18:03:32OnOfuuu....... fallback neither works
18:04:36OnOokay, I think we need to simply add -Wl,-rpath, instead
18:05:03OnOor symlink/copy dylib into test directory
18:05:27OnOor... compile - then run, not altogether
18:07:13yglukhovnot into test directory, but into current dir, and that's what i've done =)
18:08:31Araqha ha ha. ok, so it's a security feature, good to know. you know what's even more secure? not turning on the computer.
18:17:15*vendethiel joined #nim
18:17:42*strcmp1 joined #nim
18:21:16*darkf quit (Quit: Leaving)
18:27:04OnOdropping DYLD_LIBRARY_PATH makes sense, but removing DYLD_FALLBACK_LIBRARY_PATH is WTF?
18:27:25OnODYLD_LIBRARY_PATH is common way to inject stuff eg. replace some libraries
18:27:42OnOwhich makes sense for apps because they can run other (eg. system apps)
18:28:04OnObut DYLD_FALLBACK_LIBRARY_PATH is rather harmless, since it is searched last, so you cannot inject anything with that
18:29:53*irrequietus quit ()
18:34:13OnOanyway I just propose to separate compile & run in testament, then DYLD stuff won't be cleared and eveything will be ok
18:41:24*Yaiyan_ is now known as Yaiyan
18:42:28OnOhttps://github.com/nim-lang/Nim/pull/3466 - PR to remove dead OSX code from lib/system/dyncalls.nim
18:44:12*Arrrr quit (Quit: WeeChat 1.2)
18:45:31yglukhovI've changed my pr to use -rpath
18:48:30yglukhovAraq, travis is green.
18:50:36*yglukhov quit (Remote host closed the connection)
18:56:04Araqwow :-)
19:00:34AraqOnO: compile and run IS separated in testament, always was.
19:00:41*UberLambda quit (Quit: GTG)
19:02:19OnOAraq: so DYLD_LIBRARY_PATH should work then, maybe yglukhov was setting LD_LIBRARY_PATH which doesn't work on OSX?
19:02:30OnOanyway it's good to know travis is green again
19:02:41Araqyup
19:10:52*smodo quit (Remote host closed the connection)
19:14:39*yglukhov joined #nim
19:14:59NimBotnim-lang/Nim devel e5aefbd Yuriy Glukhov [+0 ±3 -0]: Fixed tests for TravisCI
19:14:59NimBotnim-lang/Nim devel da33d5e Andreas Rumpf [+0 ±3 -0]: Merge pull request #3464 from yglukhov/disable-failing-tests... 2 more lines
19:15:34NimBotnim-lang/Nim devel a02359b Adam Strzelecki [+0 ±1 -0]: system/dyncalls: OS X is already handled as posix... 3 more lines
19:15:34NimBotnim-lang/Nim devel 705cdf8 Andreas Rumpf [+0 ±1 -0]: Merge pull request #3466 from nanoant/patch/remove-dead-mac-platform-code... 2 more lines
19:18:19yglukhovDYLD_LIBRARY_PATH does not work either
19:21:20yglukhovAraq, where can i read about codegenDecl?
19:22:22yglukhovok, asking questions before thinking, sorry =)
19:22:26Araqhttp://nim-lang.org/docs/nimc.html#additional-features-codegendecl-pragma
19:26:17Araqso ... who can make travis build the tar.xz ?
19:30:29*brson quit (Ping timeout: 252 seconds)
19:42:10OnOdom96 Araq : would be cool if forum mails had html version of reST and a link to the post
19:42:24OnOis it hackable at nim-forum project?
19:42:30Araqyes
19:42:44Araqyou could also PLEASE add some spam filter
19:42:54Araqeverything that contains "kitchen" in it.
19:42:57Araqcan't be hard.
19:43:49OnO:>
19:44:47Araqwell they already started to use ! instead i and use some stupid spacing.
19:45:02Araqbut we can win this fight.
19:45:20AraqI can imagine a replace(" ", "") call
19:46:13*ayia_ joined #nim
19:51:11*edin joined #nim
19:52:56edinhow should threads communicate in nim?
19:53:03*brson joined #nim
19:53:11edini could not find any examples?
19:54:43AraqI usually use a channel
19:56:19ayia_btw, are there any plans to implement something like "go" macro from clojure and go feature from go lang?
20:00:58Araqthere are plans for something that's much better (Rust inspired) but I fear it will have to wait for version 2.
20:01:45ayia_interesting... what's the name of this technology in rust? curious to get familiar with...
20:02:52Araqwell Rust uses its lifetime annotations etc to make channels safe. well it's complicated it's not like Rust only gives you channels, it gives you plenty of tools
20:05:10Araqayia_: right now we have async IO and a thread pool, but they don't really mix.
20:05:40ayia_understood... still did not look into this nim's features...
20:13:41*brson quit (Ping timeout: 250 seconds)
20:15:28edincan I share a socket between threads?
20:15:51Araqonly the native sockets cause these are just integer IDs
20:18:52edini use net module to create socket
20:18:57OnOAraq: I know you are probably fed up with that but another PR https://github.com/nim-lang/Nim/pull/3467 making usage go always to stdout (as this isn't diagnostics/error but compiler command output).
20:19:11OnOnow back to nimforum email thing
20:19:53AraqI will accept this PR if you say right here, right now, that I'm right.
20:20:27Araqthe distinction between stderr/stdout is PITA for a compiler, at least.
20:21:31Araqand of course it's not a general solution either, cause that would support N streams, not only 2.
20:21:36OnOyes it is PITA to handle, but has one good advantage of silencing diagnostics with simple 2>/dev/null and leaving output
20:22:28OnOI know 2 streams to rule them all is not perfect, but still much better than single output :)
20:22:59OnOjust one example/story: somebody is doing nimscript doing some pipe stuff like grep or sed, it is using function X
20:23:20OnOat Nim v2 function X gets deprecated, so Nim emits the warning
20:23:39OnOnow if the warning goes to stdout if will fuck up the nimscript script output
20:23:53OnOthat's why we need 2 streams, but of course we could get much more of them
20:23:57Araqwell I'm not sure you know how Nimscript works.
20:24:14AraqNimscript runs after compilation. it's easy enough to keep them separate.
20:24:50OnOare you saying that compile stage of nimscript doesn't emit any warnings?
20:24:55Araqwe could also give the compile-time 'echo' a different hook. nimscript works with an API, not with streams.
20:25:25OnOI know that nimscript is essentially VM only interpreter
20:25:37OnObut still Nim has to parse all stuff into AST
20:25:42OnOthen execute it
20:26:11Araqthe bytecode is cached and kept in memory. you can compile it and then later run it.
20:26:54OnOsure sure, all I am saying that 2 streams guarantee us that we don't ruin pipe tool output
20:27:00OnOand pipes are really useful thing
20:27:05Araqbut I agree anyway that's good to do it like Python does it, to keep unix fans happy.
20:27:28Araqno, actually, pipes are seriously underpowered. of course they are *very* useful.
20:27:34OnOeg. we could even feed CC with source code via pipe instead generating intermediate .c files
20:27:48*brson joined #nim
20:28:02OnOthat will reduce HDD usage and may speed up compile time
20:28:07Araqyes, very useful. but could easily be replaced with something better.
20:29:12Araqand how powershell does it is just one out of many possible improvements
20:30:16OnOI was wondering once about this cache thing, one solution was to keep some pre-compiled AST on disk (this exp feature of Nim) or maybe 2nd is to have nim server for particular project running in the memory keeping all stuff in memory
20:30:33OnOas long it lives, so long incremental compilation works
20:30:36Araqbeen there, done that
20:30:48Araqthat's what "nim caas" mode did.
20:31:07Araqzahary worked on it but of course we never got it stable
20:31:37Araqand at the end I decided to build nimsuggest on top of it, focussing only on the IDE aspects of it, not on the incremental code generation
20:32:29OnOhow far this symbol files is from being stable?
20:32:54OnOI understand symbol files need to be on in order to incremental compilation work?
20:33:06Araqnot really.
20:33:19Araqyou can either try and get the caas mode to work or symbol files.
20:34:03AraqI recently looked into symbol files and there are a few obvious things left to do before hitting the real bugs.
20:34:35Araqfor example, symbol files don't understand {.deprecated: [foo: bar].} statements
20:35:23Araqand since I didn't finish the obvious things I cannot tell what hard issues do remain.
20:39:19OnOdom96: I tried running nimforum, but I got a problem, it returns me empty HTTP response now, also I got some message: [WARNING] Couldn't read config file: ./forum.json
20:39:27OnOwhere do I get forum.json from?
20:43:55*avsej quit (Quit: Quit)
20:44:46*avsej joined #nim
20:44:47*avsej quit (Changing host)
20:44:47*avsej joined #nim
20:47:29*brson quit (Ping timeout: 250 seconds)
20:49:07NimBotnim-lang/Nim devel acb6a36 Adam Strzelecki [+0 ±3 -0]: msgs: One msgWriteln with optional flags... 2 more lines
20:49:07NimBotnim-lang/Nim devel 24731c5 Adam Strzelecki [+0 ±1 -0]: compiler/commands: Always write usage to stdout... 3 more lines
20:49:07NimBotnim-lang/Nim devel 2dff190 Andreas Rumpf [+0 ±4 -0]: Merge pull request #3467 from nanoant/patch/fuse-msg-api-n-use-stdout-help... 2 more lines
20:49:31*ayia_ quit (Read error: Connection reset by peer)
20:51:11Araqhow can we get travis to test this PR https://github.com/nim-lang/Nim/pull/3442 again?
20:51:25Araqseems kinda stupid to not have this in the release
20:51:35*vqrs quit (Max SendQ exceeded)
20:51:54*vqrs joined #nim
20:56:14dom96OnO: You need to write it yourself. Are you just testing the NimForum? You might not need it. https://github.com/nim-lang/nimforum/blob/master/utils.nim#L16
20:57:32dom96An empty http response sounds bad, perhaps a jester/asynchttpserver regression?
20:59:17Araqhurray, more async regressions, just what we need. will this ever get stable?
20:59:57*brson joined #nim
21:00:05*brson quit (Client Quit)
21:00:13*brson joined #nim
21:10:29OnOdom96: jester doesn't work anymore after table[...] raising exception :>
21:10:49OnOyou need to rewrite everything into ugly getOrDefault
21:10:58AraqI create a PR for jester that does exactly that.
21:11:11Araqdom96 forgot to merge it.
21:11:14OnOoh, okay
21:12:16desophossdl2_image.loadTexture seems to return a reference to the same texture every time i load the same file. is this a bug in nim sdl2? or expected behavior from sdl2?
21:12:53Araqnever noticed it but SDL2 uses reference counting, so it's allowed to do that I think
21:13:05Araqyou need to free it multiple times then
21:13:25*nande quit (Remote host closed the connection)
21:13:46desophoswell my issue is that i want multiple copies of the same texture (e.g. for tiles), but when i render one it renders them all
21:14:40desophosor something like that... i'm not sure exactly what's going on but i think it's related to this
21:15:04dom96I didn't like your usage of the let expression in the if, but i'll merge it now anyway.
21:16:02*strcmp2 joined #nim
21:16:53Araqyeah well, as I said, if you think it's more important to have beautiful utterly broken code rather than working code ... :P
21:17:13*yglukhov quit (Remote host closed the connection)
21:18:45desophosactually that might not be the problem... all my references have different addresses
21:19:07*strcmp1 quit (Ping timeout: 250 seconds)
21:19:46desophoswow. yeah that wasn't the problem
21:20:21desophosi was checking intersection with the src rect instead of the dst rect...
21:20:47OnOdom96 Araq: btw. we can really have some macro that rewrites x[y] !? z into x.getOrDefault(y, z)
21:20:49Araqyeah these rectangles are stupid, I wrote a wrapper that does what I think is natural
21:21:12OnOonly problem I have no idea how I can match the macro to only x[y]
21:21:12desophosAraq, i'm using your wrapper :p
21:21:42Araqdesophos: it's not my wrapper and the code I'm talking about is not open source, so I doubt it.
21:21:58dom96OnO: `!?` could be a general operator to catch all exceptions and return `z` if one is caught.
21:21:58AraqI only maintain it, I didn't write it.
21:22:04desophosoh okay
21:22:14dom96That would probably encourage inefficiency though.
21:22:17desophosyeah i thought you were referring to https://github.com/nim-lang/sdl2
21:22:23Araqspeaking of which
21:22:31Araqlet me fix that wrong dependency
21:22:38OnOdom96: not if we can optimize it
21:22:55AraqOnO: you can hack it into nimfix
21:22:56OnOif table.`[]` was a template it would be easy
21:23:08Araqbut it's not clear what you want.
21:23:12dom96Araq: You mean the sdl dependency? I fixed it.
21:23:20Araqoh ok, great. :-)
21:23:57Araqnevertheless Nimble is over-engineered. > and < make no sense for version checks.
21:24:05Araqit's always >= and <=
21:24:22Araqsince as I said, exclusive bounds are not constructive.
21:24:38Araqyou need to give a witness.
21:25:13dom96Then don't use those operators. Nobody is holding a gun to your head.
21:25:15OnOidea is to turn: try: if x: y else: raise Ex except Ex: z into: if x: y else: z
21:26:01AraqOnO: well the point of the change was to break [] to always raise an exception.
21:26:17Araqnow you think getOrDefault is ugly. fair enough.
21:26:17OnOthe problem is that in fact we deal with: try: proc(...) except Ex: z where: proc = if x: y else: raise Ex
21:26:44Araqbut you then skip a couple of thoughts and present us an optimization problem.
21:26:45OnOAraq: nah I don't care about if it is ugly or not, I am thinking about how to make Nim to be compact and expressive
21:27:03OnOI don't like that we need 2 versions of throwing or not throwing
21:27:16OnOthis makes everything bloated
21:27:34Araqthe solution is rather simple though
21:28:02dom96Just tested Jester. Still works.
21:29:05OnOI want to be able to write compact syntax: let x = hash["X"] or defaultX
21:29:32dom96that would be nice
21:29:53OnOsame goes to let x = newSuperDupaObj(x) or newStdObj(x) # when 1st fails
21:30:07Araqyes exactly.
21:30:13Araqso that's 1 `or` template.
21:30:39Araqand oohh!
21:30:50Araqthe wise designer of Nim foresaw this requirement
21:30:59Araqand made 'try' available as an expression.
21:31:01OnOI am all ears
21:31:08Araqis that crazy or what?
21:31:37OnOI know try is an expression, but we get back to squre one that raising and catching is pricey
21:32:11OnOhow we can optimize-out this raise&catch knowing we gonna catch anyway soon
21:32:29Araqthat's a TR macro.
21:32:41dom96Pity `[]` doesn't return an Option[T]
21:33:08Araqor you can optimize it in the backend, but then you need to be able to inline things
21:33:12dom96Will it be broken in a couple of months again?
21:33:22Araqno.
21:33:44OnOdom96: the option thing seems to be very sexy, can we discuss it for a moment?
21:33:45Araqit will never return Option[T] because that is a) tedious to use
21:33:53OnOso it would raise only when dereferenced, right?
21:33:57Araqand b) not compatible with Python.
21:34:02OnOand when there's nothing inside?
21:34:19OnObut not raise when compared against false?
21:34:25ephjawhat about COBOL?
21:34:43Araqand the dissimilarity to Python is what actually caused bugs and made me change it.
21:35:05Araqit also doesn't help that the 'var' version of [] really needs to throw anyway.
21:35:07*pregressive quit ()
21:35:13OnOAraq: you know, now it is dissimilar to Ruby and ObjC :P
21:35:32AraqRuby doesn't raise a key missing exception? are you kidding me?
21:35:48OnOnope, it returns nil
21:35:56OnOsame as ObjC
21:36:06OnOand you know what iOS and OSX works
21:36:08Araqinteresting, but we don't have a nil for every type anyway
21:36:18OnObut I haven't seen OS based on Python yet
21:36:30dom96It's a bit odd to have modules which do return an Option[T] and others which raise exceptions in the standard library.
21:36:39Araqno, it is not.
21:36:41Araqomg.
21:36:52OnOAraq: yes that's the problem, in ObjC hashes can store only object types, in Ruby everything is object type
21:36:56Araqthat's why I argued against Option[T].
21:37:14Araqbecause I knew discussions like these would come up.
21:37:33Araqagain, option[t] is simply not convenient to use. and it's slower too.
21:37:54Araqand arrays don't return Option[T] either, they raise an IndexError.
21:38:13Araqand again, exceptions do not do the same thing as Option[T].
21:38:44Xeeven haskell has exceptions :)
21:38:53OnOAraq: I know it is slower... that's why I am thinking about our secret operator rewriting `[]` into `getOrDefault` when it is present (compilable)
21:38:57Araqand even Haskell has exceptions.
21:39:28OnOand then fallback to simple try catch when you can't optimize out it
21:39:29Araqand why or why can nobody understand the difference between O(1) and O(calling depth)
21:39:52Araqyou cannot simply compare two code snippets, one that uses exceptions and one that doesn't.
21:40:19Araqexceptions alter the control flow! There is good things about that, there is bad things about that.
21:40:35Xesometimes if things are decently fucked up
21:40:39Xeyou want to alter the control flow
21:40:52Xe"I can't allocate memory, gtfo"
21:41:24Araqthe designers of C++ and Ada were not morons that never heard about Option[T] and so they added exceptions to these languages.
21:43:25*strcmp2 quit (Ping timeout: 240 seconds)
21:44:11OnOI think you are mixing two different things, exceptions are not replacable by options
21:44:27OnOexceptions are for errors, options are for non-error missing value
21:45:12OnOnow let = hash["XXX"] sounds like error because we are not really interested if the value is there
21:45:56OnOlet x = hash["XXX"] or defX: is not an error, because developer expects that value is missing, so we shouldn't do it exception way
21:46:50OnOexceptions are usually sinked somewhere at the run-loop level, where options are used were tights, usually not escaping the frame
21:46:56dom96Actually, I just realised that in the case of a Table[T] you would likely be checking for the existence of the key ahead of time.
21:47:01AraqOnO: it's offtopic but there was a python based OS in development. it died, not sure how far they got.
21:47:02dom96Instead of relying on the error.
21:47:42Araqdom96: the only thing that is bad about the new getOrDefault is that it is verbose. It does exactly the right thing for jester though.
21:48:04Araqso IMO we're only talking about syntax here, its semantics are perfect for its use case.
21:48:16OnOAraq: for me it is not verbose enough, because I still need to look somewhere else to see what is the default
21:48:56AraqOnO: well but in the usual case which is tab.getOrDefault"key" == "foobar" you don't have to know
21:49:11Araqas both nil and "" compare to "foobar" as false.
21:49:33dom96sure, but I think I will end up using: if x.hasKey(key): x[key] else: "", more often.
21:50:00dom96I have thought about a wrapper for exceptions which returns an Option[T]
21:50:06Araqbut sorry, that's just your personal taste.
21:50:45AraqI see nothing wrong with if (let y = x.getordefault"key"; y.len > 0): use(y)
21:50:55OnOAraq: tab.getOrDefault"key" == "foobar" still sucks because it should bail out with false when there is no value
21:51:07Araqhurm?
21:51:20OnObut in fact it takes default "" and compared to "foobar", pretty many CPU cycles lost
21:51:53Araqthat's a good point.
21:52:29Araqso we actually want tab.keyOf("key", "foobar")
21:52:48Araqor a TR macro to spice it up
21:54:12Araqdom96: and the wrapper you speak of should really be added as a template to the optional module or whatever it is called
21:54:43OnOone question, why there needs to be an exception on: if tab["key"] == "foo":
21:54:50OnOfor me it looks like not an error
21:54:52dom96Araq: You think I should add it?
21:55:00OnOand it has to be false, because there is no value
21:55:09Araqyeah go ahead. you can even make it use 'concept'
21:55:22Araq'concept' is getting good enough these days (I hope)
21:55:27OnObut let x = tab["key"] IMHO has to raise when there's no key
21:55:37*Guest46705 is now known as Guest46705isaway
21:56:08OnOI think we then don't need defaults or anything
21:56:24AraqOnO: well but this kind of crazy context dependency is just your personal taste. I can see the merits but it's just too inconsistent
21:57:22Araqonly Perl does these kinds of stunts and Perl got a pretty bad reputation for it.
21:57:29OnOAraq: imagine that we are not stricly typed, and when there's no key we get some magic NotFound value
21:57:41OnONotFound always returns false when compared to anything
21:57:49OnObut cannot be assigned to anything
21:58:22Araqbut let foo = tab["key"] is not an assignment.
21:58:34Araqit's a simple substitution.
21:58:52Araqtechnically it is an assignment, but formal semantics disagree
22:00:41dom96Interesting. According to TIOBE, Rust is more popular than Go.
22:00:58Araqbut ok, your argument makes sense anyway. but what does it mean for Nim? Nim is not dynamically typed.
22:01:16Araqwe don't have a NotFound available.
22:02:38Araqwhat? and Delphi is at 11?
22:03:28dom96indeed
22:04:18Araqand assembly language comes after it?
22:04:27Araqthat's just absurd.
22:04:34Araqno data is better than this data.
22:05:08Araqalso they still split "Pascal" and "delphi".
22:05:28OnOjust some inspiration from ObjC... I'd write if tab["key"].length, when to "key" it returns nil, nil returns 0 length, no temporary object created
22:05:32Araqwhich indicates they have not the slightest clue about what they are actually trying to measure
22:06:21OnOnow If getOrDefault returned nil and instead comparing == "" we did: if tab.getOrNil"key".empty then it would be quicker already
22:06:47Araqbtw 'len' returns 0 for 'nil' nowadays.
22:06:56Araqwe could make it return nil.
22:07:04OnObut nil != ""
22:07:12Araqand the comparison always could handle nil too.
22:07:22OnOso all jester checks shouldn't compare to "" but check length of 0
22:07:39Araqwell ok, yes.
22:07:48Araqwasn't aware they do check against ""
22:08:14OnOlot of result.headers["Cookie"] != ""
22:08:52OnObut in fact headers.hasKey"" is not enough
22:09:07Araqwell there is also the C++like small string optimization we could implement, then "" would not allocate anymore.
22:09:18OnOI mean headers.hasKey"Cookie" is not enough, because the value stored may be empty too
22:09:53Araqyeah, but that has always be a problem then with the hasKey coding style
22:10:07Araqwhich dom96 seems to like :P
22:10:20OnOyeah, I deal with that thing everyday writing these iOS apps using JSON HTTP apis
22:11:31OnOif you want to hear scary thing for the nights, the JSON deserialized container can on j["someKey"] return you nil or NSNull singleton instance :>
22:11:36OnOthese both are different cases
22:12:03OnO1st no value for that key at all, 2nd there is value of JSON's nil for that key
22:12:07OnOpretty fucked up
22:12:25Araqthis is another argument against Option[T], you often need to check for s.len > 0, 'some' value doesn't cut it
22:15:20OnOyeah, I wish everything could happen at optimization level, leaving simple and nice syntax
22:16:04OnOfor some newbie programmer or mathematician headers["HOST"] != "" is more clear than headers.getOrNil"Host".empty
22:16:05Araqbut optimizations cannot eliminate corner cases and it's the corner cases that people get wrong and must be available
22:16:22OnOalso such syntax is imho better for eyes
22:16:35Araqbut I agree with you.
22:16:58Araqheaders["Host"] != "" is the best syntax and a clear composition of concepts.
22:17:03OnOthat's why I fucking hate Java, and avoid it by all means
22:17:30Araqit's unfortunately also wrong. so your optimization becomes a "do what I mean" *transformation*
22:17:47OnOtrue
22:18:10OnOby isn't the holy grail of programming languages to have expressiveness of spoken or math language?
22:18:33OnOand for spoken lang context matters
22:20:54dom96FWIW .len used to crash on nil, and I preferred that behaviour.
22:20:59dom96Returning 0 is too subtle.
22:21:43dom96Suddenly you have `$` for seq[T] returning "@[]" for `nil`.
22:21:44*FroznPanda joined #nim
22:22:04OnOthat's why Nim needs to have Nilable working
22:22:30OnOand proc arguments not be nillable by default
22:22:37OnOonly when expressed explicitly
22:22:57OnOright now you never know what will happen when you put nil
22:23:24*Kingsquee joined #nim
22:23:30Araqactually you can be pretty sure that it crashes.
22:23:51Araqexcept ofc for 'len' which was perhaps a misguided attempt to make the language more user friendly
22:24:10*thotypous quit (Ping timeout: 240 seconds)
22:27:33OnOAraq: we you thinking about pointer tagging for some objects?
22:27:46OnOeg ""
22:28:36OnOI forgot, strings are mutable or immutable in Nim ? :P
22:28:38Araqnope. pointer tagging is never on my radar, because bad C interop and the GC needs to be aware of it too
22:29:06AraqNim's strings are byte buffers and so mutable like the whole rest of the language
22:29:29Araqthey are immutable as parameters and 'let's like the whole rest of the language.
22:29:51Araqthey were designed -- guess it -- to be consistent with the whole rest of the language.
22:30:18Araqit's the one design aspect in Nim where I went for consistency over speed.
22:30:51Araqand it likely was the wrong decision but it's not like the alternative designs don't have they own problems too.
22:31:09Araq*their own
22:31:20OnOyeah, I know
22:31:20*vendethiel quit (Ping timeout: 246 seconds)
22:32:28Araqhowever, I knew we could always introduce Delphi-like or C++-like optimizations under the hood and make them as fast as they are in these languages
22:32:59Araqso ... it's perhaps still the best design out there.
22:35:49OnOyeah C++ optimizations are pretty cool, only compile time TR suck because of templates, I tend to writie everything as inline (class body) methods so the compiler can optimize everything
22:36:35OnOthis comes to 2nd aspect of Nim, when Nim system lib procs should be template, when proc or maybe proc {.inline.}
22:37:14AraqI used to prefer .inline procs, but templates can be faster still, so in doubt, use a template
22:38:06Araqalso we need to remove lists.nim from the stdlib and replace it with a template based solution. much more flexible.
22:38:10ephjaare the optimizers that bad at deciding when to inline?
22:38:33OnObut some of short stuff like data container accessors should be inline?
22:38:46Araqephja: no, but .inline means the C compiler gets to inline it which is not aware of Nim's semantics
22:39:06AraqNim can optimize Nim code better than the C compiler. ;-)
22:39:10ephjaok
22:39:59AraqOnO: arguably especially these should be templates
22:40:19Araqsince they give you the var/non-var versions for free
22:40:39OnOlooking at tables.nim, `[]` embeds get (a template) which calls rawGet which embeds rawGetImpl
22:40:58OnOI think either `[]` or rawget should be template
22:43:02Araqperhaps but be aware that compilers are very bad at de-inlining stuff when you try to optimize for code size
22:43:35OnOokay then all rawSomething should be {.inline.}
22:44:18Araqwell but usually I don't use .inline and trust the C compiler to find inline opportunities on its own.
22:44:19*pregressive joined #nim
22:44:44Araqlink time optimizations are available for all big C compilers.
22:44:47OnOnot sure if they do unless O3?
22:45:13Araqtables.nim in particular was optimized by an expert, so don't touch it.
22:45:39Araqhe looked at the cache misses and instruction scheduling.
22:45:55Araqyou can be sure he would have noticed if there was some .inline missing.
22:47:41OnObut all modules lives in separate compilation units?
22:47:44OnOs/lives/live
22:48:54OnOnevermind, I need to go get some sleep
22:49:00OnOgood night
22:50:19Araqno, they don't. .inline procs are duplicated for the poor C compilers who don't use link time optimizations
22:51:04*FroznPanda quit (Read error: Connection reset by peer)
22:52:35*FroznPanda joined #nim
22:54:17*elrood quit (Quit: Leaving)
22:56:29*edin quit (Quit: leaving)
22:57:00*edaaa__ joined #nim
23:13:45*gokr quit (Ping timeout: 240 seconds)
23:15:49*Kingsquee quit (Quit: http://i.imgur.com/EsXzoum.png)
23:17:05*keypusher quit (Quit: Konversation terminated!)
23:17:20*Matthias247 quit (Read error: Connection reset by peer)
23:17:21*desophos quit (Ping timeout: 255 seconds)
23:18:00*keypusher joined #nim
23:28:27*desophos joined #nim
23:29:12*Trustable quit (Remote host closed the connection)
23:30:48*thotypous joined #nim
23:36:45*vqrs quit (Max SendQ exceeded)
23:37:36*vqrs joined #nim