Konstruiere eine Liste aus einer Reihe von Ausdrücken in Scala

8

Wenn ich versuche, interne DSLs in Scala zu erstellen, stoße ich auf ein häufiges Problem und konnte keine Lösung erstellen. Um die Dinge etwas mehr wie eine typische Sprache aussehen zu lassen, möchte ich, dass die Syntax ungefähr so ​​aussieht:

%Vor%

In der Praxis gibt es mehrere Probleme. Das erste Problem besteht darin, ein Objekt model zu erhalten, um auf diese Weise zwei Argumente zu erhalten. Wenn jemand irgendwelche Ideen hat, lass es mich wissen. Aber was ich getan habe, ist etwas mehr zu tun:

%Vor%

Wo das Modell jetzt eine Funktion ist, die dann ein Objekt mit einer apply -Methode zurückgibt, die dann das folgende Lambda verbraucht. Damit kann ich leben. Ich könnte mit einem ähnlichen Problem innerhalb des Lambda leben, also Dinge wie decl 'Real 'x oder decl('Real,'x) auf der Innenseite. Aber ich möchte die Ergebnisse all dieser Ausdrücke in den verschnörkelten Klammern finden, um als Liste "zurück" zu kommen. Mit anderen Worten, was ich will, ist etwas wie das zu schreiben:

%Vor%

Dabei wird decl(...) zu etwas vom Typ Declaration und {...} zu List[Declaration] ausgewertet. Ich vermute, dass es einen Weg gibt, um dies zu tun, aber ich konnte es nicht finden. Kurz gesagt, würde ich gerne machen:

%Vor%

... bewerten Sie das Äquivalent von ...

%Vor%

Kommentare oder Vorschläge?

    
Michael Tiller 13.04.2012, 10:15
quelle

3 Antworten

4

Als erste Idee könnten Sie Variablenargumentlisten ausprobieren, die es Ihnen ermöglichen, Kommas anstelle von Semikolons zu verwenden:

%Vor%

Alternativ können Sie ein trait erweitern, um einige Klammern und Kommas zu entfernen:

%Vor%     
paradigmatic 13.04.2012, 10:28
quelle
4

Oh Gott, was habe ich getan?

%Vor%     
elbowich 14.04.2012 00:22
quelle
2

OK, komplett überarbeitet, nachdem festgestellt wurde, dass 'Foo der Modellname sein soll.

%Vor%

Dann auf der Website:

%Vor%

Also sind die Gimmicks hier

1) Verwenden einer Variablen, um das aktuelle Modell zu verfolgen

2) mit - Symbolen für Methodennamen (Sie könnten stattdessen apply verwenden, wenn Sie Klammern bevorzugen)

3) Verwenden eines Builders, damit die zurückgegebene Klasse unveränderlich sein kann

Obwohl, TBH, könnte das ein bisschen viel sein, nur um einige Kommas zu vermeiden ...:)

    
Luigi Plinge 13.04.2012 15:16
quelle

Tags und Links