Lisp:CHAR既未声明也未绑定

时间:2009-07-27 09:26:17

标签: emacs lisp common-lisp slime

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

所以基本上发生的事情是我加载Emacs + Slime(通过盒子中的Lisp)并编写我的程序(包含在下面):

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

然后我尝试使用 C - c M - k 编译它,但后来我收到以下警告:

  

CHAR既未宣布也未受约束,        它将被视为特别声明。

这个警告是什么意思?我想它可能类似于忘记C中的#includes,但我无法弄明白。我该怎么办呢?我只是简单地忽略它吗?

2 个答案:

答案 0 :(得分:5)

警告意味着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>

但也许它不在您的实现中(我猜它没有,考虑到编译器警告和代码在SBCL中正确编译的事实)。如果是这种情况,那么这就是你的实现偏离ANSI Common Lisp规范的一个点,因为该函数应该在那里。

答案 1 :(得分:1)

关于缩进的说明。这是一个更传统的缩进:

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