Caricamenti automatici e variabili


8

Capisco cosa fa il caricamento automatico per le funzioni (registra il file da caricare quando viene chiamata tale funzione o viene recuperata la sua stringa di documentazione). Tuttavia, non è chiaro come utilizzare la funzione di caricamento automatico insieme a variabili e macro.

Ho due domande:

  1. Cosa succede quando il pacchetto ha un parametro, implementato come variabile che l'utente può impostare, ma non è caricato automaticamente? Tali variabili dovrebbero essere caricate automaticamente? In caso contrario, si scopre che tali variabili non esistono, l'ambiente Lisp non ne sa nulla, inclusi i loro valori predefiniti, fino a quando non viene utilizzata una funzione caricata automaticamente dal pacchetto (in genere dopo il caricamento dei file di configurazione), quindi se l'utente li imposta nella sua / il suo file di configurazione, è come impostare una variabile inesistente. Se il valore della variabile è un elenco non vuoto e l'utente utilizza pusho add-to-listper modificarne il valore, cosa succede esattamente? I valori predefiniti vengono persi?

  2. Cosa succede quando una macro viene caricata automaticamente? Quando dovremmo caricare automaticamente una macro?

Risposte:


5

Il caricamento automatico si applica solo allo slot del valore della funzione di un simbolo. In particolare, non è possibile caricare automaticamente una variabile.

Probabilmente è un cattivo formato per un pacchetto contenere variabili per la personalizzazione dell'utente il cui valore predefinito è un elenco non vuoto, proprio perché diventa difficile personalizzare la variabile in quel caso. Peggio ancora, se il valore predefinito dovesse cambiare, probabilmente dovrebbe cambiare anche il valore personalizzato, ma l'utente non ne sarà consapevole. Se alcuni pacchetti hanno tali variabili, potrebbe essere meglio modificarli dopo che il pacchetto è stato caricato, usando eval-after-load.

La maggior parte delle variabili di personalizzazione avrà un valore predefinito di nil, nel qual caso è sufficiente impostarle usando setqnel file init (o utilizzare l'interfaccia di personalizzazione). Supponendo che il pacchetto utilizzi defvaro defcustomper impostare la variabile, come dovrebbe, non sovrascriverà l'impostazione.

Macro di caricamento automatico: imposta il quinto argomento autoloadper raggiungere questo obiettivo. Come per le funzioni, ciò dovrebbe essere fatto se è probabile che si desideri utilizzare la macro senza caricare prima il pacchetto - esplicitamente o implicitamente invocando prima altri simboli caricati automaticamente dal pacchetto.

Addendum: come sottolineato dall'OP nei commenti, un ;;;###autoloadcommento magico copierà anche defvar(in effetti, qualsiasi forma elisp) nel file di caricamento automatico. Per i dettagli, consultare la sezione Caricamento automatico nel manuale elisp.


Quindi, le variabili che possono essere appena modificate setq(ovvero non importa quali valori avevano prima) possono avere impostazioni predefinite specificate in defvaro defcustomforma, ma in caso di elenco che può essere esteso dall'utente è meglio usare eval-after-loadgiusto? Inoltre, a volte le buone impostazioni predefinite sono buone, anche se prendono la forma di un elenco ;-)
Mark Karpov,

Giusto. Direi che se una personalizzazione comune richiede eval-after-load, è un bug nell'implementazione del pacchetto. In genere, eval-after-loaddovrebbe essere utilizzato per la correzione di bug o personalizzazioni molto insolite. A proposito, potrebbe essere meglio usare un hook se il pacchetto lo rende disponibile.
Harald Hanche-Olsen,

Il problema è che volevo avere una variabile legata all'elenco di tre elementi (valori predefiniti). Le impostazioni predefinite sono ciò che la maggior parte degli utenti desidera, ne sono sicuro. Ma se vado eval-after-loadavanti, gli utenti non saranno ancora in grado di rimuovere elementi dall'elenco! Questo mi fa chiedere se dovrei abbandonare le impostazioni predefinite.
Mark Karpov,

1
Non sono d'accordo che eval-after-loaddovrebbe essere necessario solo per situazioni insolite. È uno degli strumenti standard nel toolkit a caricamento differito. Se le persone non vogliono usare tali strumenti, possono prima di tutto requirela biblioteca (che è davvero ciò che i nuovi arrivati ​​sono invariabilmente raccomandati di fare - quando si aggirano pensando "Vorrei che Emacs fosse iniziato un po 'più veloce", loro' probabilmente ho imparato abbastanza per non essere spaventato dalla nuova sintassi :)
phils il

1
@Drew: il tuo punto di usare customize-set-variablepiuttosto che setqpotrebbe essere buono. Ma non ho il tempo adesso per l'attento studio necessario per migliorare la mia risposta a questo proposito. Se pensi che sia importante, perché non scrivi la tua risposta? Sarà più visibile di questo lungo thread di commenti.
Harald Hanche-Olsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.