ChanServ changed the topic of #crystal-lang to: The Crystal programming language | http://crystal-lang.org | Crystal 0.34.0 | Fund Crystal's development: http://is.gd/X7PRtI | GH: https://github.com/crystal-lang/crystal | Docs: http://crystal-lang.org/docs/ | API: http://crystal-lang.org/api/ | Gitter: https://gitter.im/crystal-lang/crystal
<FromGitter> <Blacksmoke16> *fumigator*
<FromGitter> <Blacksmoke16> logo can be an 🐊 smoking a joint
<straight-shoota> oprypin thanks, I've already looked there :D
<straight-shoota> cleanse is nice
<oprypin> > selenite
<oprypin> too bad that this is all fake science
deavmi has quit [Ping timeout: 260 seconds]
<oprypin> regarding "purifying crystals" 😬
<straight-shoota> definitely the next best thing after snake oil
deavmi has joined #crystal-lang
<FromGitter> <Blacksmoke16> Thoughts and prayers
<straight-shoota> bah, that looks too much like actual science :D
<oprypin> no this is actual science
<oprypin> impurity removal is a good direction to dig in
rocx has quit [Ping timeout: 260 seconds]
<FromGitter> <cbortz> Thanks for the response regarding the shards.yml spec @oprypin ! The link to the shards spec was tremendously helpful
_ht has joined #crystal-lang
alexherbo2 has joined #crystal-lang
<jhass> oprypin: mmh, yeah it seems a bit verbose to include verbatim. If the bot would keep an internal map of threads, say up to 100 and then rolling over, I could imagine at least a @#NN: kind of prefix though. But actually I'd even be thankful for a simple @thread: prefix or so, so I can at least ignore the messages knowing that my reply would be out of context and ignored
livcd has joined #crystal-lang
alexherbo2 has quit [Ping timeout: 265 seconds]
gangstacat has quit [Ping timeout: 272 seconds]
gangstacat has joined #crystal-lang
alexherbo2 has joined #crystal-lang
deavmi has quit [Read error: No route to host]
deavmi has joined #crystal-lang
deavmi has quit [Client Quit]
alexherbo2 has quit [Ping timeout: 240 seconds]
deavmi has joined #crystal-lang
deavmi has quit [Remote host closed the connection]
deavmi has joined #crystal-lang
deavmi has quit [Ping timeout: 264 seconds]
deavmi has joined #crystal-lang
deavmi has quit [Ping timeout: 258 seconds]
deavmi has joined #crystal-lang
<FromGitter> <spTorin> ```code paste, see link``` ⏎ ⏎ Why output same mail address? Where error? [https://gitter.im/crystal-lang/crystal?at=5ec25f3cf3ce603074c67fcc]
alexherbo2 has joined #crystal-lang
<FromGitter> <spTorin> If just print `pp node` in each_loop - all info is OK.
flips has quit [Quit: bbl ...]
<jhass> `//` searches from the document root, not from the context node
<jhass> for the example just drop it and it should be fine
<jhass> for real world you may want to use ./ to keep descending (iirc, not sure)
<FromGitter> <spTorin> I know about `//` and `/`, but I try find in `node`, not in `nodes`
<FromGitter> <spTorin> I see now, thx
<FromGitter> <spTorin> Just think what `node` standalone XML::NodeSet
alexherbo2 has quit [Ping timeout: 265 seconds]
zorp has joined #crystal-lang
deavmi has quit [Quit: No Ping reply in 180 seconds.]
deavmi has joined #crystal-lang
flips has joined #crystal-lang
deavmi has quit [Quit: Eish! Load shedding.]
deavmi has joined #crystal-lang
rocx has joined #crystal-lang
alexherbo2 has joined #crystal-lang
<FromGitter> <xmonader> How can I do that in crystal? ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5ec27ca97da13f3a0abf6214]
<FromGitter> <j8r> @xmonader you would like to sort dates, you'll probably need to use `Time`
<FromGitter> <j8r> because `"2017-9-12"` will be bigger than `2017-11-12`
<oprypin> https://crystal-lang.org/api/0.34.0/Array.html#sort_by(&block:T-%3E_):Array(T)-instance-method
<oprypin> you receive 1 item, not 2
<oprypin> instead of returning `conversion(a) < conversion(b)` you just return `conversion(x)`
<oprypin> and Crystal does the < part itself
<oprypin> @xmonader: https://crystal-lang.org/api/0.34.0/Array.html#sort_by(&block:T-%3E_):Array(T)-instance-method you're not supposed to receive 2 items but one
<FromGitter> <xmonader> > @xmonader you would like to sort dates, you'll probably need to use `Time` ⏎ ⏎ yup indeed, I just want to get started just by just doing a compartor then map to Time
<oprypin> so this might just be .sort!.reverse! if done simply
<FromGitter> <xmonader> oh okayy my fault thought sort_by takes a comparator func
<FromGitter> <xmonader> thank you
<oprypin> but now that we have this consideration, you can `sort_by { |x| Time.parse(x) }`
<oprypin> i have no idea how to actually parse time, that's a placeholder
<FromGitter> <xmonader> i'll try it out thank you so much
<jhass> fwiw you totally can do .sort {|x, y| y.a <=> x.a } to avoid a .reverse! after the fact
<jhass> but yeah, don't try that with sort_by
<jhass> also sort_by will be smarter about avoiding duplicate conversions
<FromGitter> <xmonader> i'm worried with what to do in case of invalid dates to in the case of sort_by
<straight-shoota> You don't necessarily need to parse as `Time`, but it's probably the easiest solution
<straight-shoota> Alternatively, you can split the strings by `-` and sort the resulting array. This avoids the issue j8r mentioned
<straight-shoota> How do you want invalid dates to sort?
<FromGitter> <xmonader> probably want them to be the last
<jhass> >> {[Time.local, nil].sort, [nil, Time.local].sort}
<DeBot> jhass: - Time#<=>(other : Nil) - https://carc.in/#/r/93dn
<jhass> mh, it just refuses
<straight-shoota> yeah, you need sort with a block to define the nil behaviour
<FromGitter> <xmonader> i can probably get around by maintaining two arrays
<FromGitter> <xmonader> and then push the invalid ones into the end
<jhass> I guess do sort with a block, return 0 for a == b == nil, -1 for a == nil and 1 for b == nil, otherwise a <=> b
<FromGitter> <xmonader> will try thx ^_^
<jhass> or maybe swap the -1 and 1 I always get confused and just try and error
<straight-shoota> >> [nil, Time.local, nil, Time.local(2020, 1, 1)].sort { |a, b| a.nil? ? 1 : (b.nil? ? -1 : a <=> b) }
<DeBot> straight-shoota: # => [2020-01-01 00:00:00.0 +00:00, 2020-05-18 12:36:23.850132000 +00:00, nil, nil] - https://carc.in/#/r/93ds
<jhass> yeah, see vice versa :D
<straight-shoota> Maybe there should be a `sort` overload for dealing with nil values
<jhass> idk, where you want them seems application specific
<jhass> could be front, end or stable
<straight-shoota> yeah it would need to be configurable
<straight-shoota> lik in SQL: `ORDER BY x NULLS LAST`
<jhass> you only need that in SQL because you can't really roll your own though
<jhass> I think what we have is fine, it's not so hard to deal with with sort(&)
<straight-shoota> You can roll your own in SQL, too with CASE. It's just more convenient to just declare the behaviour instead of implementing it.
<straight-shoota> Same goes for Crystal
<straight-shoota> It seems a common enough use case
<jhass> meh, I feel like we've been feature creeping stdlib a bit lately, let's pause that for a bit
<jhass> Is it? I never needed it
<jhass> only .compact.sort
<straight-shoota> If you do a lot of sorting in database, you might not need it that much
<straight-shoota> yeah, next evolution for shardbox should be to index all source files and provide proper searching features =)
<straight-shoota> docs are more important, though
<jhass> honestly I'd be fine if you just pile them on disk and allow me to run ag on them and it takes half an hour
<straight-shoota> o_o
<FromGitter> <naqvis> are they trying to bring bing to github? 😕
<FromGitter> <xmonader> oh no function all or any?
<jhass> (I need to implement docs search into the bot...)
<FromGitter> <xmonader> ah i was searching on Array class
<FromGitter> <xmonader> thanks
<FromGitter> <xmonader> I ruined it :D ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5ec287906773a13b23eb2a4f]
<FromGitter> <Blacksmoke16> isnt this something you could do in SQL?
<FromGitter> <xmonader> > *<jhass>* Array has this lovely section https://cloud.aeshna.de/index.php/apps/sharingpath/mrzyx/Public/screenshot_2020-05-18_145428.png ⏎ ⏎ yup i was searching with `def all` in the page .. too many mentions of all word :D
<FromGitter> <xmonader> > isnt this something you could do in SQL? ⏎ ⏎ not really, i'm collecting posts from the file system directly into memory
<FromGitter> <Blacksmoke16> ah
<FromGitter> <Blacksmoke16> gotcha
<FromGitter> <confact> How do I make the HTTP server to listen to host "0.0.0.0"? Trying to deploy an crystal app on kubernetes.
<FromGitter> <Blacksmoke16> set the host to `"0.0.0.0"`?
<jhass> https://crystal-lang.org/api/0.34.0/HTTP/Server.html#listen(host:String,port:Int32,reuse_port:Bool=false)-instance-method
<jhass> https://crystal-lang.org/api/0.34.0/HTTP/Server.html#bind_tcp(host:String,port:Int32,reuse_port:Bool=false):Socket::IPAddress-instance-method or this
<jhass> srsly we should run a short hash over the anchors...
<FromGitter> <j8r> yep, or number overloads for each method
<FromGitter> <j8r> must not be hard to do
<jhass> well I'd prefer a stable hash, overloads may get some added/inserted/moved/removed etc
<jhass> so I wouldn't depend on order of them
<FromGitter> <confact> thanks jhass. It will hopefully work
<jhass> compromise could be to keep the method name and only append the hash or even just run it over the arg list
<jhass> then we could even add a second anchor to the first overload without the hash and just the bare name, in case somebody wants to guess-generate links
lunarkitty has quit [Ping timeout: 260 seconds]
lunarkitty has joined #crystal-lang
<straight-shoota> stripping the names of positional arguments and default values would already help
<straight-shoota> and the method type suffix could just be one letter
<straight-shoota> maybe even a prefix
<jhass> yeah, could just make class methods start with . or so
<jhass> I think stripping argument name doesn't work though
<jhass> could have foo(*, a : String) and foo(* c: String)
<FromGitter> <Blacksmoke16> just skipping named/splat args?
<jhass> sorry, what's the question related to?
<FromGitter> <Blacksmoke16> i mean like arguments that dont have a type, or are a union of multiple types, or are special arguments, like named only, blocks, etc
<FromGitter> <Blacksmoke16> since not all of them couldnt be represented just with a type class
teardown has quit [Read error: Connection reset by peer]
<jhass> you lost me on the context of either sentence
<FromGitter> <Blacksmoke16> > *<jhass>* ignoring that https://crystal-lang.org/api/0.34.0/HTTP/Server.html#bind_tcp(String,Int32,Bool):Socket::IPAddress compared to https://crystal-lang.org/api/0.34.0/HTTP/Server.html#bind_tcp-abdef12 ⏎ ⏎ Sorry, was referring to this
<FromGitter> <Blacksmoke16> was assuming `(String, Int32, Bool)` are just the types of the arguments
<jhass> yes, I was just comparing straight-shoota's proposal to mine, ignoring the conflicts in his one
<jhass> not sure where you're going...
<FromGitter> <Blacksmoke16> nvm
<straight-shoota> jhass foo(*, a : String) and foo(* c: String) are not positional arguments. I explicitly excluded that.
<straight-shoota> But I agree a hash is probably easier to use
<FromGitter> <Blacksmoke16> yes, with less changes required for future syntax/arguments changes
<straight-shoota> Even if you want to build deep links from external sources. You need understand the specific anchor naming scheme anyway, so applying a proper hash shouldn't be a huge issue
<FromGitter> <Blacksmoke16> assuming the hash would only change if the arguments change, be easy enough to just grab it from the docs
<straight-shoota> Only downside: It's impossible to retrace the intent of such a hash when it's broken
<FromGitter> <Blacksmoke16> ideally with some logic to take you to first method with that name, if it doesnt exist anymore?
<FromGitter> <Blacksmoke16> well, could encode the docs version within the hash
<FromGitter> <Blacksmoke16> or fallback on latest/master
<FromGitter> <Blacksmoke16> if its not setup for that
<FromGitter> <Blacksmoke16> er maybe the other way around. Default to latest/master, and fallback on the encoded version if it doesnt exist anymore
<FromGitter> <Blacksmoke16> nvm, wouldnt really know the version it worked last on
<straight-shoota> I can't see how hashing the version makes any sense at all
<straight-shoota> How could links to latest possibly work if every release has different hashes?
<FromGitter> <naqvis> javadoc also do the same thing as current crystal docs are doing. just an example `https://docs.oracle.com/en/java/javase/14/docs/api/java.net.http/java/net/http/HttpClient.html#send(java.net.http.HttpRequest,java.net.http.HttpResponse.BodyHandler)`
<FromGitter> <naqvis> anchor include the method and params
<FromGitter> <naqvis> godoc only use method name
<straight-shoota> Go doesn't have method overloading, so that's easy for them
<FromGitter> <naqvis> yeah, true
<FromGitter> <naqvis> Nim document just strip away the parens ⏎ `https://nim-lang.org/docs/algorithm.html#reverse%2CopenArray%5BT%5D%2CNatural%2CNatural`
<FromGitter> <naqvis> but they do include the params
<FromGitter> <Blacksmoke16> a more compact form would be nice, as it can get quite long
<FromGitter> <Blacksmoke16> but not a big deal either way
<FromGitter> <naqvis> agree, but compact mean cryptic
<FromGitter> <naqvis> where one won't understand where the anchor will be taking to, by just looking at the URL
<FromGitter> <naqvis> well, there are pros and cons of each approach
<FromGitter> <Blacksmoke16> really just need the hash for overloads
<FromGitter> <Blacksmoke16> `type-name-overload_hash`
alexherbo2 has quit [Ping timeout: 265 seconds]
<FromGitter> <Blacksmoke16> usually overloads dont change the behavior, so wouldn't too bad
Human_G33k has joined #crystal-lang
HumanG33k has quit [Ping timeout: 256 seconds]
alexherbo2 has joined #crystal-lang
<jhass> hence my proposal to just hash the arg list, skip the return type (it doesn't participate in overloading in any way) and append it to the method name
<jhass> and have a prefix to the method name for class methods
<jhass> I think that covers everything
<jhass> the URL has still all the relevant info, type and method name
<jhass> anybody that says they recognize two different overloads from the current URLs I don't believe
<FromGitter> <Blacksmoke16> ^
<jhass> hence I'd even argue a hash might improve URL readability, easier to see it differs between two overloads
<jhass> (a short hash)
Human_G33k has quit [Ping timeout: 246 seconds]
deavmi has quit [Quit: Eish! Load shedding.]
deavmi has joined #crystal-lang
hightower3 has joined #crystal-lang
<hightower3> Hey oprypin fixed the `uname -s` thing in bindgen. If you still have the checkout ready and could run it again to possibly report another error that'd show up in windows platform, that'd be great.
HumanG33k has joined #crystal-lang
<raz> this looks cool, every crystal orm should have a DBML -> model.cr converter
<FromGitter> <Blacksmoke16> https://app.quickdatabasediagrams.com/#/ i like this one better imo
<FromGitter> <Blacksmoke16> for quick modeling stuff
<raz> yeh, there's a bunch of tools in that vein
<raz> anyway, what's really missing is an ORM that just automatically reflects on the db
<raz> and proper diffing (no migrations)
<raz> almost 50 years of RDBMS history and we still manage schemas / orm mappings like in the stone age
<hightower3> there's also pgModeler
<raz> yeh, but that's all sticks & stones
<raz> feels like writing an book given only a casio watch interface with 4 buttons and a blinking 00:00
<hightower3> in Ruby there's minirecord .. Still not at final level of sophistication, but at least in that direction
<hightower3> or mini_record rather
<raz> yeh there's many half-hearted attempts in that direction. but nothing serious.
<raz> sqlalchemy also has auto-migrations to a degree, etc. but that's not even half of the story
<raz> frameworks should ship with a GUI like what blacksmoke posted. not only to create an initial SQL snippet, but also to modify the db later. where modifications automatically generate the diff-migration to be shipped around and applied later. and all model files should be optional, with a basic auto-generated crud interface being the default.
<raz> but nobody pays for the year(s) of development to finish such a thing. so we keep our sticks & stones. and sometimes paint them a different color and pretend that's progress.
<raz> ...and everyone builds the same basic CRUD screens, form validations, signup process, etc. over and over. for every app. only to eventually apply a slightly different stylesheet to it than for the previous app. an endless cycle of job security.
<FromGitter> <kinxer> @Blacksmoke16 I don't think it's pertinent to the thread, but I don't think `#&//` usually makes sense. People will almost always be using `Int#//(other : Int)`, which will never overflow. `#//` could overflow for a Float argument, but I feel like you'd almost always want the exception in that case.
<FromGitter> <Blacksmoke16> https://play.crystal-lang.org/#/r/93fg
<FromGitter> <Blacksmoke16> now granted idk if thats just some one off logic for that method, or actually using the overflow stuff `+` and `-` etc use
<FromGitter> <kinxer> Ah... Negative numbers with unsigned integers. Gotcha.
<FromGitter> <kinxer> Is there an actual use case for having a negative modulus?
<FromGitter> <Blacksmoke16> :shrug:
travis-ci has joined #crystal-lang
<travis-ci> crystal-lang/crystal#7f13250 (master - Make IO#skip IO#write returns the number of bytes it skipped/written (#9233)): The build passed. https://travis-ci.org/crystal-lang/crystal/builds/688520416
travis-ci has left #crystal-lang [#crystal-lang]
<DeBot> https://github.com/crystal-lang/crystal/pull/9233 (Make IO#skip IO#write returns the number of bytes it skipped/written)
travis-ci has joined #crystal-lang
travis-ci has left #crystal-lang [#crystal-lang]
<travis-ci> crystal-lang/crystal#445b993 (master - [Docs] Fix source_url_pattern with canonical repo name (#9305)): The build passed. https://travis-ci.org/crystal-lang/crystal/builds/688520737
<DeBot> https://github.com/crystal-lang/crystal/pull/9305 ([Docs] Fix source_url_pattern with canonical repo name)
travis-ci has joined #crystal-lang
<travis-ci> crystal-lang/crystal#7b9069f (master - Implement Process(env:) on Windows and add more Env specs (#9310)): The build passed. https://travis-ci.org/crystal-lang/crystal/builds/688524614
travis-ci has left #crystal-lang [#crystal-lang]
<DeBot> https://github.com/crystal-lang/crystal/pull/9310 (Implement Process(env:) on Windows and add more Env specs)
<FromGitter> <kinxer> Am I remembering correctly that the LLVM debugging work should be in the next release?
<FromGitter> <Blacksmoke16> been waiting *ages* of `0.35.0` :p
<FromGitter> <Blacksmoke16> for*
<FromGitter> <kinxer> Yeah. I'm trying to figure out how to use Valgrind with a Crystal executable (as someone with limited experience with Valgrind), and my main issue right now is that callgrind seems to have access to only the locations of functions, not their names...
<FromGitter> <kinxer> Looking through that thread, I can't see anything to indicate that the debugger stuff will definitely fix that, but it might.
<FromGitter> <Blacksmoke16> try against master?
<FromGitter> <kinxer> I usually use an RPM distribution of Crystal... Is the easiest way to do that with Docker, or should I clone the compiler and build it?
<FromGitter> <kinxer> That is, the easiest way to use master.
<FromGitter> <Blacksmoke16> well you could use the nightly docker image
<FromGitter> <Blacksmoke16> hop in the container with bash shell/volume?
<FromGitter> <kinxer> I'm also relatively unpracticed with Docker... Would that be `docker pull crystallang/crystal:nightly`?
<FromGitter> <kinxer> And then create a container with that image and run it with a bash shell and mount point?
<FromGitter> <Blacksmoke16> mm try like `docker run -it crystallang/crystal:nightly bash`
<FromGitter> <Blacksmoke16> optionally could add a `-v $PWD:/app -w /app` if you wanted to use an external edit and then run it within the container
<travis-ci> crystal-lang/crystal#40be93b (master - Followup of #9134. Missing swap of arguments (#9303)): The build passed. https://travis-ci.org/crystal-lang/crystal/builds/688526976
travis-ci has joined #crystal-lang
travis-ci has left #crystal-lang [#crystal-lang]
<DeBot> https://github.com/crystal-lang/crystal/pull/9134 (Refactor to standardize on first argument for methods receiving `IO`) | https://github.com/crystal-lang/crystal/pull/9303 (Followup of #9134. Missing swap of arguments)
<FromGitter> <Blacksmoke16> random idea i had at some point
<FromGitter> <Blacksmoke16> ability to control whether an object is truthy
<FromGitter> <Blacksmoke16> ```code paste, see link``` ⏎ ⏎ Thus allowing stuff like this [https://gitter.im/crystal-lang/crystal?at=5ec2eb9c940fa238d6fed79a]
<FromGitter> <Blacksmoke16> but probably not much more helpful than just `if obj.truthy?`
<FromGitter> <Blacksmoke16> and would be quite confusing to debug like `if obj || other_obj`
kradnoel has joined #crystal-lang
kradnoel has quit [Read error: Connection reset by peer]
<FromGitter> <kinxer> Ah... I've been using `--release`, and that stripped the names from things.
<FromGitter> <kinxer> It works without it, but I feel like I can't entirely trust the profiling if I can't use `--release` with it...
<FromGitter> <Blacksmoke16> try adding `--debug`
HumanG33k has quit [Ping timeout: 265 seconds]
<FromGitter> <kinxer> I was using `--release --debug`. I'm seeing if switching the order makes any difference.
<FromGitter> <kinxer> Also, interesting, I'm timing two different prime generators (simple ones), and on is consistently faster with just `--release` (about 10% faster) but is about 50% as fast when using `--debug` (even with `--release`).
zorp_ has joined #crystal-lang
zorp has quit [Ping timeout: 265 seconds]
_ht has quit [Remote host closed the connection]
<FromGitter> <kinxer> The method that's faster with just `--release` uses about 3 times as many array accesses (41 million vs 13 million), but no calls to `Math.sqrt` (which the other method calls about 13 million times). It's interesting to me that the array accesses are able to be optimized somehow much more than the square root call.
<raz> Blacksmoke16: i hate code that relies on truthiness. explicit .nil? ftw.
<raz> these `if foo` checks are all fun and games. until a boolean enters the picture.
postmodern has joined #crystal-lang
<FromGitter> <Blacksmoke16> pretty much yea
<raz> less of an issue in crystal admittedly (nil usually needs extra care anyway). but in ruby i see those "tri-state" booleans blow up fairly regularly.
<FromGitter> <kinxer> Re profiling, it turns out I have to compile the executable statically to get the method names.
<FromGitter> <kinxer> Or, well, that's what I suspect. I had to compile it statically anyway just to run it through valgrind on my host machine after compiling in the docker container, and no combination of `--release` and `--debug` seems to work when compiling on my host machine with `0.34.0`.
<FromGitter> <kinxer> So short of cloning the compiler and building it myself, I don't really have a good way of knowing if it's the newer compiler or the static compilation until `0.35.0` rolls out.
<FromGitter> <Blacksmoke16> cant use docker?
<FromGitter> <Blacksmoke16> can use the nightly alpine image to build it statically there
<FromGitter> <kinxer> I mean, the static compilation works with the nightly container. What I was saying was that in order to compile in the container and run the executable on my host (through valgrind) I needed to statically compile on the docker container, which means that I can't necessarily tell whether I was getting function names from the static compilation or the newer compiler.
<FromGitter> <kinxer> I'm gonna try installing valgrind on the container and running it there.
<FromGitter> <Blacksmoke16> ah gotcha
<FromGitter> <Blacksmoke16> and yea, would have to build the compiler locally
<FromGitter> <Blacksmoke16> that would work too
cloaked1 has quit [Quit: http://quassel-irc.org - Chat comfortably. Anywhere.]
<FromGitter> <kinxer> Okay, so after running valgrind on the container, it looks like it's the compiler emitting names and stuff. So profiling with callgrind should work in 0.35.0. I'll probably reply to that thread to that effect.
<FromGitter> <kinxer> And it works with `--release`.
Mikaela has quit [Ping timeout: 260 seconds]
Mikaela has joined #crystal-lang
alexherbo2 has quit [Ping timeout: 260 seconds]
<FromGitter> <Blacksmoke16> nice
zorp_ has quit [Ping timeout: 260 seconds]
postmodern_ has joined #crystal-lang
postmodern has quit [Ping timeout: 246 seconds]
<FromGitter> <Blacksmoke16> https://github.com/crystal-lang/crystal/pull/9317 🎊