2013-05-23 4 views
0

SBCL에서 정규 표현식 연산에 "pregexp"패키지를 사용합니다. 함수가 패키지에 정의되어 있지 않으므로 다음 코드를 포장하십시오.내보내기 기호에 sbcl 오류가 발생했습니다.

--------------- "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)) 

나는 시작 에서 "foo.lisp"을로드하려면시 초기화 파일 "~/.sbclrc"에 코드를 넣어. 이제는 괜찮아요. SBCL을 시작할 때 오류가 없습니다.

그럼 내가 눈치가 내가 거기 기능이 이미 수출 있다는 경고는, 그래서 코드 변경 "foo.lisp"를 다시로드 할 때마다 :

을 ------------ --- 파일 "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*) 

) 

에 난 단지마다`progn '블록의 코드를 포장하지만, SBCL을 시작합니다. 은 오류입니다 :

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] 

그럼 이제 어떻게해야합니까?

PS, 환경 : SBCL의 86 1.1.4 Windows Server 2003의 32 비트

+0

저는 pregexp 라이브러리에 대해 모르겠습니다. cl-ppcre를 사용하고 싶지 않으십니까? 그것은 Quicklisp을 통해로드 가능하며 틀림없이 모든 플랫폼에서 최고의 정규 표현식 구현 중 하나입니다. –

+0

조언 해 주셔서 감사합니다. 그러나 나는 정말로 내 문제의 이유를 알고 싶다. – xiepan

+0

@xiepan [Rainer 's answer] (http://stackoverflow.com/a/16710626/1281433)는 문제의 원인을 직접적으로 해결했습니다. 독자는 무엇이든 평가되기 전에'(progn ...) '형식 전체를 읽어야합니다. 독자가 예를 들어'(x y)'를 읽었을 때'x '와'y'가 기호 인 경우, 그것을 일부 패키지의 기호로 읽어야합니다. 읽은 후 폼은'(cl : progn ... (cl : in-package pregex)) ... (cl : export '(cl-user : pregexp ...))' user : pregexp'를 패키지 "PREGEX"'에서 가져 왔지만 그 패키지에는 그 심볼이 보이지 않으므로 패키지에서 내보낼 수 없습니다. –

답변

1

에 독자는 현재 패키지에서 하나의 형태로 PROGN 양식을 읽습니다. 기호는 그 패키지의 기호입니다.

패키지에서 COMMON-LISP-USER::PREFEXP 기호를 내보내려고합니다.

올바른 기호 (올바른 패키지에 있음)를 내보낼 수 있어야합니다.

+0

하지만 내보내기 표현식 앞에서 (in-package : pregexp)를 사용합니다. 그렇다면 pregexp, pregexp-match-positions ... 등의 기호는 : pregexp 패키지에 없습니까? 고맙습니다. – xiepan

+0

@xiepan : IN-PACKAGE가 이미 기존 기호에 영향을주는 이유는 무엇입니까 ??? –

0

Rainer Joswig's answer는 인턴, 수출, 독자와 함께 발생하는 몇 가지를 언급,하지만 난 당신이 발생하는 문제가 더 쉽게 defpackage:export 절을 사용하여 피하지 않을 경우 궁금합니다. 심지어 그 귀하의 이름 기능 경우

(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)) 

, 그들은 연결되어있는 기호를 내보내기 전에 그 함수를 정의 할 필요가 없습니다 : 당신이 그것을 사용하는 경우, 당신은 당신의 defpackage 양식을 작성할 수 있습니다. (이 질문에있는 코드는 패키지를 정의하고 함수 정의를로드 한 다음 심볼을 내 보냅니다. 그 순서대로 수행 할 필요는 없습니다. 예를 들어 패키지를 정의하고 기호를 입력 한 다음 함수를 정의하십시오.)

+0

안녕하세요, Taylor, 답변 해 주셔서 감사합니다. – xiepan

관련 문제