Recently Pedro wrote about stuff that makes Lisp so powerfull. For short, he argues that Lisp macros make possible to easily implement abstractions that are not builtin to the language. Indeed it's a very nice feature, and I now recognize Lisp as a great language. :-)
But my point in this post is to point what I think that is the cause for the bad impression that I had about it during undergraduation (and I guess that all of my coleagues had too).
The problem is that Programming Languages Concepts are taught under a, let's say, limited perspective. There is small emphasys on key concepts, like First Class Citizens, Abstractions, Meta-Programming, etc. I wasn't taught during undergraduation that functions are a data type, just like numbers, character strings, and others. What happens is that they may or may not be first class citizens, but are a data type.
This is indeed a characteristics of books like Concepts of Programming Languages by Robert W. Sebesta, and others used in so many places to teach Programming Language Concepts. They tend to focus on concepts used in laguages that are currently popular (read "broadly used in the market"), and not in some general concepts that are the foundation os every language in the world.
Several of the mainstream languages have they merits, but Programming Language Concepts books that don't go further in general concepts make several people with minds stuck to the languages that "everyone uses".
For those who want to learn in deep about Programming Languages Concepts, I would recommend a series by Professor David Watt: Programming language concepts and paradigms, Programming language syntax and semantics and Programming Language Processors. Well, "just" for understanding real programming language concepts, I guess that the first one is enough. :-)