RX14 changed the topic of #crystal-lang to: The Crystal programming language | http://crystal-lang.org | Crystal 0.26.1 | 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> <girng> well to be fair to my level of comprehension, there is nothing u have to wrry about πŸ˜‚
<FromGitter> <drosehn> So if I've figured this out correctly, crystal has two nice ways to check whether individual flag values have been set. Is there a nice terse way to set or unset the flags? ⏎ In: https://carc.in/#/r/4ulm
<FromGitter> <drosehn> Is there a cleaner-looking way to set a flag than `user_wants |= ShowFields::S_Ownr` ? ⏎ and to unset a flag than `user_wants &= ~ShowFields::S_Ownr` ?
<FromGitter> <girng> what does |= and &= do?
<FromGitter> <drosehn> It'd be nice to support something like `user_wants.s_ownr = true` and `user_wants.s_ownr = false`, for instance.
<FromGitter> <drosehn> Those are how you turn one-bit on and one-bit off in a set of bits.
<FromGitter> <drosehn> `user_wants |= ShowFields::S_Ownr` is saying "take the current value of `user_wants`, and make sure the flag named `ShowFields::S_Ownr` is turned on"
<FromGitter> <drosehn> `user_wants &= ~ShowFields::S_Ownr` is saying "first take the value of `ShowFields::S_Ownr`, and then negate that value (so you have a value which is all the flags *except* `ShowFields::S_Ownr` turned on), and then bitwise-and that value to the current value of `user_wants`. This has the effect of turning off `ShowFields::S_Ownr` without changing any of the other flags.
<FromGitter> <girng> wow O_o, interesting, thanks for explaining
<FromGitter> <girng> i've seen that |= and &= before but just never really knew what it was doing lol
<FromGitter> <drosehn> disclaimer: I still might be missing something, and there's already a nicer way to turn those flags on and off. But I think that's at least enough so you can get an idea of what the difference is between "plain enums" and "@[Flag] enums".
DTZUZO has quit [Read error: Connection reset by peer]
<FromGitter> <asterite> I think enums started as something exclusive to C bindings, and then we moved them into the language. I agree that in Crystal they are not very useful... I never use them in personal code. Maybe we could remove them or rethink them to simplify the language.
<FromGitter> <drosehn> (mind you: I only spent time on this because it's still awfully hot and humid outside, and I've been putting off the trip home. I really should leave soon though)
<FromGitter> <drosehn> It might not take much to make them much nicer-looking for pure-crystal code. If I had a better understanding of macros I might try that.
DTZUZO has joined #crystal-lang
ashirase has quit [Ping timeout: 246 seconds]
ashirase has joined #crystal-lang
ashirase has quit [Ping timeout: 245 seconds]
<FromGitter> <bew> Aaaand there's a new music named Crystal :p With a nice description: Being different is like
<FromGitter> <bew> Grr
<FromGitter> <bew> Being different is like being a Crystal, unique & beautiful ✨
ashirase has joined #crystal-lang
ashirase has quit [Ping timeout: 245 seconds]
ashirase has joined #crystal-lang
ashirase has quit [Ping timeout: 250 seconds]
return0e has quit [Remote host closed the connection]
return0e has joined #crystal-lang
ashirase has joined #crystal-lang
fifr has quit [Ping timeout: 255 seconds]
ashirase has quit [Ping timeout: 246 seconds]
bds has joined #crystal-lang
ashirase has joined #crystal-lang
fifr has joined #crystal-lang
ashirase has quit [Ping timeout: 246 seconds]
ashirase has joined #crystal-lang
fifr has quit [Ping timeout: 246 seconds]
bds has quit [Ping timeout: 245 seconds]
fifr has joined #crystal-lang
<FromGitter> <drosehn> Hmm, wait. structs in crystal are immutable, aren't they?
<FromGitter> <codenoid> ```var = false (call a function with return as bool) ⏎ until var ⏎ # do something ⏎ end``` ⏎ ⏎ hi, is until will call `var` "until" the `var` value is `true` ? [https://gitter.im/crystal-lang/crystal?at=5b877121d457a1406c810f61]
_whitelogger has joined #crystal-lang
<FromGitter> <girng> yeah
<FromGitter> <girng> sometimes i accidentally type struct instead of class lmao. i just replace struct with class and it fixes it
<FromGitter> <girng> You know, I was doing some thinking today. I would like to dedicate a moment of silence (length of reading this) to thank this awesome community and especially the lead devs and contributors for maintaining and developing crystal. I honestly don't know where I would be right now. Lost in my js code in nodejs, not understanding object orientation as much as I do now, and other stuff this community has taught me
<FromGitter> ... over the past 8+months. It's truly appreciated, and I am grateful for it all from the bottom of my heart.
sz0 has joined #crystal-lang
<FromGitter> <bew> Struct are not necessarily immutable, but you can use them without setter, which make them kinda immutable
<FromGitter> <bew> And when you pass a struct to a function it'll always make a copy
<FromGitter> <bew> You welcome @girng ;) we're happy to see you learn! (now go learn git, pleaaase! ^^)
DTZUZO has quit [Ping timeout: 240 seconds]
<FromGitter> <codenoid> cool
<FromGitter> <vegai> @j8r oh, right, thanks for the stylish reminder
<FromGitter> <vegai> ameba complains about those still, though :)
<FromGitter> <vegai> gotta fix'em
<FromGitter> <ninetailschris> Weird issue with trying to add to int32 or int64 from modal. It works when you use a = p.credits.to_s.to_i32 + 150. But I can't seem to find the underlying issue.
<FromGitter> <j8r> @vegai thank you, even unintentionally, to point this out. Maybe you are right to bring your own style, I'm asking in #6621 what people thinks about style enforcement
<FromGitter> <vegai> I’m all for 100% style enforcement personally
<FromGitter> <vegai> but I can accept a linter tool like ameba as a compromise
<FromGitter> <vegai> a linter tool has the benefit of potentially giving recommendations that have nothing to do with style
<FromGitter> <icyleaf> Hi guys, i had a problem with instance with `Class` class, anyone knows how to solve? https://play.crystal-lang.org/#/r/4uno
<FromGitter> <j8r> @icyleaf https://play.crystal-lang.org/#/r/4unp , you have to use something immutable
<FromGitter> <j8r> because else I guess there will be an union
<FromGitter> <icyleaf> How about If the variable is `Hash`, i rollback to get passed variable: https://github.com/icyleaf/halite/commit/c3862af47d2d2184215ef5451a477df28720646e
<FromGitter> <icyleaf> @j8r i updated some comments on that commit.
Raimondii has joined #crystal-lang
<FromGitter> <j8r> Is there a dev branch with specs that you wish to pass? I will see more clearly what you want to have πŸ˜„
ashirase has quit [Ping timeout: 240 seconds]
<FromGitter> <icyleaf> wait a moment. :)
Raimondi has quit [Ping timeout: 240 seconds]
Raimondii is now known as Raimondi
ashirase has joined #crystal-lang
<FromGitter> <j8r> Anyway I've just migrated one of my project from Crest to Halite, and starred it yesterday :) The difference was mainly type safety, `.get` vs `:get`
<FromGitter> <icyleaf> dev branch: https://github.com/icyleaf/halite/tree/test/feature-instance-variable and run `crystal spec spec/halite/features_spec.cr`
<FromGitter> <icyleaf> @j8r i found you starred Halite yesterday πŸ˜† welcome any issues.
<FromGitter> <j8r> other thing totally unrelated, better to have images non versioned, at least put same in a dedicated branch that will have no history kept. Because each time you change the image this will increase the repo size (the old one kept in history + the new one). ⏎ Thanks for the branch, just fork the project
<FromGitter> <icyleaf> You are right, i noted it to todo list.
<FromGitter> <icyleaf> In fact, history only apply in redirect with 30x status code. i think i store the response early.
<FromGitter> <j8r> hum I think you can't do because of the `.class`
<FromGitter> <j8r> you have to find a way to replace this `Feature.class` to `Feature`, and then you will be able to `.new`
<FromGitter> <j8r> the problem is that `Feature` in an abstract class
<FromGitter> <icyleaf> history issue was fixed: https://github.com/icyleaf/halite/pull/34
<FromGitter> <vladfaust> Why can't I define an empty `alias MyNamedTuple = NamedTuple()`? I have method `foo(**values : MyNamedTuple)`, and `MyNamedTuple` may be empty (it's generated in macros)
<FromGitter> <vladfaust> Turns into `expecting token 'CONST', not ')'`
<FromGitter> <vladfaust> I think it's OK for `foo` to accept no arguments when `MyNamedTuple` is empty
<FromGitter> <icyleaf> @j8r I does simlar stuff in Salt, it passed options directly, i can’t use it again, because complier told me use a more specific type with NamedTuple. https://github.com/icyleaf/salt/blob/master/src/salt/middlewares.cr#L9
<FromGitter> <icyleaf> @vladfaust method argument accepts no specific type with NamedTuple and Hash (pass `_`), but the other neither do it.
<FromGitter> <vladfaust> @icyleaf sorry, I don't understand what you mean
<FromGitter> <icyleaf> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b87bed9c2bd5d117af32b20]
return0e has quit [Remote host closed the connection]
return0e has joined #crystal-lang
<FromGitter> <vladfaust> Ah, I get it, thanks!
<FromGitter> <j8r> @icyleaf I will dig more on this later. I think the `@@features = {} of String => Feature.class` in the `Features` module approach may be the wrong one, maybe find another way
<FromGitter> <j8r> I didn't know we could have class variable in modules, but that makes sense to be able to do it
<FromGitter> <icyleaf> @j8r Thanks for helping, i will try different ways.
<FromGitter> <icyleaf> For now, middlewares in Halite are works but not friendly for developer.
<FromGitter> <vladfaust> Why doesn't this work? https://carc.in/#/r/4uok
<FromGitter> <bew> Not sure you can do that, but that would be nice i think! You can still use a macro like that:
<FromGitter> <bew> https://carc.in/#/r/4uom
<FromGitter> <vladfaust> That's ugly
<FromGitter> <vladfaust> And it wouldn't work with generic types I guess
<FromGitter> <bew> Hmm agree that's quite ugly
<FromGitter> <rishavs> How can I respond with a json in my http server? I am struggling with writing the json to the response io ⏎ I am assuming something like; ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b87cea14be56c5918b82f93]
return0e has quit [Ping timeout: 240 seconds]
return0e has joined #crystal-lang
<FromGitter> <vegai> I know this is not classy
<FromGitter> <vegai> but I was about to port that scanner thing I showed earlier into rust
<FromGitter> <vegai> and noticed that they don’t have a way to read a single utf8 character from an IO stream
<FromGitter> <rishavs> I have also tried; ⏎ ⏎ ```code paste, see link``` ⏎ ⏎ but the repsonse in my browser shows `""` [https://gitter.im/crystal-lang/crystal?at=5b87d569ac25fd11b5b67613]
<FromGitter> <j8r> why the ticks ```?
<FromGitter> <vladfaust> Ticks would call system proc
<FromGitter> <vladfaust> It's usually used like `echo "foo"` - system calls
<FromGitter> <vladfaust> Damn gitter
<FromGitter> <j8r> The ticks aren't to call a subprocess, `Process.run`?
<FromGitter> <rishavs> I am using the ticks for the string interpolations
<FromGitter> <vladfaust> @j8r is right
<FromGitter> <vladfaust> Use `%Q[{"status": "success"}]`
<FromGitter> <rishavs> so i can write stuff like `context.response.write (`{"status": "success", "data": {"type": "#{animal.type}", "taste": "#{animal.taste}" }`)
<FromGitter> <j8r> @rishavs use `%({"status": "success"})` instead, ticks calls Process.run
<FromGitter> <vladfaust> You don't need to call `.to_json` if the string is already json
<FromGitter> <j8r> for example, if you do `puts `echo $SHELL``
<FromGitter> <rishavs> holy crap, i think i just again got confused with JS strring interpolation.....
<FromGitter> <vladfaust> So you either do `ctx.response.print(%Q[{"status": "success"}])` or `ctx.response.print({"status": "success"}).to_json)`
<FromGitter> <rishavs> in JS i use strings as ⏎ ⏎ ````something ${else}```` [https://gitter.im/crystal-lang/crystal?at=5b87d685cff55e5617807a68]
<FromGitter> <rishavs> my bad. thanks guys. working on the frontend and backend at the same time can be hell on the brain >.>
<FromGitter> <j8r> how you print ticks in gitter?
<FromGitter> <rishavs> I use the 4 ticks as enclosure
<FromGitter> <rishavs> ```````
<FromGitter> <j8r> Thanks @rishavs , `` puts `echo $SHELL; puts %(echo $SHELL)` ``
<FromGitter> <vladfaust> Btw, `ctx.response.print(%Q[{"status": "success"}])` should be much faster
<FromGitter> <j8r> what's the difference between `%()` and `%Q[]`?
<FromGitter> <vladfaust> I meant compared to `{"status": "success"}.to_json`
<FromGitter> <bew> Checkout "percent string literal" section in https://crystal-lang.org/docs/syntax_and_semantics/literals/string.html
<FromGitter> <j8r> oh yeah
<FromGitter> <bew> @j8r but performance wise there is no difference between any percent string literals
<FromGitter> <bew> Unless you have interpolation inside
<FromGitter> <j8r> so `%Q` is a sort of alias or `%`?!
<FromGitter> <bew> Look at the end of the section i mentioned before
<FromGitter> <bew> It means that for example `\n` won't be
<FromGitter> <bew> Wait
<FromGitter> <bew> Ah yes
<FromGitter> <bew> No idea why `%Q` exist
DTZUZO has joined #crystal-lang
<FromGitter> <j8r> certainly a no brain import from ruby πŸ˜„
<FromGitter> <bew> Yeah probably
Groogy has joined #crystal-lang
Groogy has quit [Quit: WeeChat 2.2]
<FromGitter> <j8r> @icyleaf what is exactly Features` and `Feature`?
return0e has quit [Remote host closed the connection]
<FromGitter> <vladfaust> How could I call the same-named method with empty splat arguments? https://carc.in/#/r/4upv
<FromGitter> <vladfaust> I cannot do `foo(clause, nil)` because params would be `{nil}`, which may be considered as valid argument
<FromGitter> <vladfaust> I doubt if it's possible to call a method with empty splat params at all
<FromGitter> <vladfaust> Yes, it's impossible, no problem then
<FromGitter> <vladfaust> Where can one get a list of all possible macro instance vars (e.g. `@type`)?
return0e has joined #crystal-lang
<z64> @vladfaust they are only `@type` and `@def`. i can show you in a second
zorp has joined #crystal-lang
<FromGitter> <vladfaust> Thanks man!
<z64> no problem
Groogy has joined #crystal-lang
Groogy has quit [Quit: WeeChat 2.2]
<FromGitter> <talbergs> Hello, if I wanted to add a few methods/properties to `HTTP::Server::Context` how would that be done, so `kemal` upon that object crietion would create my version of `HTTP::Server::Context` ?
<FromGitter> <vladfaust> @talbergs ⏎ ⏎ ```class HTTP::Server ⏎ class Context``` [https://gitter.im/crystal-lang/crystal?at=5b87ef14ac25fd11b5b71c27]
<FromGitter> <vladfaust> It's called "monkey patching"
Groogy has joined #crystal-lang
<FromGitter> <talbergs> Yes. Thank you!
<jokke> hey o/ anyone here using vim to write crystal? I'm using neomake and i'm super unsatisfied with the error output of it. it's always just a line saying "instanciating 'Foo#bar()'" without any further details. Is there any way to have more verbose or more precise error messages in vim?
alex`` has quit [Quit: WeeChat 2.2]
<FromGitter> <talbergs> I use neovim this deoplete plugin.
<FromGitter> <talbergs> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b87f1fbf5402f32aab253ae]
<FromGitter> <talbergs> not satisfied eather.
<FromGitter> <talbergs> 1) ```call minpac#add('rhysd/vim-crystal') " crystal lang syntax & more ⏎ call minpac#add('yoru/deoplete-crystal') " crystal + cracker ⏎ ⏎ `````` [https://gitter.im/crystal-lang/crystal?at=5b87f256f5402f32aab2566c]
<jokke> but isn't deoplete just completion?
<jokke> yeah vim-crystal is what i'm using too
<FromGitter> <talbergs> yes intelligent completion is wip. I type it all out still. =/
<jokke> i mean it's better than no compile time checks at all but it's annoying to see that your code has an error and then having to run crystal build on the file yourself from the command line to see the what the error actually is
<FromGitter> <talbergs> hm `ale` shows me few errors on :au bufwrite.
<jokke> ale?
<FromGitter> <talbergs> i gotta really dig around my dotfiles now, can't find where is it happening.
<FromGitter> <talbergs> no, can't do no luck ^^. You'll need to poke around my dotfiles it's there somewhere.
<jokke> niiice. neomake has ameba integration
bds has joined #crystal-lang
<bds> Hello, I have a Kemal controller action that receives a HTTP POST from Slack. I want to reply to the request as soon as possible and do the work processing the event asynchronously. I am new to using `spawn` and it seems to work - is this correct?
<bds> post "/events" do |env|
<bds> raw_event = env.params.json
<bds> spawn do
<bds> end
<bds> end
<bds> EventHandler.call(raw_event)
<FromGitter> <vladfaust> Yes, it is, @bds
<FromGitter> <bds> @vladfaust ty! :)
<FromGitter> <codenoid> hi
<FromGitter> <codenoid> how to use bcrypt generate in crystal
<FromGitter> <codenoid> and bcrypt verify
<FromGitter> <codenoid> i'm not sure with this
<FromGitter> <codenoid> https://crystal-lang.org/api/0.26.1/Crypto/Bcrypt/Password.html#%3D%3D%28password%3AString%29%3ABool-instance-method
<FromGitter> <fridgerator> save `password.to_s` (from that example) in your database, when you want to check against a user supplied password, do `Crypto::Bcrypt::Password.new(@saved_password) === the_password_to_check`
<FromGitter> <codenoid> right, the .new function load string hash
<FromGitter> <codenoid> thankyou nick
<FromGitter> <fridgerator> `==`, not `===`. I've been writing too much javascript
<FromGitter> <codenoid> haha
<FromGitter> <codenoid> btw ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b880bef4be56c5918b9c399]
<FromGitter> <codenoid> undefined constant `Time::Kind::Utc` in crystal 0.26.1
<FromGitter> <codenoid> what is replacement for `Time::Kind::Utc`
<FromGitter> <codenoid> `Time::Location::UTC`
<FromGitter> <codenoid> thank you
Yxhuvud has joined #crystal-lang
<FromGitter> <codenoid> crystal syntax makes me horny
<FromGitter> <fridgerator> thats..... good?
<FromGitter> <ryanprior> thats.....unnecessary
<FromGitter> <rishavs> > `==`, not `===`. I've been writing too much javascript ⏎ ⏎ same here. I am getting confused between their syntaxes
<FromGitter> <j8r> 🀘
<FromGitter> <codenoid> `undefined method '[]' for BSON::Code` when accessing `mongo_row_doc["parent_key"]["child_key"]`
<FromGitter> <codenoid> what is simple way to access that
akaiiro has quit [Ping timeout: 246 seconds]
akaiiro has joined #crystal-lang
ua has quit [Ping timeout: 246 seconds]
ua has joined #crystal-lang
alex`` has joined #crystal-lang
bds has quit [Ping timeout: 252 seconds]
DTZUZO has quit [Ping timeout: 252 seconds]
<FromGitter> <rishavs> has anyone done any image scraping in crystal? particularly getting the most representative image from a web page (like reddit and facebook do)
akaiiro has quit [Ping timeout: 246 seconds]
<FromGitter> <codenoid> i do @rishavs
<FromGitter> <codenoid> how to convert JSON::Any to hash in crystal,
<oprypin> codenoid, what version of crystal?
<FromGitter> <rishavs> @codenoid can i go through the code that you use?
<FromGitter> <codenoid> 1) 26.1
<FromGitter> <codenoid> stuck for 1 hours, just to convert from JSON::Any to Hash (with no JSON::Any)
<FromGitter> <codenoid> @rishavs i just use HTTP::Client and Selenium
<FromGitter> <rishavs> oh
<oprypin> codenoid, you just can't do that
<oprypin> i mean not possible
<FromGitter> <codenoid> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5b8843549c71d363c150bd62]
<FromGitter> <girng> @bew :)
<FromGitter> <codenoid> so,,
GoldenBear has quit [Quit: ZNC 1.6.6+deb1 - http://znc.in]
GoldenBear has joined #crystal-lang
<FromGitter> <girng> @codenoid forgot comma :D
<FromGitter> <codenoid> @girng this https://play.crystal-lang.org/#/r/4urz :(
<FromGitter> <bew> @codenoid you can't do what you want using JSON.parse, without a lot of pain
<FromGitter> <girng> @codenoid https://play.crystal-lang.org/#/r/4us0
<FromGitter> <girng> BOOM :D
<FromGitter> <codenoid> :O
<FromGitter> <bew> I suggest you to use https://crystal-lang.org/api/0.26.1/JSON/Serializable.html (the new json mapping system) to create classes from a json
<FromGitter> <codenoid> <3 @girng ⏎ ok @bew i'll use it right now
<FromGitter> <girng> there is also this site @codenoid that generates the class stuff from json but i forgot what it was called so u don't have to write all those properties
<FromGitter> <girng> but i think it's different now since serializable is a thing now??
<FromGitter> <girng> depreciated?
akaiiro has joined #crystal-lang
<z64> reminds me, i did this dumb thing a while ago :) https://github.com/z64/api_mapper
<FromGitter> <girng> man whenever i itch my eye it stings and gets all watery wtf...
<FromGitter> <girng> @z64 interesting
<FromGitter> <girng> ```io = if filename ⏎ File.open(filename, "w") ⏎ else ⏎ STDOUT ⏎ end``` ⏎ ⏎ we can assign if condition to a variable? [https://gitter.im/crystal-lang/crystal?at=5b884f2494f8164c17c1c733]
<FromGitter> <girng> what is `io`, whatever the if block returns?
<FromGitter> <girng> never seen a variable used like this before, i thought it could only work if it's doing `io = methodname()` or something lol
<z64> yes, its whatever the `if` returns
<FromGitter> <girng> that's cool
<FromGitter> <snadon> is it possible to concatenate two `String?` together? I tried inside an `if first && last ... end` but still getting the String | Nil error
<FromGitter> <snadon> an example: https://play.crystal-lang.org/#/r/4ut3
<FromGitter> <snadon> i'm probably missing something, i thought it would compile if i check it is not Nil before doing anything
<FromGitter> <Timbus> the thing you are missing is that .name is a method call, so you have no guarantees that it is not nil even after you check. what if .name returned a random value? what if .name was set to a different value in another thread?
<FromGitter> <Timbus> you want `if name = mob.name`
<FromGitter> <Timbus> then use `name`
DTZUZO has joined #crystal-lang
hightower2 has joined #crystal-lang
<FromGitter> <snadon> thank you! it makes perfect sense
akaiiro has quit [Ping timeout: 244 seconds]
johndescs has quit [Ping timeout: 240 seconds]
johndescs has joined #crystal-lang
hightower2 has quit [Ping timeout: 240 seconds]
<FromGitter> <docelic_gitlab> @papierkorb: does bindgen try to compile the original library before generating bindings for it?
<FromGitter> <ninetailschris> Looking into Time class docs and don't see why I would have this error with Time.parse https://carc.in/#/r/4utk. Any ideas?
<FromGitter> <docelic_gitlab> ninetailschris: sure, as the message tells you you're missing the third argument (location)
<FromGitter> <Sija> @ninetailschris `Time.parse` API changed in v0.26.0, from this version on you’d need to pass a `Time::Location` or use `Time.parse!`
<FromGitter> <docelic_gitlab> this was added in 0.25.0
<FromGitter> <Sija> See #6369
<FromGitter> <ninetailschris> Thank you. I solved it :)
<FromGitter> <vladfaust> @asterite, could you please help? I have to resolve type from `Assign` when it's `var = [] of Type`. I got to ⏎ ⏎ ```code paste, see link``` ⏎ ⏎ But there is no `StringLiteral#resolve` method. I need `type` to be resolved. `.id` doesn't work too, because one cannot resolve `MacroId`. ... [https://gitter.im/crystal-lang/crystal?at=5b887e95ac25fd11b5ba83e9]
zorp has quit [Ping timeout: 252 seconds]