Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages (Pragmatic Programmers)