
Yes, that’s right. Basically, if you write (part of) your compiler in the language being compiled you either need to write bootstrap via a binary artifact or via a separate implementation of (that part of) the language.

In Racket we’ve always tried to avoid the former. Thus, cgc enables you to bootstrap 3m with just a C compiler, by being a separate implementation of the GC

Similarly Matthew implemented enough of Chez in Racket to run the Chez compiler so you can build racketcs from regular Racket

The one place where this isn’t the case is the expander. There’s only the one implementation, since it was bootstrapped from the old C implementation which has been removed. The extracted expander is checked in to git, though, so you don’t need Racket to build Racket.