2009-07-27 13 views
5

Postanowiłem nauczyć się (wspólnego) Lisp kilka dni temu i zdaję sobie sprawę, że jest to całkiem nowe pytanie i prawdopodobnie jest bardzo trywialne dla kogoś z przynajmniej odrobiną doświadczenia.Lisp: CHAR nie jest ani zadeklarowany, ani związany

Więc w zasadzie to, co się dzieje, że ja załadować Emacs + Slime (poprzez Lisp in a Box) i napisać program (podane poniżej):

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

A potem próbuję skompilować go z C - cM - k, ale potem pojawia się następujące ostrzeżenie:

CHAR jest ani deklarowany ani związana, będzie traktowana tak, jakby zostały uznane specjalnych.

Jakie jest znaczenie tego ostrzeżenia? Przypuszczam, że może to być coś podobnego do zapomnienia #include w C, ale nie mogę tego dokładnie rozgryźć. Co powinienem z tym zrobić? Czy mam to po prostu zignorować?

+4

W pliku znajduje się słowo CHAR, które jest zmienną. Kompilujesz cały plik za pomocą c-c m-k. Sprawdź swój plik, co tam jest? Tylko powyżej funkcji? Wtedy nie zobaczymy błędu. –

+0

Rainer Joswig: Dokładnie tak się stało. –

+1

Generalnie używałbym C-c C-c do (re-) kompilacji tylko najwyższej klasy w punkcie. Jeśli wydarzy się coś dziwnego, ponownie zrób wcięcie całego pliku (C-M-q z całym plikiem jako regionem) i szukaj dziwnego formatowania. W twoim przypadku możesz zauważyć, że ciało funkcji jest dziwnie wcięte; jest to wskazówka, że ​​wbrew przypuszczanemu założeniu nie jest to plik najwyższej jakości. – Svante

Odpowiedz

5

Ostrzeżenie oznacza, że ​​char nie jest rozpoznawany jako funkcja, ponieważ z jakiegoś powodu (zgłasza, że ​​symbol jest niezwiązany, nie ma wartości).

Może to mieć coś wspólnego z implementacją. Zabrakło mi swój kod za pomocą Cc Mk moim SBCL + Emacs/Slime (aw Clozure) i pojawia się następujący raport z kompilacji w 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. 

Spróbuj wpisanie

#'char 

na REPL, odpowiedź powinna być to, że ocenia się funkcją,

CL-USER> #'char 
#<FUNCTION CHAR> 

ale może nie w swojej realizacji (zgaduję nie, biorąc pod uwagę ostrzeżenie kompilatora oraz fakt, że kod com stosy poprawnie w SBCL). Jeśli tak jest, to jest to moment, w którym twoja implementacja odbiega od specyfikacji Common Lisp ANSI, ponieważ ta funkcja powinna tam być.

+0

Wielkie dzięki! Okazało się, że funkcja była tam, po prostu przeoczyłem błąd pisania w innej funkcji i to właśnie spowodowało problemy. Przyczyną, dla której twoja odpowiedź była bardzo pomocna, było zapewnienie, że problem tkwił w moim kodzie, a nie gdzieś indziej. –

+0

Dlatego zawsze kopiuj/wklej kod w pytaniach! –

1

Tylko uwaga dotycząca wcięcia. Oto bardziej konwencjonalne wcięcie:

(defun last-char (s) 
    "Get last character" 
    (char s (- (length s) 1))) 
Powiązane problemy