J'ai actuellement un petit programme en Common Lisp, que je veux lancer en script shell. J'utilise le SBCL et parfaitement bien avec cela, donc je préfère rester sur cette plate-forme. :)Comment utiliser quicklisp lorsque le programme CL est appelé comme script shell?
Je suis conscient de l'option --script
et il fonctionne parfaitement, sauf pour (ql:quickload)
forme.
Mon programme utilise le CL-FAD, qui charge par ql:quickload
(je pense que je devrais mentionner que c'est la fonction de chargement de paquet de quicklisp). Lorsque script est exécuté jusqu'à l'évaluation de la
(ql:quickload :cl-fad)
forme
, il rompt avec l'erreur suivante:
package "QL" not found
programme est emballé dans le fichier source, qui suit en-tête:
(defpackage :my-package
(:use :common-lisp)
(:export :my-main-method))
C'est un simple exécutable d'automatisation, j'ai donc décidé (peut-être à tort) de ne pas écrire de système ASDF. Il exporte une seule fonction qui doit être exécutée sans aucun argument.
Pour ce programme, je suis en train d'essayer d'écrire le script de lancement, ce qui est ce que je suis les yeux fixés à:
#!/usr/bin/sbcl --script
(load "my-program.lisp")
(in-package :my-package)
(my-main-method)
Ces trois lignes (sans compter le tralala) est ce que je veux automatiser. Comme je l'ai lu dans la documentation, script avec ce shebang peut être appelé comme ./script.lisp
simple, et il le fait vraiment ... avec l'erreur décrite auparavant.
Qu'est-ce que j'ai besoin d'ajouter dans le lanceur pour :cl-fad
pour charger correctement? Documentation indique que avec l'option --script
SBCL ne charge aucun fichier init, alors dois-je vraiment besoin de copypaste les lignes
#-quicklisp
(let ((quicklisp-init (merge-pathnames "systems/quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
(qui ql:add-to-init-file
ajoute à .sbclrc), à mon script de lancement? Peut-être que j'ai un défaut architectural profond dans la configuration de mon programme?
Et oui, quand j'entre les lignes que j'essaie d'automatiser dans REPL dans le sbcl lui-même, le programme fonctionne comme prévu.
J'ai quicklisp dans le répertoire différent et je ne veux pas _yet_ pour pirater les scripts des autres. :) Coredumping par première méthode a bien fonctionné, j'ai déjà beaucoup de lanceurs dans mon '~/bin'. Et l'image jetée tourne vite aussi. %) – hijarian
Oui! Travailler avec des images est génial! C'est pourquoi les Smalltalkers commencent leur travail au quotidien avec le sourire et les développeurs de Java Eclipse commencent leur propre café. –