Clojure "DSL" -Programmierung

8

Ich entwerfe einen JAX-RS REST Server mit Clojure und RESTEasy .

Ich verstehe, dass Anwendungen, die in Sprachen der Lisp-Familie geschrieben sind, mehr als solche in "traditionellen" imperativen Sprachen als "domänenspezifische Sprachen" aufgebaut sind. Die Anwendung wird von unten nach oben als mehr und mehr "verfeinerte" Funktionen entworfen, bis auf der "obersten" Ebene die Anwendung zu einer Reihe von Funktionsaufrufen für sehr hohe Funktionen wird.

Ich versuche dies für meinen REST-Server zu tun, beginnend mit den Ressourcenklassen, die URL-Anfragen bearbeiten (GET, POST, PUT, DELETE).

Hier ist meine erste Ressource:

%Vor%

Diese Ressource gibt die Server-Build-Zeit als String (eingeschlossen in einem JSON-Paket) zurück, wenn sie mit der http-Methode GET bei der URL "/ buildtime" aufgerufen wird.

Ich werde viel mehr dieser Ressourcen-Klassen und eingeschlossenen Methoden schreiben (die meisten Klassen werden mehr als eine Methode haben), jede mit einem definterface und einem deftype . Dies scheint eine perfekte Anwendung für Makros zu sein.

Ich ersuche Vorschläge, wie dies als DSL gemacht werden könnte. Wie denkt man in Bezug auf DSLs?

    
Ralph 10.10.2011, 11:35
quelle

1 Antwort

3

Wenn ich das machen würde, würde ich anfangen, einen Ringadapter für RESTEasy zu erstellen. Nachdem dies erledigt ist, wird Compojure wissen, wie HTTP-Anfragen in einer Weise behandelt und beantwortet werden, die mit RESTEasy funktioniert. Hier finden Sie einige Informationen, die Ihnen den Einstieg erleichtern.

Ring ist eine Clojure-Bibliothek, die HTTP-Anfragen und -Antworten standardmäßig darstellt. Dieser Standard ist detailliert hier .

Er funktioniert, indem er eine http-Anfrage von einer Vielzahl von Bibliotheken (dh jetty, netty, finagle) erhält und diese in die Standarddarstellung übersetzt. Anschließend übergibt es die Anforderung an einen Anforderungshandler (oft wird dies mit Compojure definiert). Der Handler gibt dann eine Antwort zurück (ebenfalls in der obigen Spezifikation definiert). Diese Antwort wird durch Ring in eine Form übersetzt, die Anlegesteg, Netty usw. verstehen können.

Diese Übersetzung erfolgt über Ringadapter. Es gibt ein paar hier , und Ring wird mit einem Adapter für den Jetty geliefert. Vielleicht kann einen davon als Vorlage für die Erstellung eines RESTEasy-Adapters verwenden. Nachdem Sie das getan haben, können Sie compojure in der üblichen Weise verwenden.

Ring und Compojure sind großartige Beispiele dafür, wie man eine DSL erstellt. Wie alle guten DSLs vereinfacht es das Erstellen von Lösungen in seiner Problemdomäne (in diesem Fall HTTP-Server). Sie sind großartige Beispiele dafür, wie man in Bezug auf DSLs denkt. Wenn Sie sie studieren, sind Sie auf dem besten Weg, in Bezug auf DSLs zu denken.

    
Brian 21.03.2012, 03:55
quelle

Tags und Links