遵循lisp代码库中的定义

时间:2014-05-01 19:16:57

标签: lisp common-lisp slime ecl

我想了解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") 

我该如何做到这一点?

2 个答案:

答案 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.

有人可以解释一下吗?评估和编译之间是否存在语义差异?