如何在非SLIME缓冲区评估Common Lisp代码?符号查找异常求助
在非SLIME缓冲区中正确评估Common Lisp表达式的解决方案
你碰到的这个问题很典型——Slime默认会在SWANK-IO-PACKAGE这个内部包中处理求值请求,这是Swank为了隔离自身状态设计的,但显然和我们日常使用的用户包(比如COMMON-LISP-USER或者自己定义的包)不兼容,所以才会出现找不到自定义符号的情况。下面给你几个实用的解决办法:
1. 显式指定求值包(最直接的方式)
使用slime-eval-in-package函数替代slime-eval,它允许你指定代码运行的目标包。比如你想在COMMON-LISP-USER包里计算(+ 1 2),可以写:
(slime-eval-in-package '(+ 1 2) "COMMON-LISP-USER")
如果你的代码依赖某个通过quicklisp加载的库包,比如alexandria,只需要把包名换成对应的字符串即可:
(slime-eval-in-package '(alexandria:hash-table-alist *my-hash-table*) "ALEXANDRIA")
2. 修改Slime默认求值包(一劳永逸)
如果大部分时候你都想在某个固定包(比如COMMON-LISP-USER)里求值,可以在Emacs配置中设置slime-default-package变量:
(setq slime-default-package "COMMON-LISP-USER")
设置完成后,再调用slime-eval就会默认使用这个包,不用每次都手动指定了。
3. 直接向Inferior Lisp进程发送代码片段
如果你习惯直接发送字符串形式的代码到进程,可以用slime-repl-send-string。记得先切换到目标包,再执行你的表达式:
(slime-repl-send-string "(in-package :common-lisp-user) (defun my-test () (print \"Hello from user package!\"))")
这种方式更接近在SLIME REPL里手动输入代码的流程,适合一次性执行多段代码。
需要注意的是,如果你自己定义了新的包,要确保这个包已经在SBCL进程中被创建(比如通过(defpackage ...)加载过),否则指定包的时候会报错哦。
内容的提问来源于stack exchange,提问作者JVD
相关产品推荐
相关产品推荐

