web-dev-qa-db-fra.com

Exécution d'une fonction Common LISP à partir d'une invite de commande de terminal

J'ai du mal à trouver une réponse à cette question, alors peut-être que ce n'est pas possible. J'aimerais avoir la possibilité de charger/compiler un fichier LISP à partir d’une ligne de commande, c’est-à-dire pas dans emacs, puis d’exécuter également l’une des fonctions LISP de ce fichier à partir de la ligne de commande. Il ne fait aucun doute que c'est une fonctionnalité spécifique à l'implémentation, donc tout indicateur sur une implémentation qui offre cela (ou peut-être est-il assez standard, je ne sais pas). J'utilise SBCL et j'aime ça, alors ce serait bien si cela pouvait faire cela.

J'utilise aussi Mac OSX et Terminal.

12
johnbakers

Le manuel SBCL décrit trois options utiles

_ { 3.3.1 Options d'exécution)

--noinform
Supprime l’impression de toute bannière ou autre message d’information Au démarrage. Cela facilite l'écriture de programmes LISP Qui fonctionnent correctement dans les pipelines Unix. Voir aussi les options --noprint Et --disable-debugger.

_ { 3.3.2 Options de haut niveau)

--eval command
Après avoir exécuté un fichier d'initialisation, mais avant de lancer la boucle read-eval-print sur une entrée standard, lisez et évaluez La commande donnée. Plusieurs options --eval peuvent être utilisées et tous les Seront lus et exécutés, dans l'ordre dans lequel ils apparaissent sur la ligne de commande .

--load filename
Cela équivaut à --eval '(load "filename")'. La syntaxe spéciale a pour but de réduire les casses de tête lors de l'appel de scripts SBCL À partir de scripts Shell.

Étant donné un fichier test.LISP avec le contenu

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

nous pouvons le faire avec SBCL:

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

HELLO-WORLD 

Le (progn ... (sb-ext:quit)) s'assure que le programme se termine après l'exécution de (hello-world). Sinon, vous êtes abandonné dans l'invite SBCL. Le code étant compilé automatiquement dans SBCL, la fonction que vous exécutez est déjà compilée au moment où (hello-world) est exécuté. Si vous avez déjà compilé le fichier, vous pouvez le transmettre à --load. Par exemple., 

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

HELLO-WORLD 

En fait, étant donné l’équivalence de --load et de --eval (load "filename"), vous pouvez simplement utiliser la base du nom du fichier et s’il existe une version compilée, SBCL devrait la charger, et si ce n’est pas le cas, SBCL chargera le fichier source et vous ' Vous obtiendrez le code compilé de cette façon. Par exemple, dans ce qui suit, nous utilisons simplement --load test:

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

HELLO-WORLD 
20
Joshua Taylor

Ce qui suit est un collage à partir du premier résultat Google :

CLISP

Si vous utilisez l'environnement LISP commun CLISP, les conditions suivantes s'appliquent.

Pour compiler un programme nommé programme test.LISP dans un fichier de code intermédiaire nommé test.fas, procédez comme suit.

clisp -c test.LISP

Si vous souhaitez afficher moins de résultats, procédez comme suit.

clisp -q -c test.LISP

Pour exécuter le fichier LISP compilé (ou même non compilé, si vous ignorez l'étape ci-dessus), procédez comme suit, en supposant que votre fonction d'entrée s'appelle main. Normalement, le résultat de la fonction principale est affiché à la fin, mais la commande (quit) l'empêche. L'option -on-error abort empêche le clisp de tomber dans une invite de débogage et se ferme en cas d'erreur.

clisp -q -q -q -on-error abort -x '(progn (charge "test") (principal) (quitte))'

Je viens de le tester sur mon terminal Arch Linux et vous pouvez effectuer les opérations suivantes:

$ clisp myprogram.LISP

Cela lancera le programme directement dans le terminal. Si vous souhaitez le compiler pour l'exécuter ultérieurement, reportez-vous au bit ci-dessus.

4
TW80000

Comme d'autres personnes l'ont montré, pratiquement toutes les implémentations utilisent du code LISP via le terminal. Certains wrappers fournissent une interface commune à de nombreuses implémentations: CIM et cl-launch .

1
Luís Oliveira