Metacircular interpreters leave much of the PL semantics ambiguous. Instead, write a metacircular compiler! https://github.com/kragen/stoneknifeforth#why--to-know-what-im-doing
Related Posts
I would have thought that invoking a C compiler would be a solved problem. Looking at Rust's cc crate there's a remarkable long tail of corner cases to fix.
Exotic CPUs, microarchitectures, compiler differences, operating system differences, etc.
https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md
TIL Tcl has a notion of 'safe interpreters', a mode where you can run untrusted code in a sandbox: https://www.tcl.tk/man/tcl8.4/TclCmd/safe.htm
Not many programming languages have this, but it's way safer to include in the implementation than try to build as a userland library.
GNU Make defaults to a single worker, and newer build tools (e.g. ninja) default to the number of physical CPUs.I wish there was an option for 'leave me a little bit of my machine to do stuff'.