문제

나는 며칠 전에 (일반적인) LISP를 배우기로 결정했으며 이것이 꽤 초보자 질문이라는 것을 알고 있으며, 아마도 적어도 약간의 경험을 가진 사람에게는 매우 사소한 일입니다.

기본적으로 EMACS + SLIME (상자에 LISP를 통해)을로드하고 내 프로그램 (아래 포함)을 작성하는 것입니다.

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

그런 다음 컴파일하려고합니다 C -c m -k, 그러나 다음과 같은 경고를받습니다.

Char는 선언되거나 구속력이 없으며, 특별한 선언 된 것처럼 취급 될 것입니다.

이 경고의 의미는 무엇입니까? 나는 그것이 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
#<FUNCTION CHAR>

그러나 구현에 있지 않을 수도 있습니다 (컴파일러 경고와 코드가 SBCL에서 올바르게 컴파일된다는 사실을 감안할 때 그렇지 않은 것 같습니다). 이 경우, 이는 구현이 ANSI Common LISP 사양에서 벗어나는 시점입니다. 그 기능이 있어야하기 때문입니다.

다른 팁

당신의 들여 쓰기에 관한 메모. 다음은보다 전통적인 들여 쓰기입니다.

(defun last-char (s)
  "Get last character"
  (char s (- (length s) 1)))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top