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 비트
저는 pregexp 라이브러리에 대해 모르겠습니다. cl-ppcre를 사용하고 싶지 않으십니까? 그것은 Quicklisp을 통해로드 가능하며 틀림없이 모든 플랫폼에서 최고의 정규 표현식 구현 중 하나입니다. –
조언 해 주셔서 감사합니다. 그러나 나는 정말로 내 문제의 이유를 알고 싶다. – xiepan
@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"'에서 가져 왔지만 그 패키지에는 그 심볼이 보이지 않으므로 패키지에서 내보낼 수 없습니다. –