jhass changed the topic of #crystal-lang to: The Crystal programming language | https://crystal-lang.org | Crystal 0.35.1 | Fund Crystal's development: https://crystal-lang.org/sponsors | GH: https://github.com/crystal-lang/crystal | Docs: https://crystal-lang.org/docs | Gitter: https://gitter.im/crystal-lang/crystal
<FromGitter> <Daniel-Worrall> Can I deconstruct variable names in a proc? Something like `["a","b"].each.with_index.reject(&->((i : String,j : Int32)){i == "a" || j == 3}).to_a`
<FromGitter> <Blacksmoke16> mm prob not
<FromGitter> <Daniel-Worrall> What does `!yield` do?
<FromGitter> <Blacksmoke16> same as `!var`
<FromGitter> <Blacksmoke16> but negating the return value of the yield
<FromGitter> <Daniel-Worrall> ahh
<FromGitter> <Daniel-Worrall> I was thinking too hard and assumed it was special syntax
<FromGitter> <Daniel-Worrall> Anyway, to my actual question. Can we use the 2nd yield arg when using the 1 liner block forwarding syntax? `hash.each(&.dosomethingwithvalue)`?
<FromGitter> <Daniel-Worrall> hashes yield 2 values instead of a tuple of key,value, only the key can be accessed this way
<FromGitter> <Daniel-Worrall> also means you can do `hash.each do |k,v|` instead of `hash.each do |(k,v)|`
<FromGitter> <Daniel-Worrall> although tuples autosplat anyway
<FromGitter> <Daniel-Worrall> actually, each yields a tuple
<FromGitter> <Daniel-Worrall> but select/reject yield 2 args
<FromGitter> <Daniel-Worrall> So I feel like this is a bug
<straight-shoota> indeed
<straight-shoota> >> {"foo" => "bar"}.select { |e| p! e; break }
<DeBot> straight-shoota: e # => "foo" - more at https://carc.in/#/r/a5o9
<straight-shoota> >> {"foo" => "bar"}.each { |e| p! e; break }
<DeBot> straight-shoota: e # => {"foo", "bar"} - more at https://carc.in/#/r/a5oa
<straight-shoota> that's certainly unexpected
<FromGitter> <Daniel-Worrall> Want me to PR?
<FromGitter> <Daniel-Worrall> I was using `.select(&.[](0).stuff)` and super confused about why I was getting a char lol
<FromGitter> <Blacksmoke16> raz you around?
<raz> si
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe1496eaa6bb528c3643768]
<FromGitter> <Blacksmoke16> ```def some_action ⏎ status = # ... ⏎ ⏎ self.view "foo", status: status ⏎ end``` [https://gitter.im/crystal-lang/crystal?at=5fe1498eaa6bb528c3643792]
<straight-shoota> @Daniel-Worrall sure, thanks :+1:
<straight-shoota> These method definitions are so old, maybe autosplat wasn't even a thing back then :D
<raz> blacksmoke: so `self.view "foo", status: status` would be the same as `return foo` (but override the status)? 🤔
<FromGitter> <Blacksmoke16> yes
<FromGitter> <Blacksmoke16> `ART:Response` are returned directly w/o invoking the view layer as before. `ART::View` object is a new thing that contains information about the response, but in a format agnostic way, scalar values are turned into an `ART::View` behind the scenes
<raz> 🤔
<raz> Blacksmoke16: https://t.ly/3Rfp
<FromGitter> <Blacksmoke16> `ART::View` and scalar types invoke the view layer which consumes it and some other data to return an `ART::Response`
<FromGitter> <Blacksmoke16> also sets things up a bit better for automatically calling the correct format handler based on the `Accept-*` header formats
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe14b2763fe0344960f9949]
<raz> yup, that should make my life complete. i mean, it hasn't been a big deal anyway - the only place where i want to override the status is for 200 vs 201 (more of an OCD concern than a real one). other codes come from exceptions.
<FromGitter> <Blacksmoke16> i.e. such as the thing straight-shoota wanted
<raz> yup, small step for me, big step for athena and others. there are certainly use-cases where being able to override that stuff in the method is crucial
<FromGitter> <Blacksmoke16> ill still trying to figure out to best fit your JSON API format thing into it tho
<straight-shoota> oh, what did I want?
<FromGitter> <Blacksmoke16> as like the view listener got a lot simpler
<FromGitter> <Blacksmoke16> that thing where you could have your shardbox api methods return a like hash/namedTuple of args and throw on a `@[Template("foo.crinja")]` and it just works
<straight-shoota> ah yes
<straight-shoota> FTR I also find it crucial that an action can set the status code
<FromGitter> <Blacksmoke16> its currently possible, but with some gotcha
duane has quit [Ping timeout: 256 seconds]
<FromGitter> <Blacksmoke16> atm it wasnt possible to dynamically determine and set the status code at runtime while within an action AND invoke the view layer
<FromGitter> <Blacksmoke16> it isnt*
<FromGitter> <Blacksmoke16> this adds in a third way to bridge that gap
<straight-shoota> meanwhile I think I hit a wasp nest while looking at #9339
<raz> oh the view listener works splendidly for me tho. this is the athena boilerplate that i use so far: http://ix.io/2J4U - all of it. less verbosity is ofc always welcome, but i'm fine with <100 loc of machinery.
<straight-shoota> there are at least four different iterators implementing very much the same thing: Range::StepIterator, Number::StepIterator, Int::DowntoIterator, Int::UptoIterator
<FromGitter> <Blacksmoke16> lovely
<raz> with that i can just return anything json-serializable or raise exceptions and it gets wrapped into json:api. plus clear validation errors get cleanly wrapped too.
<raz> could hardly be happier. athena ftw ♥️
<FromGitter> <Blacksmoke16> what i was getting at is the view listener doesnt actually do the same thing anymore
<raz> well, as long as it can do a similar thing, i'm fine ;)
<FromGitter> <Blacksmoke16> imo if you're not using any of the serializer component id just add this to the base controller type and call it a day, prob be a bit more efficient as well ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe14d9c22f12e449b0511e0]
<FromGitter> <Blacksmoke16> ofc maybe with a status arg
<raz> might work, i'll have to look into that. i know some reshuffling is coming up also with StreamedResponse etc.
<FromGitter> <Blacksmoke16> this way it wouldnt even need to invoke the view layer just to add a wrapping key
<raz> yup, i'll check it out in the next boilerplate refactor (i.e.: when the next athena update breaks my current impl :D)
<FromGitter> <Daniel-Worrall> Do we have any strict conventions on explicit brackets?
<FromGitter> <Daniel-Worrall> in the stdlib
<FromGitter> <Blacksmoke16> hm?
<FromGitter> <Daniel-Worrall> I see a lot of different things where sometimes the method calls have brackets and sometimes not
<FromGitter> <Daniel-Worrall> but I can't find any style choices on this
<FromGitter> <Blacksmoke16> ah you mean `()`?
<FromGitter> <Daniel-Worrall> yeah
<FromGitter> <Daniel-Worrall> e.g. `self[k] = yield k, self[k], v` `memo[k] = v unless yield k, v` `delete(key) if yield(key, value)`
<FromGitter> <Blacksmoke16> i personally dont use them most of the time
<FromGitter> <jrei:matrix.org> Me too yes
<FromGitter> <Daniel-Worrall> There's no consistency
<FromGitter> <jrei:matrix.org> Only when there are nesting
<FromGitter> <Blacksmoke16> only use them when i need call another method, or to make it more clear, i.e like `some_method 1, Foo.new 2, 3`
<FromGitter> <Blacksmoke16> should be `some_method 1, Foo.new(2), 3`
<FromGitter> <jrei:matrix.org> One issue is no difference between variable vs methods :/
<FromGitter> <jrei:matrix.org> Not new – this comes from Ruby
<FromGitter> <jrei:matrix.org> Anyway, we usually know this, and IDE can help – no big deal
<FromGitter> <Blacksmoke16> i been using `self.`a lot for methods lately
<FromGitter> <Daniel-Worrall> I know it works, I just don't like both being used 5 lines from the other
<FromGitter> <Daniel-Worrall> I'd rather stick to 1 style
<FromGitter> <Daniel-Worrall> Also seems you can't `yield {1, 2}`
<FromGitter> <Daniel-Worrall> you need the parenths
<FromGitter> <Blacksmoke16> thats expected, there are quite a few issues a bout it
<FromGitter> <Blacksmoke16> parser doesnt know if its a block or a tuple
<FromGitter> <Daniel-Worrall> is it for any method call?
<FromGitter> <franciscoadasme> hey everyone, I just stumbled on an edge case (I think) regarding enforcing abstract method impl.: ⏎ ⏎ ```code paste, see link``` ⏎ ⏎ is this expected behavior? [https://gitter.im/crystal-lang/crystal?at=5fe1518ce7f693041f245a23]
<FromGitter> <Blacksmoke16> its expecting a `def foo(val : Number)` method
<FromGitter> <Blacksmoke16> just having an int32 overload doesnt satisfy that
<FromGitter> <Blacksmoke16> nvm, that one doesnt fail
<FromGitter> <Blacksmoke16> last one fails if you move int32 above the number include
<FromGitter> <Blacksmoke16> compiler might be not actually seeing the `Number` one? :shrug:
<FromGitter> <franciscoadasme> so the `include A(Int32)` somehow overwrites the `A(Number)`?
<straight-shoota> seems to be like that
<straight-shoota> looks like a bug
<FromGitter> <franciscoadasme> I'll post an issue then... thanks
deavmi has quit [Ping timeout: 272 seconds]
deavmi has joined #crystal-lang
duane has joined #crystal-lang
<FromGitter> <Daniel-Worrall> Interestingly, master has failing specs for WSL2 ⏎ Finished in 2:13 minutes ⏎ 10285 examples, 5 failures, 2 errors, 6 pending
<FromGitter> <Daniel-Worrall> specifically ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe1593e4eba353cdfeff459]
<straight-shoota> those specs probably depend on some environment configuration that just doesn't match to what they expect
<straight-shoota> it works for me, though. also with WSL2
<FromGitter> <Daniel-Worrall> As in those specs pass?
<straight-shoota> yes, all green
<FromGitter> <Daniel-Worrall> huh
<straight-shoota> I think some user or group specs are failing though
<FromGitter> <Daniel-Worrall> There's a gh action for WSL it seems too
<straight-shoota> no, it's native windows
<FromGitter> <Daniel-Worrall> well, native windows with wsl
<straight-shoota> I don't hink wsl is involved
<FromGitter> <Daniel-Worrall> I don't mean in crystal
<FromGitter> <Daniel-Worrall> I just mean it exists in the world
<straight-shoota> ah okay
<FromGitter> <Daniel-Worrall> Though crystal *could* include it
<straight-shoota> what's the error message for those failing specs?
<FromGitter> <Daniel-Worrall> It's probably because I'm using `/mnt/c`
<straight-shoota> yes, that makes the file specs fail
<straight-shoota> NTFS doesn't support executable flag
<straight-shoota> I do all work inside WSL's file system
<straight-shoota> it's also available on windows as network share \\wsl$\Ubuntu
<FromGitter> <Daniel-Worrall> Hmm
<FromGitter> <Daniel-Worrall> Maybe I could symlink that
<straight-shoota> not sure about the openssl specs, but maybe a lib version issue
<FromGitter> <Daniel-Worrall> probably
<FromGitter> <Daniel-Worrall> Not like I update my WSL2 packages much
<straight-shoota> whats your `openssl version`?
<FromGitter> <Daniel-Worrall> `\wsl$\Ubuntu` doesn't seem to work for me
<straight-shoota> two backslashes at the start
<FromGitter> <Daniel-Worrall> `openssl/xenial-updates,xenial-security 1.0.2g-1ubuntu4.18 amd64 [upgradable from: 1.0.2g-1ubuntu4.16]`
<straight-shoota> if your WSL instance is named differently, you can find it at `\\wsl$\`
<FromGitter> <Daniel-Worrall> ty ty
<straight-shoota> 1.0.2g isn't the newest but it should technically be supported
<straight-shoota> maybe something broke it and there's no test against such an old version
<FromGitter> <Daniel-Worrall> I have ubuntu4.16, it wants to update to 4.18
<FromGitter> <Daniel-Worrall> I'll see if these minors fix anything
<FromGitter> <Daniel-Worrall> That's what I get for using ubu16
<straight-shoota> yeah, it's to be expected
<straight-shoota> but it's not really a big deal I suppose
<FromGitter> <Daniel-Worrall> yeah, I just need to ignore local failing specs
<FromGitter> <Daniel-Worrall> no big deal
<straight-shoota> I'm still on 16.04 on WSL1 on my laptop :D
<FromGitter> <Daniel-Worrall> ouch
<FromGitter> <Daniel-Worrall> Migrating is just zzz
<FromGitter> <Daniel-Worrall> Ooh, I'll probably get better speeds once I move my crystal to the wsl mount
<FromGitter> <Daniel-Worrall> There's a silly overhead for file access
<straight-shoota> yeah maybe
<FromGitter> <Daniel-Worrall> Aww yeah, I'm excited now
<straight-shoota> but I wouldn't expect much of a difference
<straight-shoota> WSL2 has really fast file access (compared to WSL1)
<FromGitter> <Daniel-Worrall> I was running my aoc benchmarks WSL2 against native windows bootstrapped, and I saw I was getting a 0.01something overhead for the file reads
<FromGitter> <Daniel-Worrall> but it was slower in general on windows
<FromGitter> <Daniel-Worrall> well, in most cases
f1reflyylmao has joined #crystal-lang
f1refly has quit [Ping timeout: 258 seconds]
duane has quit [Ping timeout: 268 seconds]
avane has quit [Quit: ZNC - https://znc.in]
avane has joined #crystal-lang
<FromGitter> <Blacksmoke16> theres also not a `join` `IO` overload for hash
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe17af62084ee4b78660cd3]
<FromGitter> <Blacksmoke16> key/value get yielded as a tupel, so not terrible i guess
<FromGitter> <Daniel-Worrall> ye
<FromGitter> <Blacksmoke16> `{ |(k, v), io| io << "#{k}=#{v}" }`
<FromGitter> <Blacksmoke16> can do this so nvm
DTZUZU_ has joined #crystal-lang
DTZUZU has quit [Read error: Connection reset by peer]
DTZUZU has joined #crystal-lang
DTZUZU_ has quit [Ping timeout: 260 seconds]
<FromGitter> <Blacksmoke16> wtb `compact_map_with_index` :S
<FromGitter> <Daniel-Worrall> original index or index after compact
<FromGitter> <Blacksmoke16> thats prob why it doesnt exist ha
<FromGitter> <Daniel-Worrall> https://carc.in/#/r/a5p9
<FromGitter> <Daniel-Worrall> idk
<FromGitter> <Daniel-Worrall> It's not exactly mapping... hmm
<FromGitter> <Daniel-Worrall> https://carc.in/#/r/a5pc there's this disgusting code
<FromGitter> <HertzDevil> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe19073acd1e516f8a92969]
<FromGitter> <Daniel-Worrall> Nice
bazaar has quit [Ping timeout: 272 seconds]
bazaar has joined #crystal-lang
_ht has joined #crystal-lang
<FromGitter> <mattrberry> Any idea why I get a different result here than in Python? ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe1a26caa6bb528c364fb1e]
<FromGitter> <mattrberry> Crystal counts 6 matches while Python counts 12
<FromGitter> <Daniel-Worrall> Does Python use pcre?
<FromGitter> <Daniel-Worrall> seems they use RE
<FromGitter> <mattrberry> Interesting, I would have expected this to work properly in PCRE but I guess it doesn't..
<FromGitter> <mattrberry> Doesn't seem like it's recurring properly. I was under the assumption that recursion in DEFINE groups was implicit..?
<FromGitter> <Daniel-Worrall> How can you tell it's an issue in PCRE and not re :^)
<FromGitter> <erdnaxeli:cervoi.se> mattrberry (Matthew Berry), I tried the same regex as you, didn't work neither
<FromGitter> <erdnaxeli:cervoi.se> I don't understand why
FromGitter has quit [Ping timeout: 240 seconds]
FromGitter has joined #crystal-lang
_ht has quit [Ping timeout: 246 seconds]
_ht has joined #crystal-lang
_ht has quit [Read error: Connection reset by peer]
melthelesbian has joined #crystal-lang
kevinsjoberg has joined #crystal-lang
_ht has joined #crystal-lang
_ht has quit [Ping timeout: 260 seconds]
f1reflyylmao is now known as f1refly
_ht has joined #crystal-lang
hightower2 has quit [Ping timeout: 240 seconds]
duane has joined #crystal-lang
<frojnd> Well what do you know... it is case sensitive when you pass url to HTTP::Client.get url and then use MyHtml::Parser.new(response.body)
<frojnd> I'm really confused about this one
<frojnd> Is this `HTTP::Client.get url` specific or `Myhtml::Parser` (gem's specific) ?
<frojnd> Not sure how to run shards on carc.in but you can try it yoursel
<frojnd> Ok This seems to be web specific... some pages ignore case sensitive urls but others don't
<frojnd> What is interesting if I try to access some page that ignores case senstive urls... I can't get response I want with HTTP::Client.get even though that firefox shows the page
<frojnd> Hm
hightower2 has joined #crystal-lang
hightower2 has quit [Read error: Connection reset by peer]
<FromGitter> <Blacksmoke16> is there a built in way to get the intersection of two hashes?
<FromGitter> <Blacksmoke16> `h1.select { |k, v| h2.has_key?(k) && h2[k] == v }` :shrug:
<FromGitter> <erdnaxeli:cervoi.se> Set.new(h1.toa) & Set.new(h2.toa) ? (with the correct types for the Set)
<FromGitter> <erdnaxeli:cervoi.se> even (Set.new(h1.toa) & Set.new(h2.toa)).to_h
<FromGitter> <erdnaxeli:cervoi.se> not very elegant :p
hightower2 has joined #crystal-lang
woodruffw has quit [Ping timeout: 264 seconds]
woodruffw has joined #crystal-lang
<hightower2> Hey why the various IO write methods don't have a variant accepting the buffer (pointer(uint8)) and a length? or in other words, after I have a buffer of which I know `len` bytes are written, what's the most efficient way to write len bytes of that to an IO?
<FromGitter> <Blacksmoke16> https://crystal-lang.org/api/master/IO.html#write(slice:Bytes):Nil-instance-method ?
<hightower2> ah I need to wrap the ptr into bytes of that length you say...
<straight-shoota> hightower2, writing buffers is the very foundation of IO, just use its #write method
<straight-shoota> yes, `Slice` represents pointer + length
<hightower2> ok thanks.. I was trying to avoid wrapping it into another object though, but if that's how it's done than that's it
<hightower2> (since the buffer itself is larger than the amount of data that was meaningfully written into it)
<straight-shoota> a slice is free, just a struct
<hightower2> ok, great, thanks for the discussion
<hightower2> A conceptual question -- I have a lib binding to C, and some of the functions return strings from C (ptr(uint8)). For use/reading in Crystal these are best converted to String of course, but if/when they are used as input into further functions from the C lib they can be passed without converting to/from String at all. Is there a rule of thumb how to support both purposes and how to name the methods? Or I just use String.new(...) and
<hightower2> later str.to_unsafe and that's it?
woodruffw has quit [Ping timeout: 256 seconds]
woodruffw has joined #crystal-lang
hightower2 has quit [Remote host closed the connection]
<straight-shoota> If you don't need a Crystal string, you can safe the extra allocation for building one from a char array
<straight-shoota> I'm not sure if there are any established conventions for this
<straight-shoota> a typical solution might be to provide a low level API based on C strings and a high level API based on Crystal strings.
<FromGitter> <Blacksmoke16> i made a thing
<FromGitter> <watzon> Oh?
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe243128bb73474694bc262]
<FromGitter> <watzon> Oh nice
<FromGitter> <Blacksmoke16> yup, also supports encoding, charset, and language
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe2438c8bb73474694bc373]
<FromGitter> <Blacksmoke16> is framework agnostic and no dependencies, so totally could be implemented in other frameworks
<FromGitter> <Blacksmoke16> i dont have lucky installed but id be curious to see what it would do if you did something like `application/json;q=0.5, text/html`
hightower2 has joined #crystal-lang
ua_ has quit [Ping timeout: 256 seconds]
_ht has quit [Remote host closed the connection]
ua_ has joined #crystal-lang
<FromGitter> <Blacksmoke16> `Missing MIME type for extension "text/html" (KeyError)` welp
<FromGitter> <Blacksmoke16> wait
<FromGitter> <tenebrousedge> eh, probably no one uses that one
<FromGitter> <Blacksmoke16> nvm, user error
<FromGitter> <Blacksmoke16> doesnt seem like theres a way to get the extension based on the mime type
<FromGitter> <Blacksmoke16> er maybe like `MIME.extensions("text/html").first`
<FromGitter> <Blacksmoke16> eh kinda meh, returns `.htm`
<FromGitter> <tenebrousedge> I have no idea what you're doing, personally
<FromGitter> <Blacksmoke16> related to the negotiator thing up a bit
<straight-shoota> >> require "mime"; MIME.extensions("text/html")
<DeBot> straight-shoota: # => Set{".htm", ".html"} - https://carc.in/#/r/a5tj
<FromGitter> <Blacksmoke16> i.e. given a mime type like `application/json` map it to a format like "html"
<FromGitter> <Blacksmoke16> er "json" in that case
<FromGitter> <tenebrousedge> I'm not sure what you're after where the MIME would not be descriptive
<straight-shoota> mime lookup is primarily ext => type
<FromGitter> <Blacksmoke16> i guess what im getting at is if you declare something as handling `html`, id need a way to map all the mime types for html to the name `html`
<FromGitter> <tenebrousedge> `html` is just a name though
<FromGitter> <Blacksmoke16> i.e. the user can just say `html` and not `application/xhtml+xml` or `text/html`
<FromGitter> <Blacksmoke16> right
<straight-shoota> that's outside the scope of a mime database
<straight-shoota> it maps every extension to exactly one type
<straight-shoota> so you can't have multiple types associated with "html" extensions
<FromGitter> <tenebrousedge> I'm sure you could make `html` into some sort of method that would match `text/html` or `application/html`
<FromGitter> <Blacksmoke16> yea, prob would need to build something on top of it
<FromGitter> <Blacksmoke16> or really i dont need it since i already have the mim type
<FromGitter> <Blacksmoke16> mime*
<straight-shoota> and practically you'll only need to cover a couple of types
<straight-shoota> not hundreds like in /etc/mime.types
<FromGitter> <Blacksmoke16> mhm, should be pretty trivial. Plus if a user really wanted they can register more like you can with MIME
<FromGitter> <Blacksmoke16> @Souravgoswami mm, not quite
<FromGitter> <drum445> Hello all, does anyone know how to squash these errors? ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe2763a97312f4b6be46c6a]
<FromGitter> <watzon> What version of Crystal are you using?
<FromGitter> <drum445> Crystal 0.35.1 [5999ae29b] (2020-06-19)
<FromGitter> <watzon> I know there is a flag to silence those warnings, but I can't remember what it is
<FromGitter> <Blacksmoke16> the solution is to not use the deprecated stuff
<FromGitter> <watzon> It would be a good idea to fix the problem though, rather than trying to ignore the warning
<FromGitter> <drum445> Well, I meant fix but worded it like a clown
<FromGitter> <drum445> What should I use instead of hexdigest, as the suggested solution doesn't work as final doesn't exist in scope
<FromGitter> <Blacksmoke16> `digest.final`?
<FromGitter> <drum445> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5fe277b3de608143153a100d]
<FromGitter> <drum445> is my current code
<FromGitter> <Blacksmoke16> `has.hexstring`
<FromGitter> <Blacksmoke16> hash*
<FromGitter> <Blacksmoke16> er `hash.final.hexstring`
<FromGitter> <drum445> `Error: undefined method 'hexdigest' for Slice(UInt8)` :(
<FromGitter> <Blacksmoke16> right, thats not what i wrote
<FromGitter> <drum445> sorry, been a long day
<FromGitter> <Blacksmoke16> `hexstring` not `hexdigest`
<FromGitter> <drum445> yeah that's worked now thanks matey
<FromGitter> <Blacksmoke16> 👍
<hightower2> Unibilium (terminfo library) bindings have been updated & new version released - https://github.com/crystallabs/unibilium.cr
<oprypin> cc @jrei:matrix.org @erdnaxeli:cervoi.se
postmodern has joined #crystal-lang
<FromGitter> <tenebrousedge> can I not define a constant in an `inherited` macro?
<FromGitter> <Blacksmoke16> mm whats the error?
<FromGitter> <tenebrousedge> constant doesn't exist
<FromGitter> <Blacksmoke16> hmm