Quando provo a creare DSL interni in Scala, mi imbatto in un problema comune e non sono stato in grado di creare una soluzione. Per rendere le cose sembrano un po 'più simile a un linguaggio tipico, mi piacerebbe la sintassi a guardare qualcosa di simile:Costruire una lista da una serie di espressioni in Scala
model 'Foo {
decl 'Real 'x;
decl 'Real 'y;
}
In pratica, ci sono diversi problemi. Il primo problema è ottenere un oggetto model
qui per prendere due argomenti in questo modo. Se qualcuno ha qualche idea, fammi sapere. Ma quello che ho fatto, invece è quello di fare qualcosa di un po 'più simile a questo:
model('Foo) {
...
}
Dove modello ora è una funzione che restituisce un oggetto con un metodo che poi apply
consuma lambda che segue. Con cui posso convivere Potrei vivere con un problema simile all'interno del lambda, quindi cose come decl 'Real 'x
o decl('Real,'x)
all'interno. Ma quello che voglio fare è ottenere i risultati di tutte quelle espressioni all'interno delle parentesi ondulate per ottenere "restituito" come lista. In altre parole, quello che voglio è quello di scrivere qualcosa di simile:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
dove decl(...)
viene valutato come qualcosa di tipo Declaration
e il {...}
viene valutata poi a List[Declaration]
. Sospetto che ci sia un modo di usare impliciti per farlo, ma non sono stato in grado di trovarlo. In breve, mi piacerebbe fare:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
... valutare l'equivalente di ...
model 'Foo {
decl('Real,'x) ::
decl('Real,'y) ::
Nil
}
commenti o suggerimenti?
Sì, ho visto questo approccio anche con alcune delle DSL dichiarative della GUI. Sono d'accordo che questo è vicino. Speravo semplicemente di non dover introdurre() attorno a tutto e la necessità di usare "," è problematico perché ogni volta che vuoi aggiungere o rimuovere, devi preoccuparti di avere "," s tra le cose, ma non alla fine. –
Ho modificato la mia risposta per rispondere al tuo commento. – paradigmatic
Ah, molto intelligente. Utilizzando la sintassi del costruttore e i metodi definiti localmente. Mi piace e penso che potrebbe funzionare. In effetti, posso semplificarlo fino a "nuovo modello ('Foo) {...}" che elimina il codice. Bel modo di sfruttare il fatto che le parentesi ondulate in un contesto di costruzione ti permettono di introdurre facilmente le cose in quel campo. Mi chiedo se i macro di Scala 2.10 lo renderanno ancora più semplice? –