So erstellen Sie DSL in Scala für Befehlszeilen mit mindestens einem zusätzlichen Textbaustein

8

Ich muss eine API für Benutzer entwickeln, die mit scala (weder Java) noch mit Shell vertraut sind. Sie schreiben im Grunde genommen Shell-Skripte innerhalb einer Scala-Klasse (ich weiß, dass ich nur externe Shell-Skripte aufrufen kann, aber komm! Auch später werden wir einige Funktionen für allgemeine Shell-Aufgaben haben).

Ich hatte gehofft, etwas wie:

zu erreichen %Vor%

Da ich direkter bin, wie kann ich die Zeilen 2-4 (oder eine möglicherweise weniger präzise Version) in Seq [String] umwandeln, die ich in MyMagicTrait bearbeiten könnte?

Ich weiß über sys.process.stringToProcess aber wenn ich:

%Vor%

Wie kann ich das Ergebnis jedes Befehls übersichtlich darstellen? Außerdem hatte ich auf eine $ xxx-Notation gehofft.

Beitrag Antworten aktualisieren:

Dank @debilski, @tenshi und @ daniel-c-sobral konnte ich der gewünschten Umsetzung sehr nahe kommen: Ссылка

    
Johnny Everson 22.05.2012, 18:46
quelle

6 Antworten

4

Scheint, dass die mit Scala 2.10 mitgelieferte String-Interpolation Ihnen hier helfen kann. Zunächst können Sie die einfache Methode $ implementieren, die den Befehl einfach sofort ausführt. Um es zu machen, müssen Sie diese benutzerdefinierte Methode für StringContext hinzufügen:

%Vor%

Jetzt können Sie es wie folgt verwenden:

%Vor%

Sie können seine Syntax nutzen (es ist nur ein Nachteil, dass Sie keinen Platz zwischen $ und " hinzufügen können) und String-Interpolation innerhalb des Befehls.

Lasst uns jetzt versuchen, euer magisches Merkmal zu implementieren. Es ist im Allgemeinen die gleiche Idee, aber ich verwende auch DelayedInit , um Befehle richtig zu definieren und dann automatisch während der Klassenerstellung auszuführen.

%Vor%

Und es ist die Verwendung:

%Vor%

Beide Lösungen erzeugen die gleiche Ausgabe:

%Vor%     
tenshi 22.05.2012, 20:50
quelle
5
%Vor%     
Debilski 22.05.2012 19:32
quelle
3

Das ist nur ein Skandal auf @ Debilskis und @ Tomasz Ideen, um zu zeigen, dass man sie gut kombinieren kann:

%Vor%

Ich sehe nicht wirklich, wie man ein weniger basteln könnte, wenn man Shell mit Scala-Befehlen kombinieren möchte, da man etwas braucht, um anzuzeigen, wo die Shell beginnt und endet.

    
Luigi Plinge 22.05.2012 20:02
quelle
2

Dummy-Ansatz

%Vor%     
Tomasz Nurkiewicz 22.05.2012 19:05
quelle
2

Diese Ergebnisse sind überall zu finden. Ach, ich denke nicht, dass sys.process für dich ausreichen wird. Lassen Sie uns zuerst dieses Beispiel so schreiben, dass es genau das tut, wonach Sie gefragt haben:

%Vor%

Nun, warum es nicht funktioniert:

Zuerst wird cd eine Ausnahme auslösen - es gibt keine cd ausführbare Datei. Das ist ein interner Shell-Befehl, also kann nur eine Shell ihn ausführen.

Als Nächstes würde, wenn cd funktionieren würde, die wget nicht bei /tmp/test vorkommen. Jeder der obigen Befehle wird im aktuellen Arbeitsverzeichnis von Java neu ausgeführt. Sie können das Verzeichnis angeben, in dem jeder Befehl ausgeführt werden soll, aber Sie können kein CWD haben (es ist nicht "veränderbar").

    
Daniel C. Sobral 22.05.2012 22:46
quelle
1

BEARBEITEN:

Ich würde das tun:

%Vor%

Sie können Systembefehle wie folgt ausführen:

%Vor%

Sie sollten in der Lage sein, dies in ein DSL einzubauen, aber es ist schon ziemlich knapp.

    
Kyle 22.05.2012 19:09
quelle

Tags und Links