Emacs 重新编译不';无法更正函数调用中的键入错误

Emacs 重新编译不';无法更正函数调用中的键入错误,emacs,lisp,common-lisp,sbcl,slime,Emacs,Lisp,Common Lisp,Sbcl,Slime,我最近经常看到这种情况,不确定这是SBCL问题、Emacs问题、SLIME问题还是我自己对“编译”lisp文件的理解 我将有一个函数,这样说: (取消某些函数(x)(调用此函数)) 我将编译并运行它,我将得到一个错误,我的函数调用这个funcsun没有定义。然后我意识到这是因为有一个打字错误。因此,改变它: (取消某些函数(x)(调用此函数)) 在Emacs中,我使用Control-C Control-K重新编译整个文件(Emacs在编译之前也会自动保存)。Emacs然后报告编译完成。我转到RE

我最近经常看到这种情况,不确定这是SBCL问题、Emacs问题、SLIME问题还是我自己对“编译”lisp文件的理解

我将有一个函数,这样说:

(取消某些函数(x)(调用此函数))

我将编译并运行它,我将得到一个错误,我的函数
调用这个funcsun
没有定义。然后我意识到这是因为有一个打字错误。因此,改变它:

(取消某些函数(x)(调用此函数))

在Emacs中,我使用Control-C Control-K重新编译整个文件(Emacs在编译之前也会自动保存)。Emacs然后报告编译完成。我转到REPL。我再试一次,键入
(一些函数,不管什么)
,我得到了相同的错误。我搜索了一下小的lisp文件,发现
调用这个函数
显然不在其中。但是我有一个错误,这个函数没有定义


是否存在Emacs或SBCL正在进行的某种缓存导致这种情况出现?它快把我逼疯了。值得注意的是,如果我退出SLIME,然后再次启动它,问题就解决了。还值得注意的是,这不会影响我所有的代码编辑,只是偶尔会发生。

可能是由于某些原因,文件没有加载

我会将
*load verbose*
设置为
T
,并观察
load
实际被调用。
*load print*
设置为
T
也会导致打印有关已加载定义的信息。

可能由于某种原因未加载文件

我会将
*load verbose*
设置为
T
,并观察
load
实际被调用。
*load print*
设置为
T
也会导致打印有关已加载定义的信息。

我看到了两种情况,它们会导致类似于您所看到的行为:

  • 当文件中的符号与REPL处的符号不同时。符号名称只是标识符号的简写,同一简写可以根据您在哪个软件包中使用它来标识不同的符号。有一些方法可以让您对所指的符号感到惊讶,因此,即使您非常确定它们是相同的,也值得使用symbol-PACKAGE进行检查

  • 当缓冲区未保存时。我不确定C-C-k现在如何处理这个问题(因为我编辑它是为了自动保存),但一般来说,编译和加载工具往往是从文件而不是缓冲区工作的


  • 我已经看到了两种情况,它们会导致类似于您所看到的行为:

  • 当文件中的符号与REPL处的符号不同时。符号名称只是标识符号的简写,同一简写可以根据您在哪个软件包中使用它来标识不同的符号。有一些方法可以让您对所指的符号感到惊讶,因此,即使您非常确定它们是相同的,也值得使用symbol-PACKAGE进行检查

  • 当缓冲区未保存时。我不确定C-C-k现在如何处理这个问题(因为我编辑它是为了自动保存),但一般来说,编译和加载工具往往是从文件而不是缓冲区工作的


  • 这不是与你最近的问题完全相同吗?@phils,不是,因为当我进行更改时,程序没有运行。另一个问题是关于在重新编译时当前正在REPL中运行和循环的函数。我很怀疑这是否有关系。你的文件是自动重新加载的吗?您是否尝试过手动重新加载重新编译的文件?@WillNess控件CK组合(即“编译并加载”)几乎总是按照我的预期进行:当我在REPL再次运行它们时,编译和对任何函数的任何更改都会立即出现。但有时情况并非如此,如上所述。典型的工作流程是什么;通常是通过
    load
    函数编译并分别加载REPL吗?@OpenLearner我用低级lisp中的slime和sbcl REPL打开了emacs,并定义了一个函数(defun tstfun(x)(printas 3)),然后按ctrl+c ctrl+k,得到两个警告:1)printas未定义,2)x未使用。然后我改为(defun tstfun(x)(print 3))并按ctrl+c ctrl+k,然后按ctrl+x b切换到低级lisp并调用(tstfun 2)和lisp打印的“3”。这和你想做的一样吗?或者我不明白你的问题?这不是与你最近的问题完全相同吗?@phils,不是,因为当我做出改变时,程序没有运行。另一个问题是关于在重新编译时当前正在REPL中运行和循环的函数。我很怀疑这是否有关系。你的文件是自动重新加载的吗?您是否尝试过手动重新加载重新编译的文件?@WillNess控件CK组合(即“编译并加载”)几乎总是按照我的预期进行:当我在REPL再次运行它们时,编译和对任何函数的任何更改都会立即出现。但有时情况并非如此,如上所述。典型的工作流程是什么;通常是通过
    load
    函数编译并分别加载REPL吗?@OpenLearner我用低级lisp中的slime和sbcl REPL打开了emacs,并定义了一个函数(defun tstfun(x)(printas 3)),然后按ctrl+c ctrl+k,得到两个警告:1)printas未定义,2)x未使用。然后我改为(defun tstfun(x)(print 3))并按ctrl+c ctrl+k,然后按ctrl+x b切换到低级lisp并调用(tstfun 2)和lisp打印的“3”。这和你想做的一样吗?或者我不理解你的问题?我认为这是一个很好的建议(如果问题要解决,可能是必要的),但作为一个评论可能会更好,因为它(无论如何)实际上没有对@OpenLearner的特定问题的答案。@Joshua没有