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
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
"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
In realtà, ci sono un paio di cose che succedono qui nel tuo codice, aggiornerò la mia risposta. –