I say Haskell, the way you can build abstract syntax tree's as data types and do pattern matching on them is a very natural way to write a compiler, it is almost a one-to-one match with a language definition.
On the other hand there's a tradition of dogfooding in this area, one argument being that if your (general purpose, let's assume) language isn't good for building a compiler, what use is it? If you believe in your language....
I like pattern matching a lot so this appeals to me.