3

ソケットで使用するために、SBCLの非標準ビルトインからいくつかの関数をインポートしようとしています。スライムの外でこれを行うと、裸​​のインタラクティブシェル+ SBCLで機能しますが、SLIMEでは機能しません。

私がしたこと:

(import 'sb-bsd-sockets:host-ent-address)
(import 'sb-bsd-sockets:get-host-by-name)

また

(use-package :sb-bsd-sockets)

いずれかを実行した後、SLIMEは、すでにcl-userパッケージに含まれているものをインポートしようとしているというエラーで私に挨拶します。これは修正可能なエラーであり、sb-bsd-socketsパッケージにある記号を選択して修正します。それ以上のエラーは続きません。

次に、関数をコンパイルしようとすると、次のようになります。

(defun nslookup (hostname) 
  (if hostname 
      (sb-bsd-sockets:host-ent-address (sb-bsd-sockets:get-host-by-name hostname)) 
      nil))

できます。しかし、これをコンパイルしようとすると:

(defun nslookup-1 (hostname) 
  (if hostname 
      (host-ent-address (get-host-by-name hostname)) 
      nil))

次に、未定義の関数に関する警告と、を呼び出そうとするとエラーが発生しますnslookup-1

驚いたことに、REPLでこれを実行しようとすると:

CL-USER> #'host-ent-address
#<STANDARD-GENERIC-FUNCTION HOST-ENT-ADDRESS (1)>
CL-USER> 

できます"。つまり、機能は知っていますが、使用しないことにしました...

パッケージをSLIMEのREPLにインポートするか、少なくともそれらのパッケージからシンボルをインポートするための(特別な?)方法が必要です。そうでない場合、テストに長い名前を使用してから実際のプログラムに置き換えるのは非常に不便です...

4

2 に答える 2

2

「修正可能なエラー」が「名前の競合」を意味する場合、それは独自のパッケージを定義し:shadow:shadowing-import-from句を使用することで処理できる問題です。詳細については、PCL の第 21 章を確認してください。

簡単な答え: 現在のパッケージで既に定義されている新しいシンボルをインポートしようとしている場合shadowing-importは、標準の代わりに行う必要がimportあります (実際にdefpackageは、それらを自分で呼び出すのではなく、対応する句を使用する必要があります)。

パート 2 では、「関数をコンパイルする」とはどういう意味ですか? から 2 つの部分を ing したnslookup-1後にの2 番目の定義を評価すると、正常に動作します。適切な関数を既にインポートしたパッケージで評価しようとしているのですか?shadowing-import:sb-bsd-sockets

于 2012-06-01T13:30:40.203 に答える
0

パッケージをSLIMEのREPLにインポートする

そのような概念が存在しないため、SLIMEのREPLにパッケージをインポートすることはできません。'REPL'はパッケージをインポートできません。

シンボルはいくつかのパッケージに属することができます。シンボルはパッケージにインポートできます。エクスポートされたシンボルをあるパッケージから別のパッケージにインポートすることもできます。

リーダーには現在のパッケージ、シンボルの値がありますcl:*package*。Lispを操作すると、このパッケージがデフォルトのパッケージとして使用されます。ファイルをコンパイルしたり、REPLのようなものに入力したりするときはいつでも、このデフォルトのパッケージが使用されます。

使用するパッケージの種類を制御する必要があります。(in-package "FOO")これは、たとえば、ファイルの先頭にを置く理由です。(in-package "FOO")REPLに入力して、*package*という名前のパッケージにすることもできますFOO

foo(の代わりに)パッケージ修飾子なしでシンボルを使用する場合は、このパッケージまたはこれらのシンボルをインポートするパッケージbar:fooに設定する必要があります。*package*

したがって、必要なのは、cl:packageが正しいパッケージを指していることを確認し、シンボルをインポートする場合は、それらを正しいパッケージにインポートすることです。

例:

CL-USER 191 > (defpackage "FOO" (:use "CL"))
#<The FOO package, 0/16 internal, 0/16 external>

CL-USER 192 > *package*
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external>

CL-USER 193 > (defpackage "FOO" (:use "CL"))
#<The FOO package, 0/16 internal, 0/16 external>

CL-USER 194 > cl:*package*
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external>

CL-USER 195 > (in-package "FOO")
#<The FOO package, 0/16 internal, 0/16 external>

FOO 196 > cl:*package*
#<The FOO package, 0/16 internal, 0/16 external>
于 2012-06-11T12:22:34.953 に答える