我想了解nqthm-1992代码,这是一个古老的定理证明器。
我使用ECL作为lisp解释器,并建议使用slime包来找出常见的lisp定义和解释。它在常见的lisp声明上表现良好,但在nqthm声明上失败。如何将nqthm的events.lisp
加载到我的emacs缓冲区中,如何配置它以便找到所有声明?
更新:根据建议,我重新配置了emacs-slime以使用sbcl。试图查找ITERATE的定义,它给出了以下消息:
Unknown symbol: ITERATE [in #<PACKAGE "COMMON-LISP-USER">]
[Condition of type SIMPLE-ERROR]
Restarts:
0: [*ABORT] Return to SLIME's top level.
1: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker" RUNNING {1004942B81}>)
Backtrace:
0: (SWANK::PARSE-SYMBOL-OR-LOSE "ITERATE" #<PACKAGE "COMMON-LISP-USER">)
1: ((LAMBDA ()))
2: (SWANK::CALL-WITH-BUFFER-SYNTAX NIL #<CLOSURE (LAMBDA #) {1004948CA9}>)
3: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK:DESCRIBE-SYMBOL "ITERATE") #<NULL-LEXENV>)
4: (SWANK:EVAL-FOR-EMACS (SWANK:DESCRIBE-SYMBOL "ITERATE") "\"USER\"" 2)
5: ((LAMBDA ()))
6: (SWANK-BACKEND::CALL-WITH-BREAK-HOOK #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<FUNCTION (LAMBDA #) {1006D4AFF9}>)
7: ((FLET SWANK-BACKEND:CALL-WITH-DEBUGGER-HOOK) #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<FUNCTION (LAMBDA #) {1006D4AFF9}>)
8: ((LAMBDA ()))
9: ((FLET #:WITHOUT-INTERRUPTS-BODY-[BLOCK369]374))
10: ((FLET SB-THREAD::WITH-MUTEX-THUNK))
11: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-MUTEX]300))
12: (SB-THREAD::CALL-WITH-MUTEX ..)
13: (SB-THREAD::INITIAL-THREAD-FUNCTION)
14: ("foreign function: #x41E240")
15: ("foreign function: #x416117")
我该如何做到这一点?
答案 0 :(得分:2)
看起来很像SLIME无法找到您想要的代码,因为它查找错误的软件包:您显示的错误是SBCL说&#34;我查看了:cl-user并且找不到任何名为ITERATE&#34;。
的东西当你说&#34;试图查找ITERATE&#34;的定义时,我想你的意思是你在缓冲区中输入M-.
之类的(iterate ...)
。问题是SLIME和Emacs不知道你指的是nqthm.lisp
中定义的那个。我刚刚下载了nqthm的副本,它看起来相当陈旧,但看起来它定义了USER
包中的迭代宏。您可以在repl处键入(apropos "ITERATE")
来查看此信息。在SBCL中,您会看到几个特定于SBCL的符号,但(假设您已成功加载nqthm.lisp
,您还应该看到类似USER:ITERATE
的内容。
从你的问题来看,我认为你是lisp的新手,所以我不会进入有关软件包的技术细节。如果你只是想在缓冲区中键入内容并让Emacs和SLIME做正确的事情来使用nqthm的东西,我认为你应该能够放
(in-package "USER")
在缓冲区的顶部并完成它。如果您希望repl也能工作,请将该字符串复制并粘贴到其中,或者在repl缓冲区中使用C-c M-p。
答案 1 :(得分:1)
对于经验丰富的lisp和emacs / slime用户,我的最终答案包含一些显而易见的事情,但这些对我来说并非无足轻重:
我必须将当前目录设置为nqthm根目录:
(要求&#39; asdf)(uiop / os:chdir&#34; / path / to / nqthm&#34;)
我必须将nqthm加载代码添加到顶部:
(load&#34; nqthm.lisp&#34;) (包装内&#34;用户&#34;) (负载nqthm) (boot-strap nqthm)
然后选择上面的代码并使用M-x slime-eval-region
系统引导nqthm,M-.
找到所需标识符的定义。
现在出现了一个有趣的部分:如果我在启动时加载上面修改过的文件并告诉slime C-c C-k
编译它,它会给我以下错误信息:
cd /home/gergoe/local/nqthm-1992/
4 compiler notes:
secd.events:29:1:
style-warning:
Style warning:
in file secd.events, position 748
at (BOOT-STRAP NQTHM)
! Variable NQTHM was undefined. Compiler assumes it is a global.
secd.events:34:1:
style-warning:
Style warning:
in file secd.events, position 824
at (ADD-SHELL LAMBDA ...)
! Variable LAMBDA was undefined. Compiler assumes it is a global.
style-warning:
Style warning:
in file secd.events, position 824
at (ADD-SHELL LAMBDA ...)
! Variable LAMBDAP was undefined. Compiler assumes it is a global.
error:
Error:
in file secd.events, position 824
at (ADD-SHELL LAMBDA ...)
* (LBODY (NONE-OF) ZERO) is not a legal function name.
Compilation failed.
有人可以解释一下吗?评估和编译之间是否存在语义差异?