几天前我决定学习(通用)Lisp,我意识到这是一个新手问题,对于至少有一点经验的人来说可能非常微不足道。
所以基本上发生的事情是我加载 Emacs + Slime(通过 Lisp in a Box)并编写我的程序(包括在下面):
(defun last-char (s) "Get last character"
(char s (- (length s) 1)))
然后我尝试用 C - c M - k 编译它,但随后我收到以下警告:
CHAR is neither declared nor bound, it will be treated as if it were declared SPECIAL.
这个警告是什么意思?我想这可能类似于在 C 中忘记#includes,但我不太明白。我该怎么办?我应该忽略它吗?
最佳答案
警告意味着 char
由于某种原因没有被识别为一个函数,它应该被识别为一个函数(它报告该符号未绑定(bind),它没有值)。
这可能与您的实现有关。我在我的 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>
但也许它不会出现在您的实现中(我猜它不会出现,考虑到编译器警告以及代码在 SBCL 中正确编译的事实)。如果是这种情况,那么这就是您的实现偏离 ANSI Common Lisp 规范的地方,因为该函数应该存在。
关于emacs - Lisp:既未声明也未绑定(bind) CHAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1187262/