Emacs Lisp:CHAR既不声明也不绑定

Emacs Lisp:CHAR既不声明也不绑定,emacs,lisp,common-lisp,slime,Emacs,Lisp,Common Lisp,Slime,几天前,我决定学习(Common)Lisp,我意识到这是一个相当新的问题,对于至少有一点经验的人来说,这可能是非常微不足道的 因此,基本上,我加载Emacs+Slime(通过一个方框中的Lisp)并编写我的程序(包括以下内容): 然后我尝试用C-C M-k编译它,但是我得到了以下警告: CHAR既不声明也不受约束, 它将被视为是特殊的 这个警告是什么意思?我想这可能类似于C中的遗忘,但我不太明白。我该怎么办?我可以忽略它吗?警告意味着由于某种原因,char没有被识别为函数,因为它应该被识别(它报

几天前,我决定学习(Common)Lisp,我意识到这是一个相当新的问题,对于至少有一点经验的人来说,这可能是非常微不足道的

因此,基本上,我加载Emacs+Slime(通过一个方框中的Lisp)并编写我的程序(包括以下内容):

然后我尝试用C-C M-k编译它,但是我得到了以下警告:

CHAR既不声明也不受约束, 它将被视为是特殊的


这个警告是什么意思?我想这可能类似于C中的遗忘,但我不太明白。我该怎么办?我可以忽略它吗?

警告意味着由于某种原因,
char
没有被识别为函数,因为它应该被识别(它报告符号未绑定,它没有值)

这可能与您的实现有关。我已经在我的SBCL+Emacs/Slime(和Clozure)中使用C-C M-k运行了您的代码,我从SBCL中的编译中得到了以下报告:

; in: DEFUN LAST-CHAR
;     (CHAR S (- (LENGTH S) 1))
; --> AREF 
; ==>
;   (SB-KERNEL:HAIRY-DATA-VECTOR-REF ARRAY SB-INT:INDEX)
; 
; note: unable to
;   optimize
; due to type uncertainty:
;   The first argument is a STRING, not a SIMPLE-STRING.
; 
; note: unable to
;   avoid runtime dispatch on array element type
; due to type uncertainty:
;   The first argument is a STRING, not a SIMPLE-ARRAY.
试着打字

#'char 
在REPL上,响应应该是报告它是一个函数

CL-USER> #'char
#<FUNCTION CHAR>
CL-USER>#'char
#

但在您的实现中可能没有(我猜没有,因为编译器警告以及代码在SBCL中正确编译的事实)。如果是这种情况,那么这就是您的实现偏离ANSI Common Lisp规范的地方,因为该函数应该存在。

只是关于缩进的一个注释。这里有一个更传统的压痕:

(defun last-char (s)
  "Get last character"
  (char s (- (length s) 1)))

文件中有一个单词CHAR是一个变量。用c-cmk编译整个文件。检查你的档案,里面有什么?只有上述功能?雷纳·乔斯维格:事实就是这样。我通常使用C-C-C只(重新)编译顶层表单。如果出现奇怪的情况,请重新缩进整个文件(C-M-q,将整个文件作为区域),并查找奇怪的格式。在您的例子中,您可能会注意到函数体奇怪地缩进;这是一个提示,与您假定的相反,它不是文件中的顶级表单。我还将查看编译器输出-它应该说明警告是针对哪个函数的。如果您有一个编译器输出浏览器,那么您甚至可以跳转到有问题的源代码。谢谢您的建议,它们都非常有用。非常感谢!原来函数就在那里,我只是忽略了另一个函数中的一个键入错误,这就是导致问题的原因。您的回答之所以非常有用,是因为它让我确信问题确实存在于我的代码中,而不是其他地方。
(defun last-char (s)
  "Get last character"
  (char s (- (length s) 1)))