Am very impressed with this book. VERY.
Normally, if you've been programing for a few years, you can quickly start to program in a new lang. You just learn the basics: data types, loops, list/array, function/objects, module, then you can practically code anything you want, albeit in a non-optimal way. But, you'll have a lot questions, especially with complex languages. Questions like scope, evaluation model, and the language's overall “model”. What happens if you do xyz. Understanding these makes you a true expert in that lang. To understand a lang well, is to be able to have a sense of a mathematical model of the language.
I've only read
it is absolutely the best Ruby book. (but i've only read a chapter so far, but confident to say so. It is my style of tutorial. 〔➤ Programing Language Documentation Styles〕 )
(David Flanagan wrote several others, on Java, on X11, since at least 1996.)
Most popular languages are exceedingly complex. The problem is that, you spend years to master them, but, new language comes out and replaces it, and the time you spend learning that language doesn't contribute your understanding to computer science or math in any way. What you learned is sometimes called “artificial complexity”, “man-made complexity”, unlike certain complexity in math or comp sci, that are inherent, unavoidable. Perl, C, C++, and unix tech (Shell, Apache) are good examples of man-made complexity. Lisp, in general, are the polar opposite.