it-swarm.com.de

Ausführen einer Common LISP-Funktion an einer Terminal-Eingabeaufforderung

Ich habe Schwierigkeiten, eine Antwort darauf zu finden, daher ist es vielleicht nicht möglich. Ich möchte die Flexibilität haben, eine LISP-Datei von einer Befehlszeile aus laden/kompilieren zu können, d. H. Nicht in emacs, und dann eine der LISP-Funktionen in dieser Datei auch von der Befehlszeile aus auszuführen. Dies ist ohne Zweifel ein implementierungsspezifisches Feature, also alle Hinweise auf eine Implementierung, die dies bietet (oder vielleicht ist es ziemlich standard, ich weiß es nicht). Ich verwende SBCL und mag es, also wäre es toll, wenn das so wäre.

Ich benutze auch Mac OSX und Terminal.

12
johnbakers

Das SBCL-Handbuch beschreibt drei nützliche Optionen

3.3.1 Laufzeitoptionen

--noinform
Unterdrücken Sie den Druck eines Banners oder einer anderen Informationsmeldung beim Start. Dies erleichtert das Schreiben von LISP - Programmen, die sauber in Unix-Pipelines arbeiten. Siehe auch die Optionen --noprint Und --disable-debugger.

3.3.2 Toplevel-Optionen

--eval command
Nach dem Ausführen einer Initialisierungsdatei, aber vor dem Starten der Read-Eval-Print-Schleife für die Standardeingabe, lesen und bewerten Sie Den angegebenen Befehl. Es kann mehr als eine --eval-Option verwendet werden, und alle Werden gelesen und ausgeführt, und zwar in der Reihenfolge, in der sie in der Befehlszeile Angezeigt werden.

--load filename
Dies ist äquivalent zu --eval '(load "filename")'. Die spezielle Syntax soll das Zitieren von Kopfschmerzen beim Aufrufen von SBCL aus Shell-Skripts reduzieren.

Gegeben eine Datei test.LISP mit Inhalt

(defun hello-world ()
  (print 'hello-world)
  (terpri))

wir können das mit SBCL machen:

$ sbcl --noinform --load test.LISP --eval '(progn (hello-world) (sb-ext:quit))'

HELLO-WORLD 

Der (progn ... (sb-ext:quit)) stellt sicher, dass das Programm nach der Ausführung von (hello-world) beendet wird. Andernfalls werden Sie in die SBCL-Eingabeaufforderung verschoben. Da der Code automatisch in SBCL kompiliert wird, ist die von Ihnen ausgeführte Funktion bereits zu dem Zeitpunkt kompiliert, zu dem (hello-world) ausgeführt wird. Wenn Sie die Datei vorab kompiliert haben, können Sie die kompilierte Datei an --load übergeben. Z.B., 

$ sbcl --noinform --load test.fasl --eval '(hello-world)'

HELLO-WORLD 

In Anbetracht der Gleichwertigkeit von --load mit --eval (load "filename") können Sie einfach die Basis des Dateinamens verwenden, und wenn es eine kompilierte Version gibt, sollte SBCL diese laden, und wenn nicht, lädt SBCL die Quelldatei und Sie. Ich bekomme so kompilierten Code. Zum Beispiel verwenden wir im Folgenden nur --load test:

$ sbcl --noinform --load test --eval '(hello-world)'

HELLO-WORLD 
20
Joshua Taylor

Das Folgende ist eine Einfügung aus dem first google result :

CLISP

Wenn Sie die CLISP Common LISP-Umgebung verwenden, gilt Folgendes.

Gehen Sie folgendermaßen vor, um ein Programm namens test.LISP-Programm in eine Bytecode-Datei namens test.fas zu kompilieren.

clisp -c test.LISP

Wenn Sie weniger Ausgabe anzeigen möchten, gehen Sie stattdessen wie folgt vor.

clisp -q -c test.LISP

Führen Sie die folgenden Schritte aus, um die kompilierte (oder sogar unkompilierte, wenn Sie den obigen Schritt überspringen) LISP-Datei auszuführen, vorausgesetzt, Ihre Eintragsfunktion heißt main. Normalerweise wird das Ergebnis der Hauptfunktion angezeigt, wenn dies abgeschlossen ist, aber der Befehl (quit) verhindert dies. Die -on-error Abort-Option verhindert, dass clisp in eine Debugging-Eingabeaufforderung abfällt, und wird stattdessen beendet, wenn ein Fehler auftritt.

clisp -q -q -q -on-error Abort -x '(progn (load "test") (main) (quit))'

Ich habe es gerade auf meinem Arch Linux-Terminal getestet und Sie können Folgendes tun:

$ clisp myprogram.LISP

Dadurch wird das Programm direkt im Terminal ausgeführt. Wenn Sie es zur späteren Ausführung kompilieren möchten, lesen Sie das obige Bit.

4
TW80000

Wie andere Leute gezeigt haben, haben fast alle Implementierungen LISP-Code über das Terminal ausgeführt. Es gibt auch einige Wrapper, die eine gemeinsame Schnittstelle für viele Implementierungen bieten: CIM und cl-launch .

1
Luís Oliveira