Common Lisp动态切换包遇问题?自定义工具求解
问题解答
1. 如何向in-package传递动态包名实现切换
in-package是编译期宏,它会在代码展开阶段就把参数当作字面量包名(符号或字符串)处理,无法直接接收运行时的变量值。要实现动态切换包,直接操作全局变量*package*即可——这也是in-package底层的核心逻辑。
修改你的change-package函数:
(defun change-package () (format t "package name > ") (let ((package-name (read))) (setf *package* (find-package package-name))))
运行时输入的包名(无论是符号:new-package还是字符串"NEW-PACKAGE")都会被find-package解析为对应的包对象,赋值给*package*后就能完成动态切换。
2. 最少按键的快捷切换方式
- Slime环境下:直接使用
,in 包名(,in是,in-package的缩写),比手动输入(in-package :包名)节省大量按键。 - 自定义极简函数:在常用包(比如
cl-user)定义一个短名函数:
调用时只需输入(defun i (p) (setf *package* (find-package p)))(i :目标包)即可。 - 部分CL实现支持:比如SBCL允许在REPL直接输入
:in-package 包名,省去括号进一步减少按键。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

