Carregamentos automáticos e variáveis

8

Eu entendo o que o carregamento automático faz para funções (registrar o arquivo para carregar quando essa função é chamada ou sua cadeia de documentação é recuperada). No entanto, não está claro como usar o recurso de carregamento automático em conjunto com variáveis ​​e macros.

Eu tenho duas perguntas:

  1. O que acontece quando o pacote tem parâmetro, implementado como uma variável que o usuário pode definir, mas não é carregado automaticamente? Essas variáveis ​​devem ser carregadas automaticamente? Caso contrário, verifica-se que essas variáveis ​​não existem, o ambiente Lisp não sabe nada sobre elas, incluindo seus valores padrão, até que alguma função carregada automaticamente do pacote seja usada (normalmente após o carregamento dos arquivos de configuração) e, se o usuário as definir no seu / seu arquivo de configuração, é como definir variáveis ​​inexistentes. Se o valor da variável é uma lista não vazia e o usuário usa pushou add-to-listpara alterar seu valor, o que exatamente acontece? Os valores padrão são perdidos?

  2. O que acontece quando uma macro é carregada automaticamente? Quando devemos carregar automaticamente uma macro?

Mark Karpov
fonte

Respostas:

5

O carregamento automático se aplica apenas ao slot de valor da função de um símbolo. Em particular, não existe o carregamento automático de uma variável.

Provavelmente, é uma má forma para um pacote conter variáveis ​​para personalização do usuário cujo valor padrão é uma lista não vazia, precisamente porque fica difícil personalizar a variável nesse caso. Pior, se o valor padrão mudar, o valor personalizado provavelmente também deve mudar, mas o usuário não estará ciente disso. Se algum pacote tiver essas variáveis, talvez seja melhor alterá-lo após o carregamento do pacote, usando eval-after-load.

A maioria das variáveis ​​de personalização terá um valor padrão de nil, nesse caso, você apenas as define usando setqno seu arquivo init (ou use a interface de personalização). Supondo que o pacote use defvarou defcustompara definir a variável, como deveria, ele não substituirá sua configuração.

Carregamento automático de macros: defina o quinto argumento autoloadpara conseguir isso. Como funções, isso deve ser feito se for provável que você deseje usar a macro sem carregar o pacote primeiro - explicitamente ou implicitamente, primeiro chamando outros símbolos carregados automaticamente do pacote.

Adendo: Como o OP apontou nos comentários, um ;;;###autoloadcomentário mágico também copiará um defvar(de fato, qualquer formulário elisp) no arquivo de carregamento automático. Veja a Autoload seção no manual elisp para mais detalhes.

Harald Hanche-Olsen
fonte
Portanto, variáveis ​​que podem ser setqeditadas apenas (ou seja, não importa quais valores eles tinham antes) podem ter o padrão especificado defvarou o defcustomformulário, mas no caso de uma lista que pode ser estendida pelo usuário, é melhor usar eval-after-loadcerto? Também, às vezes bons padrões são boas, mesmo se eles tomam forma de uma lista ;-)
Mark Karpov
Está certo. Eu diria que, se uma customização comum exigir eval-after-load, é um bug na implementação do pacote. Normalmente, eval-after-loaddeve ser usado para correções de bugs ou personalizações altamente incomuns. A propósito, pode ser melhor usar um gancho se o pacote disponibilizar um gancho.
Harald Hanche-Olsen
O problema é que eu queria ter uma variável vinculada à lista de três elementos (padrões). Os padrões são o que a maioria dos usuários deseja, tenho certeza. Mas se eu seguir em frente eval-after-load, os usuários ainda não poderão remover elementos da lista! Isso me faz pensar se devo abandonar os padrões.
22815 Mark Karpov
1
Não concordo que isso eval-after-loadseja necessário apenas para situações incomuns. É uma das ferramentas padrão no kit de ferramentas de carregamento diferido. Se as pessoas não quiserem usar essas ferramentas, elas poderão requireacessar a biblioteca (o que é de fato o que os novatos são invariavelmente recomendados - no momento em que começam a pensar "Eu gostaria que o Emacs começasse um pouco mais rápido", eles " provavelmente já aprendeu o suficiente para não ser assustado com a nova sintaxe :)
phils
1
@ Drew: O seu ponto de usar customize-set-variablee não setqpode ser bom. Mas não tenho tempo agora para o estudo cuidadoso necessário para melhorar minha resposta a esse respeito. Se você acha que isso é importante, por que não escreve sua própria resposta? Será mais visível que esse longo tópico de comentários.
Harald Hanche-Olsen