... let's look at it from a DSL point of view. What is the domain? I'm thinking it is the specification of the correct behavior of programs. And who are the domain experts? That's a trickier question to answer. In an ideal world, it would be the business users. But, the reality is that if the business users had the time, patience, an inclination to write things at this level, they wouldn't need programmers. Don't kid yourselves—writing these specs is programming, and the domain experts are programmers.
So very close.
The reason the so-called DSLs that Dave mentions are inaccessible to non-programmers is that they're merely Ruby APIs with poor encapsulation. People who do not know how to program Ruby code will have a difficult time reading and writing them. This is not exactly a feature, if you want business experts reviewing your executable specifications.
I'm sure they love looking at RSpec output and saying "Right there, it says the Wooble does not have a built-in Flimflam, that's the problem right there! Just fix that!" By the time RSpec spits out that helpful notice, it's already detected the problem. Useless, except that making RSpec actually useful to business experts requires something more than slapping the colon in front of random Ruby identifiers.
(ObContraDanielBerger: slapping the fat comma operator between indirect object invocations in Perl produces code that's just as bad and just as much not a DSL. The Perl community doesn't have this particular fetish to the same degree as the Ruby community though. Happy?)
Ever since programmers at large stopped having to cram their meaningful identifiers into eight characters (a feature planned for GHC 12.2, I believe), we've been able to subsume the language of the problem domain into our APIs.
When you're writing logic like this, with exception handling, command sequencing, and (in more advanced examples) conditionals and loops, then what you're doing is programming.
This, more than anything, I think is the real dividing point between a DSL and an API. Here's my postulate for the day: a real DSL (make, procmail, SQL, regular expressions, FIT) is purely declarative.
I realize that Prolog might be a DSL under that definition, as might class declaration in Ruby (and ActiveRecord), but I can live with this as a first-order differentiator.