代码之家  ›  专栏  ›  技术社区  ›  Tamas Czinege

lisp:char既没有声明也没有绑定

  •  5
  • Tamas Czinege  · 技术社区  · 15 年前

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

    所以基本上,我会加载emacs+slime(通过一个框中的lisp)并编写我的程序(包括以下内容):

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

    然后我试着用 C-C M - K 但是我得到了以下警告:

    char既没有声明也没有绑定, 它将被视为特别声明。

    这个警告是什么意思?我想这可能和C语言中的遗忘相似,但我不太明白。我该怎么办?我可以不理它吗?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Pinochle    15 年前

    警告意味着 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中正确编译)。如果是这样的话,那么您的实现就偏离了ANSICommonLisp规范,因为该函数应该在那里。

        2
  •  1
  •   Luís Oliveira    15 年前

    只是一个关于压痕的注释。这里有一个更传统的压痕:

    (defun last-char (s)
      "Get last character"
      (char s (- (length s) 1)))
    
    推荐文章