我想要的只是为 swank 加载一个初始化文件,当它在没有 swank 的情况下启动时不会影响我的 lisp...
我首先在从 ccl-init 加载的文件中尝试了#+swank (defun...)(在 ccl 1.10 + windows 上尝试),很快意识到它是在加载 swank 之前获取的(显然)。
我的目标是每次开始 swank 时在 :cl-user 中定义一个简单的函数。我刚刚用一个时髦的 add-hook 来加载我的 init.lisp 文件,因为我想在 cl-user 中定义函数,所以我在 init.lisp 中尝试了这个:
(let ((current-package *package*))
(in-package :cl-user)
(defun cd (dir)
(swank:set-default-directory
(parse-namestring dir)))
(in-package current-package))
现在,我不记得 let 中的 defun 是否被允许,但 lisp 并没有抱怨,而是告诉我 cur-pck 符号不存在,当我们切换包时,似乎是 cur-pck绑定超出范围。我认为 cur-pck 是一个词法绑定,它应该可以从词法区域内访问,独立于一个包,我错了吗?
为什么要切换套餐?我在想,在某个初始化点从 swank 加载这个文件将定义一些 swank 包中的东西,这就是为什么我想先尝试切换到 cl-user,定义函数符号,然后切换回让 swank 做这件事。
在这一点上,我想我需要有人告诉我我从错误的角度处理问题,我应该更好地选择一个更简单的解决方案。
此外,出于好奇,如果上述方法完全错误,有没有办法在函数或闭包内的另一个包中定义符号?