• Laser@feddit.org
    link
    fedilink
    arrow-up
    5
    ·
    1 month ago

    Not sure I’d call what bash has functions. They’re closer to subroutines in Basic than functions in other languages, as in you can’t return a value from them (they can only return their exit code, and you can capture their stdout and stderr). But even then, they are full subshells. It’s one of the reasons I don’t really like Bash, you’re forced into globally or at least broadly-scoped variables. Oh, and I have no clue right now how to find where in your pipe you got a non-null exit code.

    It’s not a big problem for simple scripting, but it makes things cumbersome once you try to do more.

    • yetAnotherUser@discuss.tchncs.de
      link
      fedilink
      arrow-up
      3
      ·
      1 month ago

      I really like bash when dealing with even somewhat advanced scripting. Like the 300 LOC scraper I have written over the past two days which horribly parses HTML files using grep | sed.

      It’s genuinely so much more fun to do this with Bash than, say, Python. I have once written a scraper using Beautifulsoup and I have no desire to do so ever again.

      Honestly, only Haskell manages to beat Bash in how satisfying it feels when you manage to get something working well.

      • Laser@feddit.org
        link
        fedilink
        arrow-up
        1
        ·
        1 month ago

        Bash has its upsides too, like the fact that it has arrays / lists and dictionaries / hashmaps. In my opinion, it gets iffy though when you need to do stuff with IFS; at that point one might be better off just using specialized tools.

        Not saying working bash isn’t good enough, but it can break in very surprising ways is my experience.

    • [object Object]@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      1 month ago

      Functions are definitely not subshells in Bash, seeing as anything modifying the environment, like pyenv and such, is implemented as functions instead of scripts — specifically because functions are run in the same shell instance.

      Unless ‘subshell’ means something in the vein of ‘like a new shell, but not really’.

  • NotSteve_@piefed.ca
    link
    fedilink
    English
    arrow-up
    3
    ·
    edit-2
    1 month ago

    def (): is pretty nice

    Edit: also as someone doing a bunch of CI work right now, Bash can GTFO (unless the alternative is whatever Windows is doing)

    • spongebue@lemmy.world
      link
      fedilink
      arrow-up
      0
      ·
      1 month ago

      I have no idea why you’d need that especially since return y() is pretty easy, but… I want it!

      (Actually, I guess a super simple way of overloading a method, like fun x() = x(defaultValue) could be neat)

      • calcopiritus@lemmy.world
        link
        fedilink
        arrow-up
        0
        ·
        1 month ago

        This can also be a side product for code blocks being expressions instead of statements.

        In rust for example they are, so it’s not rare to see functions like:

        fn add_one(x: i32) -> i32 {
            x+1
        }
        

        This lets you do amazing things like:

        let x = if y < 0.0 {
            0.0
        } else {
            y
        }
        

        which is the same as x = y < 0.0 ? 0.0 : y

        But is much better for more complex logic. So you can forget about chaining 3-4 ternary operations in a single line.

        • [object Object]@lemmy.world
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          1 month ago

          Lisp programmers seeing these ‘amazing things’:

          But yeah, every time I’m trying to do a ternary in Lua, I miss being able to just throw in an if. Thankfully it can be amended with Fennel.

  • Speiser0@feddit.org
    link
    fedilink
    arrow-up
    1
    ·
    1 month ago

    C++ has []{}.

    (You can also add more brackets if you wish to do nothing longer: []<>[[]]()[[]]{}())

    • masterspace@lemmy.ca
      link
      fedilink
      English
      arrow-up
      0
      ·
      edit-2
      1 month ago

      The equivalent in JavaScript / TypeScript would actually be function () {}, this is the syntax for named functions.

      C# is the same as bash though.

          • SpaceCowboy@lemmy.ca
            link
            fedilink
            arrow-up
            0
            arrow-down
            1
            ·
            1 month ago

            Yeah for whatever reason, FE devs want to make everything a const. It’s like a religious belief or something, it’s really kinda weird.

            const fun = () => { const something = “whatever” const array = []; array.push(someting)

            for (const thing of array) { if (thing === ‘whatever’) blah(thing) } }

            Semicolons? Optional. Which quotes you should use? Whatever you feel like! But you must declare things as a const wherever possible! Even if it’s an array that you’re going to be changing, declare it as a const because you should know that you can push things into a const array, and since it’s possible to declare it as a const, you must declare it as a const.

            Why is this? Nobody knows, but it’s important to FE devs that you use const.

            • brian@programming.dev
              link
              fedilink
              arrow-up
              1
              ·
              1 month ago

              semicolons? quotes? use a formatter and don’t think about it. I think js world has basically done this already.

              const is simpler. why would I declare an array as let if I’m not reassigning? someone can look at it and know they don’t have to think about reassignment of the reference, just normal mutation. ts has the further readonly to describe the other type of mutation, don’t abuse let to mean that.

              const arrow over named function? gets rid of all the legacy behaviors and apis. no arguments, consistent this, and no hoisting or accidental reassignment. the 2 places you should ever use named fn are generator or if you actually need this

              • Mr. Satan@lemmy.zip
                link
                fedilink
                arrow-up
                1
                ·
                1 month ago

                semicolons? quotes? use a formatter and don’t think about it. I think js world has basically done this already.

                It’s nice when a codebase has sane formatter conventions. I can’t say that my workplace does, tho…

                const arrow over named function? gets rid of all the legacy behaviors and apis. no arguments, consistent this, and no hoisting or accidental reassignment. the 2 places you should ever use named fn are generator or if you actually need `this

                How is having arguments and this an issue? If one doesn’t need them, then it can be just left unused. I really don’t get this argument. It makes everything visually a variable. I see no benefit to this convention and actively despise it.

              • SpaceCowboy@lemmy.ca
                link
                fedilink
                arrow-up
                1
                arrow-down
                1
                ·
                1 month ago

                Stylistically, you’re changing the array when you add something to it. Javascript is a janky language in the best of times, but FE devs like to artificially introduce additional unnecessary complexities on top of the jank.

                const is simpler. why would I declare an array as let if I’m not reassigning?

                Why would you declare a const that’s going to have different data every time to function is called?

                Now I’m thinking it’s a form of gatekeeping. Just an excuse for FE devs to throw out terms like “immutable” to make it sound like they know what they’re taking about. Y’all need to constantly sound like you know what you’re talking about when dealing with users, pretending weird stylistic choices have real technical reasons for them. But the BE devs know what you’re saying is complete bullshit LOL.

                • masterspace@lemmy.ca
                  link
                  fedilink
                  English
                  arrow-up
                  1
                  ·
                  1 month ago

                  You are literally just describing the conceptual differences between functional programming and object oriented programming. It has nothing to do with front end vs backend, except for the fact that React has vastly popularized functional paradigms on the frontend.

                  You should keep an open mind, functional programming is basically what object oriented programming looks like if you were to actually follow all the SOLID principles.

            • Ghoelian@piefed.social
              link
              fedilink
              English
              arrow-up
              0
              ·
              1 month ago

              The reason is very simple, performance. If a value doesn’t need to be changed, don’t declare it as mutable. This isn’t just a front-end thing btw.

              • SpaceCowboy@lemmy.ca
                link
                fedilink
                arrow-up
                0
                arrow-down
                1
                ·
                1 month ago

                Pushing something onto an array isn’t changing the array? It’s not changing the reference to the array, but from a style standpoint it doesn’t make sense.

                And if you’re declaring a const within the scope of a function, it’s still allocating memory when it enters the scope and disposing it when it leaves the scope, same as a variable. There’s no performance benefit to do this.

                Something like const CONSTANT_VALUE = “This never changes” has a performance benefit and is actually how other languages use constants. The value will always be the same, the compiler understands this and can optimize accordingly. If you’re declaring an iterator or the result of calling a webservice to be const it’ll be a different value every time it runs that code, so it’s not something a compiler can optimize. In style terms, it’s a value that’s different every time you get to that line of code, so why would you want to call it constant?

                You’re comment indicates the FE dev obsession with always using const stems from a misunderstanding of how computers work. But of course many religious beliefs originate from a misunderstanding of the world. Whatever man, I just make it a const to make the linter happy, because it’s dumb FE bullshit LOL.

                • masterspace@lemmy.ca
                  link
                  fedilink
                  English
                  arrow-up
                  1
                  ·
                  1 month ago

                  Lol.

                  Pushing something onto an array isn’t changing the array? It’s not changing the reference to the array, but from a style standpoint it doesn’t make sense.

                  So you’re arguing for writing things as they seem, not the way that computers treat them?

                  You’re comment indicates the FE dev obsession with always using const stems from a misunderstanding of how computers work.

                  Maybe rethink this.