I think it's more fair to say that s-expression is analogous to XML, Lisp just happened to be written in s-expressions. Lisp could also be written in XML, but I doubt it's a wise choice. In fact, Lisp could be written in any nested tree structure, since the idea is to write code in parse-tree directly, instead of letting the compiler transform your code into parse trees. So Lisp macros manipulating s-expression is like manipulating parse-tree directly, and thus you can create new language constructs.