Por que em Rust o println! e outras macros têm um ponto de exclamação?
Olá a todos! Comecei a estudar Rust literalmente há uma semana e me deparei com uma questão que me deixa um pouco confuso. Por que em Rust, ao imprimir no console, escrevemos `println!` com um ponto de exclamação? Estou acostumado com Python, Java e C++, onde a chamada de funções é sempre sem ponto de exclamação, por exemplo, `print()`, `System.out.println()` ou `std::cout <<`.
Olhei para os exemplos — em todos os lugares escrevem `println!("Hello, world!");`. Tentei escrever apenas `println("Hello");` — o compilador deu um erro:
```
error[E0423]: expected function, found macro `println`
--> src/main.rs:2:5
|
2 | println("Hello");
| ^^^^^^^ not a function
```
Por que isso? É alguma função especial? Ou é uma característica da linguagem? Li que em Rust existem macros, mas não entendo bem como elas diferem de funções comuns. E também: `format!`, `vec!` — também têm ponto de exclamação. Todas essas são macros? Quando preciso usar o ponto de exclamação e quando não?
Expliquem, por favor, em palavras simples para um iniciante.