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