2009-07-27 11 views
5

Ho deciso di apprendere (Common) Lisp qualche giorno fa e mi rendo conto che questa è una domanda abbastanza newbie ed è probabilmente estremamente banale per qualcuno con almeno un po 'di esperienza.Lisp: CHAR non è dichiarato né vincolato

Quindi, in pratica quello che succede è che io carico fino Emacs + Slime (tramite Lisp in scatola) e scrivere il mio programma (riportato qui di seguito):

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

E poi provo a compilare con C - cM - k, ma poi ho il seguente avviso:

char è dichiarata né legato, sarà trattata come se fosse dichiarato SPECIALE.

Qual è il significato di questo avviso? Suppongo che potrebbe essere qualcosa di simile a dimenticare #inclusi in C, ma non riesco a capirlo. Cosa dovrei fare a riguardo? Devo semplicemente ignorarlo?

+4

c'è una parola CHAR nel tuo file che è una variabile. Si compila l'intero file con c-c m-k. Controlla il tuo file, cosa c'è lì dentro? Solo sopra la funzione? Quindi non vedremo l'errore. –

+0

Rainer Joswig: È esattamente quello che è successo. –

+1

Generalmente utilizzerei C-c C-c per (ri) compilare solo la forma di livello superiore al punto. Se accade qualcosa di strano, ri-indentare l'intero file (C-M-q con l'intero file come regione) e cercare una formattazione strana. Nel tuo caso, potresti notare che il corpo della funzione è stranamente rientrato; questo è un suggerimento che, contro la tua supposizione presunta, non è una forma toplevel nel file. – Svante

risposta

5

L'avviso indica che char non viene riconosciuto come una funzione, come dovrebbe, per qualche motivo (si dice che il simbolo non è associato, non ha alcun valore).

Potrebbe avere qualcosa a che fare con la vostra implementazione. Ho eseguito il codice tramite i Cc Mc nel mio SBCL + Emacs/Slime (e in Clozure) e ottengo il seguente relazione della compilazione 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. 

Prova semplicemente digitando

#'char 

sul REPL, la risposta dovrebbe essere che si è segnalato per essere una funzione,

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

ma forse non nell'implementazione (sto cercando di indovinare non lo fa, dato l'avviso del compilatore e il fatto che il codice com pile correttamente in SBCL). Se questo è il caso, allora questo è un punto in cui la tua implementazione si discosta dalla specifica LIS Common LIS, perché quella funzione dovrebbe essere lì.

+0

Grazie mille! Ho scoperto che la funzione era lì, ho appena trascurato un errore di battitura in un'altra funzione e questo è ciò che ha causato i problemi. Il motivo per cui la tua risposta è stata molto utile è perché mi ha rassicurato che il problema era effettivamente nel mio codice e non altrove. –

+0

Ecco perché copi sempre il codice nelle domande! –

1

Solo una nota riguardante il rientro. Ecco un'indentazione più convenzionale:

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