Hacker Newsnew | past | comments | ask | show | jobs | submit | general_pizza's commentslogin

It’s not text but there’s a podcast with Simon Peyton Jones (Haskell person) talking about his new job at Epic working on verse. Starts around 50s in:

https://podcasts.apple.com/us/podcast/the-haskell-interlude/...


Not original commenter but I think jackric already alluded to the increased cynicism that develops from clickbait. Personally, when I see so many ppl giving up honest and nuanced statements/opinions for hyperbole in order to gain views/likes, it's disappointing.


I also thought regex seemed overkill and didn't feel like adding an extra crate to my Cargo.toml. Luckily for the days I attempted I was able to get by on just the split method for str's[0] which was nice and concise. So for your regex example you could also do:

    // #1 @ 916,616: 21x29
    let parts: Vec<&str> = l.split(['@', ',', ':', 'x'].as_ref()).collect();
    let x = parts[1].trim().parse::<i32>().expect("x as i32");
    let y = parts[2].trim().parse::<i32>().expect("y as i32");
    let w = parts[3].trim().parse::<i32>().expect("width as i32");
    let h = parts[4].trim().parse::<i32>().expect("height as i32");
[0] https://doc.rust-lang.org/std/primitive.str.html#method.spli...


The next step could be to remove `.collect()` and use `.next()` for each subsequent part. Zero allocations!

    let mut parts = l.split(&['@', ',', ':', 'x'][..])
       .flat_map(|s| s.trim().parse::<i32>().ok());
    let x = parts.next().expect("x as i32");
    let y = parts.next().expect("y as i32");
    let w = parts.next().expect("width as i32");
    let h = parts.next().expect("height as i32");


> and didn't feel like adding an extra crate to my Cargo.toml

Why not? cargo makes it extremely easy to add new crates. The hardest part is figuring out what dependency you want, but once you know what it is, adding it is really easy.


Totally agree, cargo makes it easy. Honestly it’s just that the level of laziness is so high when I’m programming on something personal after work that even having to switch to chrome to check a version number on crates.io will be avoided.


You might be interested to know that cargo can do that for you

  $ cargo search regex
  regex = "1.1.0"             # An implementation of regular expressions for Rust. This implementation uses finite automata and gua…
  regex-automata = "0.1.5"    # Automata construction and matching using regular expressions.
  …


This is awesome. How did you figure this out? The documentation on `split` says:

"The pattern can be a &str, char, or a closure that determines the split."

But in your case it is an array of chars and it splits for each of them. I don't see this documented at all.


The docs are a tad misleading but the important piece is to look at the signature. The `where P: Pattern<'a>` portion states that split needs a type that implements the Pattern trait. If you follow the link to the Pattern trait then at the bottom you'll see a section[0] listing types implementing the trait (&[char] being one) and therefore can be passed into split. Hope that helps!

[0] https://doc.rust-lang.org/std/str/pattern/trait.Pattern.html...


Would you be willing to file a docs bug so we can clarify this?

It’s possible that it used to be only those types, but was expanded. We should fix this!


Yeah, will do


Awesome, thank you!


Vec<char> or an array for instance - [char; 20] can (automatically) create a "slice" of type &[char]. This is true for all types (not just char).

The operator for this is for eg l[1..10]. It can also happen automatically.

&str is the same type as &[char] - just a renaming.

Still learning Rust myself, apologies if this leads you astray. Just do some reading on slices.

https://doc.rust-lang.org/book/ch04-03-slices.html#string-sl...

https://doc.rust-lang.org/std/slice/


&str is not the same as &[char]. &str has the same memory representation as &[u8]. char is four bytes, not one.


Thanks Steve.


No problem! It's an easy mistake to make.


If you think of it more like “how do I want to handle something bad happening?” instead of “what category does this fall under?” then I believe electrograv‘s point of not being clear-cut becomes more clear.

For example in rust most code that can fail will return a Result and thus the compiler forces you to handle that. However, that code can just as easily panic and behave like an uncaught exception would (thread exiting). An example would be the division operator and the array index operator. Both division-by-zero and out-of-bounds errors can certainly be handled by using a Result but in this case the Rust developers made a decision to use panic. Are these both exceptions bc they are handled like a typical uncaught exception or are they errors bc it’s conceivable to handle them just like a failed file open?


There’s a great Welcome to Macintosh podcast episode[1] that interviews Jim Reekes about this history, highly recommend it. Fun fact, in addition to the iconic startup sound Jim is also responsible for the camera shutter sound on iPhones.

[1] https://www.macintosh.fm/episodes/13


Hmm I’m seeing the opposite. The last graph shows Google’s hash table outperforming in all but a few places, including at 400k. Perhaps you mixed the axes up, lower is better here.

I also just want to comment that skepticism to high claims is good but your comment seems a bit too harsh. Briefly looking at his post where he goes into his “fastest hash table” it’s quite long, very detailed and has similar graphs. That doesn’t seem under-researched to me.


> Hmm I’m seeing the opposite. The last graph shows Google’s hash table outperforming in all but a few places, including at 400k.

You're exactly right, General Pizza. I was trying to say that the Google table was faster, even though the author claimed that his or her table was "fastest" without qualification.

Thanks for pointing that out; I'll leave my post as it is so yours continues to make sense in context.


Hmm, I've got both Bluetooth File Exchange.app and Bluetooth Explorer.app on my mac which are both from Apple and I think what you're looking for. Not sure if they came default or when I downloaded the bluetooth dev kit years ago. I remember using it to transfer mp3s onto a ZTE bar phone back in the day.


> From what I understand, the definition of a transpiler is one which almost exclusively performs syntax-syntax transforms, and doesn't delve into the semantics with e.g. dataflow or control flow.

A counter example to this is the typescript compiler which some might describe as a transpiler. It does sophisticated control flow analysis to, for example, make sure all branches of an if statement return the same type.


I've heard of sentence diagrams[0] which are tree-like structures used for checking grammatical correctness.

[0] https://en.m.wikipedia.org/wiki/Sentence_diagram


Exactly. Some of the points just seem ridiculous and make me wonder what this person expected to get out of the book. For example:

> Halliday’s character combines the worst traits of Elon Musk, Mark Zuckerberg and Kim Dotcom.

Do you think its purpose is to inspire you to be a better person? Since when are fiction books self help books? Since when are perfect characters the most interesting ones?


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: