2013-05-23 2 views
0

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

+0

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. –

+0

Merci pour votre avis. Mais je veux vraiment savoir la raison de mon problème. – xiepan

+0

@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. –

Répondre

1

Le lecteur lit la forme PROGN comme une forme unique dans le package en cours. Les symboles proviennent de ce package alors.

Essayez donc d'exporter le symbole COMMON-LISP-USER::PREFEXP à partir du package PREGEXP.

Vous devez vous assurer que vous exportez le bon symbole (qui se trouve dans le bon paquet).

+0

Mais j'utilise le (in-package: pregexp) avant l'expression d'exportation. Alors les symboles pregexp, pregexp-match-positions ... etc ne sont pas dans le paquet: pregexp? Je vous remercie. – xiepan

+0

@xiepan: pourquoi un IN-PACKAGE aurait-il un effet sur les symboles déjà existants ??? –

0

Rainer Joswig's answer mentionne quelques-unes des choses qui se produisent avec le lecteur, interner et l'exportation, mais je me demande si le problème que vous rencontrez est pas plus facilement évité en utilisant la clause :export de defpackage. Si vous l'utilisez, vous pouvez écrire votre formulaire defpackage comme:

(defpackage :pregexp 
    (:use :common-lisp) 
    (:documentation "Portable Regular Expression Library") 
    (:nicknames :pre)) 
    (:export #:pregexp     ; or :pregexp, or "PREGEXP" 
      #:pregexp-match-positions 
      #:pregexp-match 
      #:pregexp-split 
      #:pregexp-replace 
      #:pregexp-replace* 
      #:pregexp-quote)) 

Même si ces fonctions nom des symboles, il n'y a pas besoin de définir ces fonctions avant d'exporter les symboles avec lesquels ils sont associés. (Je ne le mentionne que parce que le code de la question définit le paquet, puis charge (vraisemblablement) les définitions de fonction, puis exporte les symboles, les choses ne doivent pas se passer dans cet ordre, par exemple, définir le paquet, exporter le symboles, puis définissez les fonctions.)

+0

Bonjour Taylor, merci beaucoup pour votre réponse. – xiepan