Having read and re-read Practical Common Lisp probably four or five times at this point if you add it all up, and having skimmed Graham's On Lisp enough to realize I need to come back to it later, I decided to move on to Structure and Interpreation of Computer Programs, which is a book available free online.
Side note: It's so wonderfully delicious that so many amazing books are available free online, isn't it? I'm almost in disbelief sometimes at how amazing that is. Such knowledge and secrets, not only easily accessible, but easily accessible for free. As I did with PCL, I'll probably end up buying one or both of the other books I mentioned above just because I like to have a hard copy of things to read in bed, but in the meantime the online version is great.
If that wasn't enough, you can also download (for free) videos of lectures covering this material, given by two guys who authored SICP. I'm only up to lecture 2b, but it's proving very informative to say the least.
SICP is a book apparently used in CS classes at MIT, and it deals with abstractions, the different kinds, and particularly functions and procedures as first-class objects and functional programming. The language used throughout is Scheme, which is different enough from Common Lisp to trip me up already. Although not being all that comfortable with CL at this point maybe also be a blessing, because if it turns out I like Scheme more I can make the switch without having to break any ingrained habits.
I've been watching the lectures and translating the Scheme they give as examples into CL as I watch, as a means of trying to familiarize myself with both languages. A while back I read about the Lisp1 vs. Lisp2 distinction but didn't pay it much mind. Then I read about it again on a Lisp mailing list last week, but didn't pay it any mind. Well today in the course of my Scheme -> CL translations, in a very roundabout manner, this distinction bit me and caused me no end of trouble. Which is funny because I still never saw it coming, even having read about it in two different places and two different context. But now at least I can say understand the distinction in a very tangible way. Just goes to show the only real way to learn a language is by writing code in it.
(You can read much more about Lisp1 vs. Lisp2 here. For those who don't want to read, and for my own future reference: Lisp1 vs. Lisp2 refers to whether there's a single namespace for functions and variables, or two separate namespaces for those things. Scheme has one namespace, CL standardized on two. This results in CL being much more verbose when calling lambdas and passing them around between functions, but also arguably results in CL being more suited to using macros without having to worry about name collisions. That's my probably limited understanding at this point. )