This book studies the minimal sets of core features that programming languages need to support certain paradigms of programming, and the implications and trade-offs of adding those features.
It's not suitable for a first course in programming - that's not the point - and goes over more advanced concepts. It covers a lot of ground in its attempt to present a unified view of programming languages, so it's worth going through.
To follow along with the programs, you'll need the Mozart Programming Interface.