A DSL is created specifically to solve problems in a particular domain and is not intended to be able to solve problems outside of it.
Usually a DSL is a tiny programming language, which is well-suited for solving a narrow range of problems, that does'nt express well in a general purpose language. Usually a DSL cannot compile into an executable.
see definition here [Wikipedia].
see chapter 5.5 in Generative Programming, by Krzysztof Czarnecki and Ulrich W. Eisenecker.
can be easier to express things within a domain. may allow a non-programmer to express things (less costly).
can be costly to develop and maintain.
Personly I find Ruby interesting, which is a general purpose language that allows for creating custom DSL's. Allowing you to use this well known language within your domain specific code.
see [martinfowler on Internal DSL].