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