Made with KolourPaint and screenshots from Kate (with the GitHub theme).

you are viewing a single comment's thread
view the rest of the comments
[–] 5 points 1 year ago (13 children)

To be honest I always disliked variable declaration without value assignment, so to me both options suck. :)

  • source
  • hideshow 13 child comments
  • [–] 5 points 1 year ago* (7 children)

    What about

    Let ret: Number
    If (someCondition) {
        <a lot of expensive calculations>
        ret = resultOfOperations
    } else {
        <a lot of other different expensive operations>
        ret = resultOfOtherOperations
    }
    return ret
    

    You can't declare ret inside the brackets

  • source
  • parent
  • hideshow 7 child comments
  • [–] 5 points 1 year ago (4 children)

    Rust would allow you to

    let ret = if some_condition {
        <a lot of expensive calculations>
        result_of_operations
    } else {
        <a lot of other different expensive calculations>
        result_of_other_operations
    };
    

    Now you don't have to declare it inside the blocks.

  • source
  • parent
  • hideshow 4 child comments
  • [–] -3 points 1 year ago (2 children)
  • [–] 4 points 1 year ago

    What's disgusting about it? The only thing I can think of is the implicit return, which felt a bit icky at first.

    Also, as the if expression is an expression, you can call methods on it like so:

    if 1 > 2 {
        3
    } else {
        4
    }.min(5)
    

    (the above is still an expression, so it could be used, for example, as part of a condition for another if)

    Of course, you can write horrible code in any language, but the ability to use blocks where expressions are expected can be great sometimes.

  • source
  • parent
  • [–] 2 points 1 year ago (4 children)

    What about you declare (then it gets allocated in stack) it and pass it to a different context for assignment?

  • source
  • parent
  • hideshow 4 child comments
  • [–] 2 points 1 year ago* (3 children)

    Well, I don't know your use case well enough, but I guess you might have perfect reason for that behavior.

    One thing that comes to my mind is the old Try in C#

    bool parsedSuccessfully = int.TryParse("123", out int result);
    

    But I guess more popular approach would be to use Error as Values, right?

    E.g. something like this

    Outcome<Exception, Int> result = int.TotallyNewParse("123");
    
  • source
  • parent
  • hideshow 3 child comments
  • [–] 3 points 1 year ago (2 children)
  • [–] 2 points 1 year ago (1 child)

    Great example.

    Wouldn't getchar() be more appropriate here? Last time I used C it was 16 years ago.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 3 points 1 year ago

    Yes, and no, sir, you missed the point. The procedure here is to allocate then give away, not reading a fixed-length returned value.

    Say you can only afford to have ten bytes in the stack. You allocate char s[10]; then give it to a library to parse something. Also telling it to abort if it's going to be longer than ten bytes, of course.

  • source
  • parent