2009-07-27 15 views
5

Ich habe vor ein paar Tagen beschlossen, (Common) Lisp zu lernen, und mir ist klar, dass dies eine ziemlich neue Frage ist und es für jemanden mit ein bisschen Erfahrung wahrscheinlich extrem trivial ist.Lisp: CHAR ist weder deklariert noch gebunden

Also im Grunde, was passiert ist, dass ich Emacs + Slime laden (über Lisp in Box) und mein Programm schreiben (auch weiter unten):

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

Und dann versuche ich es mit C zu kompilieren - cM - k, aber dann bekomme ich die folgende Warnung:

CHAR weder deklariert noch gebunden, sie behandelt werden, als ob es SPECIAL deklariert wurden.

Was bedeutet diese Warnung? Ich nehme an, es könnte etwas sein, das dem Vergessen von # in C ähnelt, aber ich kann es nicht genau herausfinden. Was soll ich deswegen machen? Soll ich es einfach ignorieren?

+4

gibt es einige Wort CHAR in Ihrer Datei, die eine Variable ist. Sie kompilieren die gesamte Datei mit c-c m-k. Überprüfe deine Datei, was ist da drin? Nur über Funktion? Dann werden wir den Fehler nicht sehen. –

+0

Rainer Joswig: Genau das ist passiert. –

+1

Ich würde normalerweise C-c C-c verwenden, um nur die Toplevel-Form am Punkt (neu) zu kompilieren. Wenn etwas Seltsames passiert, ziehe die gesamte Datei erneut ein (C-M-q mit der ganzen Datei als Region) und suche nach seltsamen Formatierungen. In Ihrem Fall bemerken Sie möglicherweise, dass der Funktionskörper merkwürdig eingerückt ist. Dies ist ein Hinweis darauf, dass es sich bei Ihrer angenommenen Annahme nicht um eine Toplevel-Form in der Datei handelt. – Svante

Antwort

5

Die Warnung bedeutet, dass char nicht als eine Funktion erkannt wird, wie es sollte, aus irgendeinem Grund (es meldet, dass das Symbol nicht gebunden ist, hat keinen Wert).

Es könnte etwas mit Ihrer Implementierung zu tun haben. Ich habe Ihren Code Cc Mk in meinem SBCL + Emacs/Slime (und in Clozure) laufen und ich erhalte den folgenden Bericht aus der Zusammenstellung in 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. 

Versuchen Sie die Eingabe nur

#'char 

auf dem REPL, sollte die Antwort sein, dass es eine Funktion sein, berichtet wird,

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

aber vielleicht ist es nicht in der Implementierung (ich vermute, es nicht tut, die Compiler-Warnung und die Tatsache, dass der Code com Pfähle korrekt in SBCL). Wenn dies der Fall ist, dann ist dies ein Punkt, an dem Ihre Implementierung von der ANSI-Common-Lisp-Spezifikation abweicht, da diese Funktion vorhanden sein sollte.

+0

Vielen Dank! Es stellte sich heraus, dass die Funktion dort war, ich habe gerade einen Tippfehler in einer anderen Funktion übersehen und das verursachte die Probleme. Der Grund, warum deine Antwort sehr hilfreich war, liegt darin, dass es mich beruhigt hat, dass das Problem tatsächlich in meinem Code und nicht woanders liegt. –

+0

Deshalb Code immer in Fragen kopieren/einfügen! –

1

Nur eine Anmerkung zu Ihrer Einrückung. Hier ist ein konventioneller Einrückung:

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