我认为这与以下问题完全相同: How to run Common Lisp code with Slime in Emacs Lisp 但它并不是 - 我的问题是,当我尝试运行'slime-eval'或任何slime“run in inferior-lisp-process”方法时,所有符号似乎都只在SWANK-IO-PACKAGE命名空间中查找。
In my Emacs '*scratch*' buffer:
(slime-eval '(symbolp '+) "CL-USER")
产生一个回溯错误:
The function SWANK-IO-PACKAGE::SYMBOLP is undefined.
[Condition of type UNDEFINED-FUNCTION]
Restarts:
0: [CONTINUE] Retry calling SWANK-IO-PACKAGE::SYMBOLP.
1: [USE-VALUE] Call specified function.
2: [RETURN-VALUE] Return specified values.
3: [RETURN-NOTHING] Return zero values.
4: [*ABORT] Return to SLIME's top level.
5: [ABORT] abort thread (#<THREAD "worker" RUNNING {100262C8E3}>)
Backtrace:
0: ("undefined function" SWANK-IO-PACKAGE::+)
1: (SB-INT:SIMPLE-EVAL-IN-LEXENV \
(SWANK-IO-PACKAGE::SYMBOLP (QUOTE SWANK-IO-PACKAGE::+)) \
#<NULL-LEXENV>)
2: (EVAL (SWANK-IO-PACKAGE::SYMBOLP (QUOTE SWANK-IO-PACKAGE::+)))
无论我执行以下哪个操作,都没有任何区别:
(slime-eval '(symbolp :+) "CL-USER")
或者
(slime-eval '(symbolp '+))
我仍然遇到相同的错误,因为“+”和“:+”始终只在SWANK-IO-PACKAGE命名空间中查找。
我通过尝试运行我的第一个测试来发现这个问题。
(slime-eval '(+ 2 2) "CL-USER")
该函数会在输出缓冲区中打印另一个回溯信息。
The function SWANK-IO-PACKAGE::+ is undefined.
[Condition of type UNDEFINED-FUNCTION]
我尝试了问题#22456086中的代码片段:
(require 'slime)
(defun slrepl (str)
"Eval STR as Common Lisp code."
(unless (slime-current-connection)
(let ((wnd (current-window-configuration)))
(slime)
(while (not (and (slime-current-connection)
(get-buffer-window (slime-output-buffer))))
(sit-for 0.2))
(set-window-configuration wnd)))
(let (deactivate-mark)
(cadr (slime-eval `(swank:eval-and-grab-output ,str)))))
所以做:
(slrepl '(symbol-function '+))^X^E
仍然导致:
The function SWANK-IO-PACKAGE::SYMBOL-FUNCTION is undefined.
[Condition of type UNDEFINED-FUNCTION]
默认的SB_INT命名空间似乎被拒绝访问。如何启用它以解决此类问题?
我想要能够从任何缓冲区发送表格并读取相同emacs inferior-lisp-process(sbcl)的结果,而不仅仅是从slime 'slime repl sbcl'缓冲区中发送和读取。有没有办法做到这一点?
显然,我可以编写一个Emacs Lisp函数来切换到slime repl缓冲区并在该缓冲区中进行评估。当然,上述所有示例,例如(eval '(symbolp '+)),在slime-repl缓冲区中运行得很好。我猜想没有绕过切换到slime-repl缓冲区的方法吗?
这可能会澄清:
在 'scratch' 中:
(slime-eval '(SB-INT:symbolp 'SB-INT:+) "CL-USER")^X^E
在史莱姆输出缓冲区中:
Invalid protocol message:
The symbol "SYMBOLP" is not external in the SB-INT package.
Line: 1, Column: 26, File-Position: 26
Stream: #<SB-IMPL::STRING-INPUT-STREAM {1002A1CD63}>
(:emacs-rex (SB-INT:symbolp (quote SB-INT:+)) "CL-USER" t 78)
在 slime-repl 缓冲区中,我可以执行以下操作:
CL-USER> (PROGN (IN-PACKAGE "COMMON-LISP-USER") (+ 2 2))
4
CL-USER> (PROGN (IN-PACKAGE "SB-IMPL") (symbol-function '+))
#<FUNCTION +>
CL-USER> (PROGN (IN-PACKAGE "SB-IMPL") (symbol-function '+))
#<FUNCTION +>
SB-IMPL> (PROGN (IN-PACKAGE "SB-INT") (symbol-function '+))
#<FUNCTION +>
但是如果我尝试在任何其他缓冲区中运行相同的 'slime-eval' 函数,例如 'scratch' :
(slime-eval '(PROGN (COMMON-LISP-USER:IN-PACKAGE "COMMON-LISP-USER")
(symbol-function '+)) :COMMON-LISP-USER)
Invalid protocol message:
The symbol "IN-PACKAGE" is not external in the
COMMON-LISP-USER package.
Line: 1, Column: 46, File-Position: 46
我已经尝试了上面列出的所有可能的包名称,结果都一样。无论是使用“slrepl”代码片段还是普通的slime-eval,都会发生相同的情况 - 没有可用的lisp标准语法符号。我需要加载lisp语法表或其他什么吗?
关于是否可以切换到slime repl缓冲区并执行操作的问题:不行!
(require 'slime)
(let ((slbuf (get-buffer "*slime-repl sbcl*")))
(if (eq nil slbuf)
(error "please start slime (M-x slime)")
(progn (set-buffer slbuf)(slime-eval '(+ 2 2) "COMMON-LISP-USER"))
)
)^X^E
仍然导致:
The function SWANK-IO-PACKAGE::+ is undefined.
[Condition of type UNDEFINED-FUNCTION]
我是一个生疏/回归的LISP用户,对SBCL和slime也很陌生。 我真的很想将Emacs的出色编辑和文件管理及交互功能与外部的CL XML和HTML生成和解析工具集成。但是首先,我只想解决这个问题的根本...
(emacs-rex (swank-io-package::symbolp swank-io-package::+) "CL-USER"))
,然后内部表单被传递到eval-for-emacs
,同时包被绑定,但此时符号已经在 swank-io-package 中被 intern 了。这与 C-x C-e 采取的方法不同,它大致运行(slime-eval-print "(symbolp +)")
。在尝试给出明确答案之前,我可能会进一步调查一下(但现在不行...)。 - coredump