Describir: Foundations of Programming Languages