Extending a Language – Writing Powerful Macros in Scheme