I've always written dumb lisp parsers in the past: a list is just "(" EXPR* ")". Checking came later. I'm trying something different in my current project, pushing special forms into the parsing logic. This means that e.g. (if) is a parse error. It has a different vibe.