On Github madbrain / pres-dsl
Ludovic L'HOURS github.com/madbrain
Est ce qu'un nouveau langage généraliste est vraiment utile ?
Il existe par contre de nombreux domaines où un langage spécifique (DSL) serait judicieux
main:inlet -> valve -> f1:filter { transfert: x^2 + 1 } f1 -> pump { power: 500W, pressure: 1 bar } -> heater { power: 2kW } -> acc:accumulator -> o1:outlet f1 -> v1:valve -> o2:outlet v1 + acc -> mixer -> o3:outlet
*implique plusieurs langages (cf. HTML, CSS, JS)
%plumber --pipe-diameter input.plumb 42
%plumber --pipe-diameter other-input.plumb Exception in thread "main" org.plumber.parser.ParseException: Parse Error at org.plumber.parser.Parser.doParseLiteral(Parser.java:21) at org.plumber.parser.Parser.doParseExpression(Parser.java:17) at org.plumber.parser.Parser.doParseStatement(Parser.java:13) at org.plumber.parser.Parser.doParseFile(Parser.java:9) at org.plumber.parser.Parser.parse(Parser.java:5) at org.plumber.interpreter.Launcher.main(Launcher.java:7)
Le langage, afin d'être exploitable par le plus grand nombre, doit être associé à des outils qui fournissent:
Un DSL interne est écrit en utilisant un langage hôte, on peut donc profiter de l'outillage associé à ce langage hôte.
Exemple de DSL interne (Java):
interface Start { End singleWord(); End parameterisedWord(String parameter); Intermediate1 word1(); Intermediate2 word2(); Intermediate3 word3(); } interface End { void end(); } interface Intermediate1 extends End { End optionalWord(); } interface Intermediate2 { End wordChoiceA(); End wordChoiceB(); } interface Intermediate3 extends End { Intermediate3 word3(); }
public interface NewElementBuilder { ElementBuilder pump(); ElementBuilder filter(); ElementBuilder pump(String name); ElementBuilder filter(String name); NextElementBuilder ref(String name); } public interface ElementBuilder extends NextElementBuilder { ParametersBuilder parameters(); } public interface NextElementBuilder extends NewElementBuilder { NewElementBuilder pipe(); }
builder() .pump("main").pipe().filter("f1").parameters().pipe().pump() .ref("f1").pipe().pump();
Pour créer son propre langage :
Des questions ?