Hallo!
Ich glaube Markus hat in der sehr interessanten Episode 27 Scalas
Licht etwas unter den Scheffel gestellt, als er behauptete, dass man
bei internen DSLs keine Codecompletion etc. hätte. Definieren wir
z.B. mal eine Winzig-DSL, die do while nachbildet:
trait DoWhileDSL {
class DoWhile(block : => Unit) {
/** while condition for previous doblock */
def whilecondition(condition : => Boolean) {
block
while(condition) block
}
}
/** Do a block with while */
def doblock(block : => Unit) = new DoWhile(block)
}
Wenn ich jetzt in einer Klasse diesen trait einfüge, dann erscheint
doblock in der Code-Completion, und wenn ich
doblock { ... }
geschrieben habe kommt auch whilecondition in der Code-Completion,
und man kann sich auch sofort die Dokumentation der "Schlüsselworte"
whilecondition und doblock holen. Klar, man muss sich darum kümmern
dass das so funktioniert, aber ich denke dies ist (zugegebenermassen
mit einigem Aufwand) bei grossen Klassen von DSLs möglich.
Für mich ist dies sogar DAS Killer-Argument für internen DSL in
statischen Sprachen wie Scala gegenüber dynamischen Sprachen wie
Ruby: es ist möglich für Grammatikprüfung und Code-Completion durch
die IDE zu sorgen und man kann dann auch leicht für eine in der IDE
sofort zugängliche Dokumentation sorgen. Weil dies bei dynamischen
Sprachen nicht so leicht möglich ist, würde ich diese nie in einer
umfangreicheren DSL verwenden.