2012-01-25 11 views
7

Ho appena trascorso anni a capire cosa c'era di sbagliato nel mio codice. Ha funzionato bene nei test delle unità ert, ma non è riuscito quando l'ho eseguito in un contesto più ampio. Ecco un esempio di codice che ha funzionato:Perché il codice in-temp-buffer si lamenta della variabile void quando il buffer "parent" ha una variabile locale con lo stesso nome che ho associato?

(defun func (my-var) 
    (with-temp-buffer 
    (message my-var))) 

(func "z") 

Questa stampa z come previsto. Ora stavo scrivendo una modalità principale che aveva alcune variabili locali del buffer. Uno di questi era my-var. Questo codice dimostra il mio problema:

(make-local-variable 'my-var) 
(setq my-var "y") 

(defun func (my-var) 
    (with-temp-buffer 
    (message my-var))) 

(func "z") 

L'uscita? Non c'è nessuno, solo questo messaggio di errore:

eval-buffer: Symbol's value as variable is void: my-var 

In questo esempio è facile vedere che la variabile del buffer locale interferisce in qualche modo con la dinamica legata my-var. Non è stato così facile quando ho avuto più schermate del codice :-)

Quindi la mia domanda è che cosa sta succedendo davvero qui? È ovvio che il buffer temporaneo eredita in qualche modo una variabile dal buffer "padre", ma perché ha un valore nullo? Capirei se otterrebbe il valore "y" in qualche modo, ma questo comportamento mi sembra un insetto.

PS. Sto facendo funzionare l'ultimo Aquamacs

risposta

3

Un paio di cose.

Innanzitutto, il tuo codice non funziona così com'è. Dovresti provare questo in una nuova invocazione di Emacs. Una volta fatto, vedrai che è necessario passare make-local-variable un simbolo, in questo modo:

(make-local-variable 'my-var) 

Annotare il `` `.

In secondo luogo, avete definito una variabile buffer locale per avere lo stesso nome del parametro da func, in modo che qualsiasi risposta deve distinguere tra i due.

Quindi, ecco la mia versione ripulita del vostro esempio:

(make-local-variable 'my-var) 
(setq my-var "y") 

(defun func (my-param) 
    (with-temp-buffer 
(message my-param))) 

(func "z") 

E questo funziona bene.

Che mi porta a credere che l'errore che si sta vedendo proviene dalla chiamata a make-local-variable senza la citazione di fronte a my-var.

risposta originale fornito di seguito, anche se non affronta il problema:


Controllare la documentazione per make-local-variable. Il doc string è:

make-local-variabile è una funzione interattiva built-in in `sorgente C codice'.

(VARIABILE make-locale-variabile)

Fai VARIABILE ha un valore distinto nel buffer corrente. Altri buffer continueranno a condividere un valore predefinito comune.(Il valore locale del buffer di di VARIABLE inizia come lo stesso valore VARIABLE in precedenza. Se VARIABILE era vuoto, rimane vuoto.) Restituire VARIABLE .

La parte chiave per te è l'ultima frase. If the variable was void, it remains void.

Ciò significa che se non era già definito globalmente, non è ancora definito globalmente. In altre parole, ha solo un legame nei buffer in cui è stato impostato esplicitamente.

Se si desidera avere un valore globale, utilizzare setq-default in questo modo:

(setq-default my-var "some-default-value") 
+0

Ma io ancora non capisco il motivo per cui è nullo. Lo creo con: (make-local-variable my-var) e poi imposto il valore "y" su di esso: (setq my-var "y"). Quindi nel momento in cui chiamo la funzione e la macro with-temp-buffer all'interno del valore non dovrebbe essere nulla. Cosa mi manca? – auramo

+0

"In altre parole, ha solo un legame nei buffer in cui è stato impostato esplicitamente." <- Non l'ho impostato esplicitamente nel buffer temporaneo creato all'interno della macro con-temp-buffer. Il buffer in qualche modo ha ereditato la variabile ma non il suo valore. Inoltre, non voglio creare una variabile globale se posso evitarlo. Posso vivere con questa funzione bene, devo solo ricordare di nominare le variabili con attenzione. Vorrei solo sapere perché questo succede. – auramo

+0

In realtà, ci sono un paio di cose che succedono qui nel tuo codice, aggiornerò la mia risposta. –

Problemi correlati