A MOS6502 assembler implemented as a Rust macro
play.rust-lang.org
A MOS6502 assembler implemented as a Rust macro
1–10 of 59 posts
Re: A MOS6502 assembler implemented as a Rust macro
#2Re: A MOS6502 assembler implemented as a Rust macro
#3Re: A MOS6502 assembler implemented as a Rust macro
#4Re: A MOS6502 assembler implemented as a Rust macro
#5That ... is ... f *ing ... ugly to look at.
Re: A MOS6502 assembler implemented as a Rust macro
#6Re: A MOS6502 assembler implemented as a Rust macro
#7(also, 0x syntax is quite unusual, but I assume $ couldn't have been implemented for some reason)
Re: A MOS6502 assembler implemented as a Rust macro
#8Very cool. As a Rust newbie I'd like to understand what's going on here. Is this a "procedural" macro? Does Rust specifically target writing DSLs using its macro system? Can we expect macros like this to continue working for a long time? There's a blog post that suggests possible changes: https://internals.rust-lang.org/t/the-future-of-syntax-exten...
This is using a system known as "macro_rules" which are a system of "expanding" -- in some ways it's a fancier version of the C preprocessor, but also resembling the Lisp/Racket macro system to some degree too.
Let's take a random little piece of that code from the post and talk about it:
macro_rules! codelen {
() => { 0 };
( $($c:expr),+ ) => { [$($c),+].len() };
}
This declares a new macro substitution rule called `codelen`.
Without going into too much depth, that's defining rules (on the left hand of the `=>`) and saying what code to expand them into, on the other side. The first replaces `()` with `{0};`, just a simple substitution. In the second rule, the `$($variable),+ is the essential construct here, letting you operate on sequences of input stuff.It's a little hard to read -- writing your own macros in Rust is a little bit complicated and I don't think it's actually something that should be done often. You can write little DSLs with it for sure. This variety is going to stick around and will keep working. It is called macro_rules! and not just macro! to leave that name free for a future, enhanced way to write macros, though.
Re: A MOS6502 assembler implemented as a Rust macro
#9Very cool. As a Rust newbie I'd like to understand what's going on here. Is this a "procedural" macro? Does Rust specifically target writing DSLs using its macro system? Can we expect macros like this to continue working for a long time? There's a blog post that suggests possible changes: https://internals.rust-lang.org/t/the-future-of-syntax-exten...
Re: A MOS6502 assembler implemented as a Rust macro
#10Very cool. As a Rust newbie I'd like to understand what's going on here. Is this a "procedural" macro? Does Rust specifically target writing DSLs using its macro system? Can we expect macros like this to continue working for a long time? There's a blog post that suggests possible changes: https://internals.rust-lang.org/t/the-future-of-syntax-exten...
> Is this a "procedural" macro?
This is not a procedural macro, it's a regular-old macro. > Does Rust specifically target writing DSLs using its macro system?
I would say that "specifically" is a bit strong, but they are one application of them, yes. > Can we expect macros like this to continue working for a long time?
This functionality runs on Rust stable, and therefore should continue working forever.The post you're referring to is talking about procedural macros/syntax extensions/compiler plugins, which are not stable and will see lots of change.
We also may end up with a new macro system as well, but it will not conflict with the existing macro system if we do.