O que significa (require 'package) para o emacs e como ele difere do arquivo de carregamento?

10

Comecei a usar o emacs há alguns dias e li em algum lugar que (require 'package-name)não é necessário quando o referido pacote é instalado usando o pacote de instalação. Mas por que, o que (require 'package-name)realmente faz e como ela difere load-fileou loadprocedimentos?

Chakravarthy Raghunandan
fonte
7
Uma das primeiras coisas que todos tivemos que aprender no Emacs é M-x describe-functionler a sequência de documentos. aka C-h fDigite M-x describe-function RET require RETe leia a sequência de documentos. Em seguida, digite M-x describe-function RET load-file RETe leia a sequência de documentos. Em seguida, digite M-x describe-function RET load RETe leia a sequência de documentos. Depois de ler todas as três seqüências de documentos, edite sua pergunta para comparar e contrastar todas as três funções e esclarecer o que você ainda não entende em relação a elas. Empregamos o mesmo procedimento para variáveis ​​- ie M-x describe-variable,.
lawlist

Respostas:

13

Se você loadusar uma biblioteca repetidamente, esse arquivo será lido e seu código avaliado repetidamente (sempre que você o carregar).

Se você for requireuma biblioteca repetidamente, ela será loada biblioteca uma vez (no máximo - e de modo algum se a biblioteca já tiver sido carregada).

requirefornece essa eficiência mesmo que requirenão tenha sido usado para carregar a biblioteca inicialmente, porque (a grande maioria das) bibliotecas contém o código (provide 'FEATURE)para seu FEATUREnome específico . Esse código é avaliado quando a biblioteca é carregada, independentemente de como foi carregada, e nesse momento atualiza os dados que requireverificam ao decidir se é necessário fazer alguma coisa.

Principalmente, você deseja usar requireem seu próprio código, se precisar garantir que uma determinada biblioteca tenha sido carregada.

O motivo pelo qual você geralmente não precisa fazer isso com os pacotes ELPA é que o gerenciador de pacotes processa automaticamente qualquer cookie de carregamento automático no pacote e gera um arquivo de carregamento automático para esse pacote. Quando o sistema de pacotes é inicializado quando você inicia o Emacs, é avaliado o arquivo de carregamento automático de cada pacote, que identifica todas as funções de carregamento automático. Quando uma função carregada automaticamente é chamada, a biblioteca que contém a definição real da função é carregada automaticamente.

Os autores do pacote podem adicionar um cookie de carregamento automático a cada função que o usuário possa chamar diretamente e, portanto, desde que as expectativas estejam corretas, você não precisará ligar requireou carregar explicitamente o pacote para usá-lo.

Observe que você também pode definir seus próprios carregamentos automáticos personalizados. Veja C-hig (elisp) Autoload RETe também (elisp) Hooks for Loadingse você deseja usar o carregamento lento e a configuração adiada das bibliotecas em sua própria configuração. (O último a dizer "não avalie esse código até que esta biblioteca tenha sido carregada", o que está relacionado com o mecanismo "não carrega esta biblioteca até que seja necessário").

phils
fonte
2
Como você já está consultando o manual Elisp, acho que outro nó pertinente é (elisp) Named Features.
Basil