Idioma comum para solucionar a expansão de macro ou resolver o aviso sobre variáveis indefinidas durante a compilação de bytes:
(eval-when-compile
(require 'cl-lib))
Mas isso require ...
compilado em .elc
arquivo! Eu achei que cl-eval-when
tem semântica adequada (de acordo com o nome).
Normalmente não precisamos require
como arquivo do site epackage.el
Por exemplo, eu quero compilar em bytes o meu, .emacs
que usa algumas macros externas, mas passa silenciosamente se não houver esse pacote:
(cl-eval-when 'compile
(condition-case err
(require 'w3m-util)
(error (byte-compile-warn "Failed by: %S" err))))
(w3m-util-DEPENDENT-CODE ...)
Outra maneira de fazer isso é:
(ignore-error
(require 'w3m-util)
(w3m-util-DEPENDENT-CODE ...))
Mas agora não somos um formulário de nível superior ...
Devo preencher adequadamente esse eval-when-compile
nome e fazer algo que não é esperado dele?
elisp
coding-conventions
gavenkoa
fonte
fonte
w3m-DEPENDENT-CODE
de uma faltaw3m-util
.(when (require 'w3m-util nil t) (w3m-util-DEPENDENT-CODE...))
(when (require 'w3m-util nil t) ...)
é um bom idioma! Mas tento criar um.emacs
arquivo perfeito , não uma biblioteca. Portanto, lembre-se do atraso no carregamento do código (mediante solicitação) com a ajuda do carregamento automático. Por esse motivo que uso extensivamenteeval-after-load
, o solicitadorequire
precisa apenas obter êxito na compilação de bytes com a expansão de macros.Respostas:
Você perguntou ao Emacs o que
eval-when-compile
deveria fazer?C-h f eval-when-compile
informa que ele avalia o argumento também no tempo de carregamento:Diz que se interpretado é como
progn
. E isso repete explicitamente isso.Um nome de função ou macro raramente reflete o comportamento perfeitamente. Mas, neste caso, parece que você está procurando um comportamento diferente, que pode ser chamado
eval-only-when-compile
.fonte
eval-only-when-compile
name me ajude a entender point to nameeval-when-compile
, obrigado!Para avaliar o código apenas no estágio de compilação, use
eval-when
macros datadas pelo RMS em 1993-07-30.cl-eval-when
apareceu em 2012-06-03 de Stefan Monnier e não está disponível para o Emacs 22.x (se você se importa, eu sim).Por exemplo, você gosta de se livrar de
Warning: assignment to free variable
:basta adicionar acima dessa linha:
Observe que isso é útil apenas para compilação de bytes do
.emacs
arquivo. Se você desenvolver uma biblioteca, façarequire
ou divida o arquivo da biblioteca em separado e carregue apenas os recursos necessários.fonte
(defvar auto-revert-interval)
defvar
solução em muitos casos, mas também procuro uma solução mais forte . Posso digitar o nome errado ou o pacote pode remover a definição e o verificador de compilação ficaria em silêncio nesses casos.