LISP : Char는 선언되지 않거나 구속되지 않습니다
-
19-09-2019 - |
문제
나는 며칠 전에 (일반적인) 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)))