• calcopiritus@lemmy.world
    link
    fedilink
    arrow-up
    24
    ·
    3 days ago

    Funny that you put rust as the “uses parenthesis for function calls”. When in rust you can use any bracket for macro invocations:

    let v1 = vec!(1,2,3);
    let v2 = vec![1,2,3];
    let v3 = vec!{1,2,3};
    

    These are valid and have the exact same meaning.

    • Flipper@feddit.org
      link
      fedilink
      English
      arrow-up
      9
      ·
      3 days ago

      To be fair, with Rust macros anything goes. There was an example where someone demoed descriping rust structs and enums nested as xml with a macro to parse it.

      • Ephera@lemmy.ml
        link
        fedilink
        arrow-up
        5
        ·
        3 days ago

        I always enjoy this one: https://crates.io/crates/inline-python

        Apparently, Python’s syntax is almost entirely a subset of Rust’s syntax + a few keywords, so even though you have to pass valid Rust tokens into a macro, that’s good enough to write Python with just a few quirks.

      • calcopiritus@lemmy.world
        link
        fedilink
        arrow-up
        7
        ·
        3 days ago

        That’s inside the macro though. Whatever you parse inside the macro is defined by the creator of the macro. The macro invocation itself is defined by the rust language.

        Rust allows you to use any bracket because it doesn’t know what the macro is supposed to do.

        Some macros work like functions:

        println!("Hello world");
        

        Some macros work like array declarations:

        let v = vec![1,2,3];
        

        And some macros work like a code scope:

        select!{
         a => myfunc(),
         b => my_other_func()
        }
        

        Since rust doesn’t know what your macro does, it just lets the user choose whatever the user sees more fitting for that specific macro invocation.

    • ExperimentalGuy@programming.dev
      link
      fedilink
      arrow-up
      3
      ·
      3 days ago

      That’s always funny to me. In a language that’s so particular about different syntax features, they let macros of all things have a little bit of arbitrariness.

      • Ephera@lemmy.ml
        link
        fedilink
        arrow-up
        1
        ·
        1 day ago

        Yeah, I always wonder, if it was an intentional decision or just some first draft that stayed in.

        Because I do think, it’s kind of smart. Some macros make sense to call with either () or {}, depending on if you pass a code snippet that’s multi-line or not.
        So, you could come up with a complicated syntax to define which bracket types are acceptable, or you could just not bother. 🙃