0

SBCL での正規表現操作には「pregexp」パッケージを使用します。関数はパッケージで定義されていないため、以下のコードでラップします。

--------------- ファイル "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))

初期化ファイル「~/.sbclrc」にコードを入れて、起動時に「foo.lisp」をロードします。これで問題ありません。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 x86 1.1.4 Windows Server 2003 32 ビット上

4

2 に答える 2

1

PROGNリーダーは、フォームを現在のパッケージ内の単一のフォームとして読み取ります。シンボルはそのパッケージからのものです。

COMMON-LISP-USER::PREFEXPそのため、パッケージからシンボルをエクスポートしてみてくださいPREGEXP

正しいシンボル (正しいパッケージにある) をエクスポートしていることを確認する必要があります。

于 2013-05-23T09:47:16.113 に答える
0

Rainer Joswig's answerは、リーダー、インターン、およびエクスポートで発生するいくつかのことについて言及していますが、あなたが抱えている問題は:exportdefpackage. これを使用する場合は、defpackageフォームを次のように記述できます。

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

これらのシンボルが関数を指定している場合でも、関連付けられているシンボルをエクスポートする前にそれらの関数を定義する必要はありません。(問題のコードはパッケージを定義し、(おそらく)関数定義をロードし、シンボルをエクスポートするため、言及するだけです。物事はその順序で発生する必要はありません。たとえば、パッケージを定義し、シンボルを定義してから、関数を定義します)。

于 2013-05-23T14:51:59.427 に答える