Over the years whenever I've wanted to learn a new programming language, the first significant application I've tried is a Scheme interpreter. Many (most?) Scheme interpreters on the web don't implement
call-with-current-continuation and often do not handle tail calls well (i.e. they blow the implementation language's stack).
It's not hard to implement these things using simple mechanisms, but the simple mechanisms are not widely known. And as it happens, implementing these two very mechanisms tell you a lot about the implementation language. (Primarily because most languages have neither, and most languages do not have closures, and so you have to go to widely varying lengths to implement these two things.)
Note since I have only put in (parts of) a couple of weekends, and my only interest has been illustrating trampolines and
call-with-current-continuation, you will not yet find more than a handful of implemented standard procedures. (Enough to run some tests.) And you will not find
display so no printing yet. Oh, and no macros yet! But you do have