emacs - Lisp:既未声明也未绑定(bind) CHAR

标签 emacs lisp common-lisp slime

几天前我决定学习(通用)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/

相关文章:

recursion - 如何在 Lisp 中制作深度反转函数

common-lisp - 有没有办法在 Mac OS 上使用动态 FFI 支持编译 CLISP?

cocoa - Cocoa Emacs 中的选项键不输入重音字符

emacs - 在 Emacs 中重新定义主模式前缀键

format - cl :format 列表中每三个单词后换行

emacs - 使用 SLIME 在远程 Emacs 上完成 Tab 键

lisp - Common Lisp中有没有像Python的 `if __name__ == "__main_ _":`之类的东西

common-lisp - CLOS 是否对字符串有 eql 特化调度?

emacs - 如何使 .emacs 文件具有幂等性?

android - Java代码缩进错误