One of the things I like to do is compare how different languages solve the same problem — especially when they end up having very different approaches. It’s always educational. In this case, a bunch of us have been working hard on trying to get reflection — a really transformative language feature — into C++26. Fundamentally, reflection itself can be divided into two pieces:
This is a blog post that really is about C++, but with a look at how Rust does things. So, this is an interesting C++/Rust comparison for once.
Correct - Rust’s attribute grammar allows any parseable sequence of tokens enclosed in #[attr ...] basically. Serde specifically requires things to be in strings, but this is not a requirement of modern Rust or modern versions of syn (if you’re comfortable writing your own parser for the meta).
The author is not a Rust expert though, so I’m not surprised to see this assumption. It doesn’t take away from the article though.
Not only that. We don’t just “inject” raw strings with the syn/quote duality. Stringified or not, the token tree will be parse-checked into the expected syn type before being used in generated code.
So the distinction is both wrong and irrelevant. This is what I meant by wrong on multiple levels/layers 😉
I don’t do C++ as a life choice, and thus not 100% sure what the author means here. But I have the feeling that he is wrong, on multiple levels even 😉
Correct - Rust’s attribute grammar allows any parseable sequence of tokens enclosed in
#[attr ...]
basically. Serde specifically requires things to be in strings, but this is not a requirement of modern Rust or modern versions ofsyn
(if you’re comfortable writing your own parser for the meta).The author is not a Rust expert though, so I’m not surprised to see this assumption. It doesn’t take away from the article though.
Edit: for fun,
syn
has an example parsing an attribute in an attributeNot only that. We don’t just “inject” raw strings with the
syn
/quote
duality. Stringified or not, the token tree will be parse-checked into the expectedsyn
type before being used in generated code.So the distinction is both wrong and irrelevant. This is what I meant by wrong on multiple levels/layers 😉