2009-07-27 10 views
5

며칠 전 (Common) Lisp을 배우기로 결심했습니다. 그리고 이것은 꽤 초보자 용 질문이며 적어도 약간의 경험이있는 사람에게는 매우 사소한 것임을 알고 있습니다.Lisp : CHAR는 선언도 바인딩도하지 않습니다.

그래서 기본적으로 무슨 일 나는 (상자에 리스프를 통해) 이맥스 + 점액을로드하고 내 프로그램 (아래 포함) 쓰기 때문이다 :

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

을 그리고 나는 C로 컴파일하려고 - CM - 케이, 그러나 나는 다음과 같은 경고 얻을 :

CHAR 선언되지도 구속되지도, 이 특별 선언 된 것처럼이 처리됩니다.

이 경고의 의미는 무엇입니까? 나는 C 언어의 #include를 잊어 버리는 것과 비슷할 수도 있다고 생각하지만, 나는 그것을 이해할 수 없다. 그것에 대해 어떻게해야합니까? 난 그냥 무시할까?

+4

는 변수 파일에 일부 단어 CHAR있다. c-c m-k로 전체 파일을 컴파일합니다. 파일을 확인하십시오. 거기에 무엇이 있습니까? 위 기능 만? 그러면 오류가 표시되지 않습니다. –

+0

Rainer Joswig : 그게 정확히 일어난 일입니다. –

+1

나는 일반적으로 C-C C-C를 사용하여 최상위 폼만 컴파일 (다시)합니다. 이상한 일이 발생하면 전체 파일 (C-M-q 전체 파일을 영역으로 다시 들여 쓰기)을 입력하고 이상한 서식을 찾으십시오. 귀하의 경우 함수 본문이 이상하게 들여 쓰기가 발생할 수 있습니다. 이것은 당신의 추정 가정에 비추어 볼 때 파일에서 최상위 형식이 아니라는 암시입니다. – Svante

답변

5

경고는 char이 어떤 이유로 (기호가 바인딩되지 않았다고보고 함) 아무런 가치가 없으므로 함수로 인식되지 않음을 의미합니다.

구현과 관련이있을 수 있습니다. 나는 (Clozure과에서) 내 SBCL + 이맥스/점액에 참조 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 사양에서 벗어나는 지점입니다. 왜냐하면 그 기능이 있어야하기 때문입니다.

+0

고마워요! 함수가 거기에 있음이 드러났습니다. 다른 함수에서 타이핑 실수를 간과 한 것뿐입니다. 귀하의 대답이 도움이 된 이유는 그 문제가 실제로 제 코드에 있고 다른 곳의 문제가 아니라는 것을 안심시키기 때문입니다. –

+0

그래서 항상 질문에 코드를 복사/붙여 넣기합니다! –

1

들여 쓰기에 관한 메모입니다. 다음은보다 전통적인 들여 쓰기는 다음과 같습니다

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