Understanding programming language design by writing a simple programming language