我几天前决定学习(普通)Lisp,我意识到这是一个非常新手的问题,对于至少有一点经验的人来说,这可能是非常微不足道的。
所以基本上发生的事情是我加载Emacs + Slime(通过盒子中的Lisp)并编写我的程序(包含在下面):
(defun last-char (s) "Get last character"
(char s (- (length s) 1)))
然后我尝试使用 C - c M - k 编译它,但后来我收到以下警告:
CHAR既未宣布也未受约束, 它将被视为特别声明。
这个警告是什么意思?我想它可能类似于忘记C中的#includes,但我无法弄明白。我该怎么办呢?我只是简单地忽略它吗?
答案 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)))