A hands-on, test driven guide to implementing a simple programming language