J'utilise le package "pregexp" pour les opérations d'expressions régulières dans SBCL. Parce que les fonctions ne sont pas définies dans un paquet, j'ai les codes ci-dessous à envelopper:Erreur sbcl sur les symboles d'exportation
--------------- dans le fichier "foo.lisp" - ---------------
(defpackage :pregexp
(:use :common-lisp)
(:documentation "Portable Regular Expression Library")
(:nicknames :pre))
(in-package :pregexp)
(load (merge-pathnames "libs/pregexp/pregexp" CL-USER:*x-code-path*))
(export '(pregexp
pregexp-match-positions
pregexp-match
pregexp-split
pregexp-replace
pregexp-replace*
pregexp-quote))
Je mets les codes dans le fichier initilization "~/.sbclrc", pour charger le "foo.lisp" sur à partir. C'est juste OK maintenant, et aucune erreur quand je lance SBCL.
Je remarqué que chaque fois que je recharge « foo.lisp », il y a des avertissements que les fonctions déjà exportées, donc je changer les codes:
------------ --- dans le fichier "foo.lisp" -----------------
#-pregexp
(progn
(defpackage :pregexp
(:use :common-lisp)
(:documentation "Portable Regular Expression Library")
(:nicknames :pre))
(in-package :pregexp)
(load (merge-pathnames "libs/pregexp/pregexp" CL-USER:*x-code-path*))
(export '(pregexp
pregexp-match-positions
pregexp-match
pregexp-split
pregexp-replace
pregexp-replace*
pregexp-quote))
(pushnew :pregexp *features*)
)
Je n'Envelopper les codes dans un bloc `de progn », mais à chaque fois Je commence SBCL, il est erreur:
debugger invoked on a SB-KERNEL:SIMPLE-PACKAGE-ERROR in thread
#<THREAD "main thread" RUNNING {23EF7A51}>:
These symbols are not accessible in the PREGEXP package:
(COMMON-LISP-USER::PREGEXP COMMON-LISP-USER::PREGEXP-MATCH-POSITIONS
COMMON-LISP-USER::PREGEXP-MATCH COMMON-LISP-USER::PREGEXP-SPLIT
COMMON-LISP-USER::PREGEXP-REPLACE COMMON-LISP-USER::PREGEXP-REPLACE*
COMMON-LISP-USER::PREGEXP-QUOTE)
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [CONTINUE] IMPORT these symbols into the PREGEXP package.
1: [RETRY ] Retry EVAL of current toplevel form.
2: Ignore error and continue loading file "C:\\test\\bar.lisp".
3: [ABORT ] Abort loading file "C:\\test\\bar.lisp".
4: Retry EVAL of current toplevel form.
5: Ignore error and continue userinit file "C:\\user\\Dropbox\\.sbclrc".
6: Abort userinit file "C:\\user\\Dropbox\\.sbclrc".
7: Skip to toplevel READ/EVAL/PRINT loop.
8: [EXIT ] Exit SBCL (calling #'EXIT, killing the process).
((FLET SB-IMPL::THUNK :IN EXPORT))
0]
Alors, que dois-je faire maintenant?
PS, les environnements: SBCL x86 1.1.4 sur Windows Server 2003 32 bits
Je ne connais pas la bibliothèque pregexp. Êtes-vous sûr de ne pas vouloir utiliser cl-ppcre? Il est chargeable via Quicklisp et est sans doute l'une des meilleures implémentations d'expressions rationnelles sur n'importe quelle plate-forme. –
Merci pour votre avis. Mais je veux vraiment savoir la raison de mon problème. – xiepan
@xiepan [La réponse de Rainer] (http://stackoverflow.com/a/16710626/1281433) a abordé la cause du problème assez directement. Le lecteur doit lire tout le formulaire '(progn ...)' avant que tout puisse être évalué. Lorsque le lecteur lit, par exemple, '(x y)' où 'x' et' y' sont des symboles, il doit les lire comme des symboles d'un paquet. Après la lecture, votre formulaire est '(cl: progn ... (cl: in-package" pregex ") ... (cl: export '(cl-utilisateur: pregexp ...))), donc' export' essaie d'exporter 'cl- user: pregexp' à partir du paquet nommé '" PREGEX "', mais ce symbole n'est pas visible dans ce paquet, donc il ne peut pas être exporté à partir de celui-ci. –