La distinction est difficile à faire et dépend de la langue utilisée. C'est aussi subjectif.
Dans clojure, vous pouvez définir des API qui ressemblent à une DSL. Par exemple, hoquet vous permet de générer du html:
(html [:span {:class "foo"} "bar"])
Cela peut être considéré comme un DSL avec une syntaxe lisp. Le fait qu'il html
puisse s'agir d'une macro lui donne la même puissance que si vous écriviez une bibliothèque de modèles HTML avec des expressions s (voir sxml )
En python, la même API peut ressembler à:
html(["span", {"class" : "foo"}, "bar"])
html est une fonction. Son argument sera évalué en premier, puis l'appel de fonction se produira. Le fait que la syntaxe python soit plus spécifique et la sémantique python plus stricte signifie que cette expression est plus difficile à interpréter comme une DSL indépendante du langage.
Une représentation de langage classique est une structure de données arborescente et une fonction d'évaluation appelée récursivement sur ses nœuds. Les langages LISP rendent cette structure arborescente très apparente, donc tout appel de fonction imbriquée ne peut pas être distingué d'une fonctionnalité de langage intégrée. C'est pourquoi la communauté LISP parle des DSL pour presque tout.
Je crois que la programmation consiste à fournir des abstractions utiles. Je trouve que regarder tout ce que vous construisez (une bibliothèque ou même l'interface utilisateur de votre application) comme éléments de langage pour aider les gens à résoudre un problème complexe est un moyen efficace de concevoir la plupart des choses. Dans cette perspective, j'affirme que toutes les bibliothèques sont des DSL, mais certaines d'entre elles sont mal conçues :-)