“Programming Languages” (Second Edition) by Ravi Sethi is a book desgined to be used as one of the text books in a “Principles of Programming Languages” CS course. To that end, it covers all the major programming styles (imperative, functional and declarative) and variants (object-oriented and concurrent), basic lambda calculus, a short tour of a representative programming language or two for each of the covered styles, numerous exercises for the students to work out, extensive bibliography, etc.
Unfortunately, it is rather dull and boring (as most text books turn out to be) if you read it on your own for self-learning. It does not bother explaining why one should bother acquainting oneself with the different programming styles. It barely covers the genesis of the different programming styles and why, despite the overwhelming popularity of the imperative programming languages like C, C++ and Java, functional and declarative programming languages still have a small but dedicated and enthusiastic following.
Were it not a prescribed text-book in many a university, I think it would have long died a natural death.