3

我正在尝试从 SBCL 非标准内置函数中导入一些函数以与套接字一起使用。当我在外部粘液中执行此操作时,使用裸交互式 shell + 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

如果“可纠正错误”是指“名称冲突”,那么您可以通过定义自己的包并使用:shadowand:shadowing-import-from子句来处理这个问题。有关详细信息,请查看PCL的第 21 章。

简短的回答:如果您尝试导入已在当前包中定义的新符号,则需要 doshadowing-import而不是标准import(尽管您实际上应该使用相应的子句defpackage而不是自己调用这些子句)。

对于第二部分,“编译函数”是什么意思?当我评估从 ing 两部分nslookup-1之后的第二个定义时,它工作正常。您确定要在已导入适当功能的包中对其进行评估吗?shadowing-import:sb-bsd-sockets

于 2012-06-01T13:30:40.203 回答
0

将包导入 SLIME 的 REPL

你不能将包导入 SLIME 的 REPL,因为这样的概念是不存在的。“REPL”不能导入包。

符号可以属于某个包。可以将符号导入包中。您还可以将导出的符号从一个包导入到另一个包中。

阅读器有一个当前包,符号的值cl:*package*。当你与 Lisp 交互时,这个包被用作默认包。每当您将文件或类型编译为 REPL 之类的东西时,都会使用此默认包。

您需要控制正在使用的包类型。例如,这就是为什么您将 a 放在(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 回答