我几天前决定学习(普通)Lisp,我意识到这是一个相当新的问题,对于至少有一点经验的人来说,这可能是非常微不足道的.
所以基本上发生的是我加载Emacs + Slime(通过盒子中的Lisp)并编写我的程序(包含在下面):
(defun last-char (s) "Get last character" (char s (- (length s) 1)))
然后我尝试编译它C - c M - k,但后来我收到以下警告:
CHAR既未声明也未绑定,它将被视为已声明为SPECIAL.
这个警告是什么意思?我想它可能类似于忘记C中的#includes,但我无法弄明白.我该怎么办呢?我只是简单地忽略它吗?
警告意味着char
由于某种原因(它报告该符号未绑定,它没有值),因此它不应被识别为函数.
它可能与您的实现有关.我在我的SBCL + Emacs/Slime(和Clozure)中使用Cc Mk运行代码,我从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 #
但也许它不在您的实现中(我猜它没有,考虑到编译器警告和代码在SBCL中正确编译的事实).如果是这种情况,那么这就是你的实现偏离ANSI Common Lisp规范的一个点,因为该函数应该存在.