I’m sure a lot of people have their opinions about what the best introductory lisp text is. I won’t add to that list since a google search will give results from reviewers far more eloquent than I am.
What I would like to suggest is that once you basically “get” how the prefix syntax works, and how to process lists, Doug Hoyte’s Let Over Lambda (https://letoverlambda.com/textmode.cl/guest/toc) is a book that can really help you -learn- lisp, to fundamentally understand what makes lisp so powerful compared to other languages. Incredibly perspective-expanding content when I first read it, and largely references many of the “great” lisp texts that helped build the language and its community into what they are today.
Depends on the dialect. I learned lisp via clojure (in before all the "clojure is not a real lisp!" haters come in, please skip that) and first book I used was Clojure for the Brave and True which is a good introduction, fun to read, practical and is available for free to read online. Highly recommended! https://www.braveclojure.com/
regardless of experience, i recommend the little schemer, land of lisp, realm of racket, structure and interpretation of computer programs, and the courses how to code: simple data and how to code: complex data (don't be discouraged by the apparently simple titles as they cover the book how to design programs). if common lisp is really what you want, then i have lisp by winston and horn and common lisp by touretzky and find them quite nice, although i haven't gone through them, just peeking from time to time.
You mentioned that there's no standard string class for c++, and that python is your goto, would recommend looking at Dart Lang, extension methods have recently been added, it also compiles to native exec binaries. https://dart.dev/
Even as a C++ amateur I didn't find it as a meaty or intimidating proposal, rather it was refreshingly brief. If you understand that constexpr functions can be evaluated at either run time or compile time, it makes sense that asm isn't allowed in a compile-time context (it could get really trippy if it was!). This allows for flow analysis to permit asm when evaluating at runtime within a constexpr function, as long as there's a non-asm constexpr alternative path available at compile time. If I'm misunderstanding or missing some subtleties, as a novice I'd appreciate any corrections.