将包导入SLIME REPL

时间:2012-06-01 12:05:59

标签: lisp common-lisp packages slime sbcl

我正在尝试从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,或至少将这些软件包中的符号导入,否则使用长名称进行测试然后将其替换为实际程序是非常不方便的...

2 个答案:

答案 0 :(得分:2)

如果出现“可纠正的错误”,则表示“名称冲突”,这是您可以通过定义自己的包并使用:shadow:shadowing-import-from子句来处理的问题。有关详细信息,请查看Chapter 21 of PCL

简短回答:如果您尝试导入已在当前包中定义的新符号,则需要执行shadowing-import而不是标准import(尽管您应该使用对defpackage的相应条款,而不是自己打电话。)

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

答案 1 :(得分:0)

  

将包导入SLIME的REPL

您无法将包导入SLIME的REPL,因为这样的概念不存在。 'REPL'无法导入包。

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

读者有一个当前包,符号cl:*package*的值。当您与Lisp交互时,此包用作默认包。无论何时编译文件或键入类似REPL的东西,都会使用此默认包。

您需要控制正在使用的包类型。这就是为什么你在文件的开头加上(in-package "FOO")的原因。您还可以将(in-package "FOO")键入REPL,然后*package*是名为FOO的包。

如果您想使用没有包限定符的符号(foo而不是bar:foo),那么您需要将*package*设置为此包或导入这些符号的包

因此,您所要做的就是确保cl:指向正确的包,如果您导入符号,则将其导入正确的包中。

示例:

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>