O Emacs 24.4 vem com um novo sistema de aconselhamento. O NEWSarquivo diz:
** O novo pacote nadvice.eloferece facilidades de aconselhamento mais leves. Está em camadas como:
*** add-function/ remove-function, que pode ser usado para adicionar / remover código em qualquer local de realização de funções, como filtros de processo ou <foo>-functionganchos.
*** advice-add/ advice-removepara adicionar / remover um conselho sobre uma função nomeada, assim como defadvicefaz.
P: Quais são os benefícios e implicações práticas deste novo pacote?
Estou especialmente interessado em respostas que abordem os seguintes pontos:
Se eu estiver usando apenas conselhos para personalizar o Emacs (em vez de escrever pacotes complementares), preciso mudar para o novo sistema? Ele substituirá o sistema antigo em algum momento?
O que exatamente posso fazer com o novo sistema que não consigo realizar defadvice?
Qual é o significado de ser capaz de "adicionar / remover código em qualquer local de realização de funções"?
O novo sistema de aconselhamento possui as seguintes vantagens:
add-function: Essa é uma funcionalidade totalmente nova que simplesmente não fazia parte do defadvice. É um tipo de híbrido entre add-hooke defadvice. No futuro, espere mais foo-functionvariáveis ​​(modificadas via add-function) e menos foo-functions(modificadas via add-hook). Essa funcionalidade foi a principal motivação para implementar o novo sistema de aconselhamento, acionado por um relatório de bug perguntando como "compartilhar" um filtro de processo entre pacotes diferentes.
Simplicidade de implementação: uma vez add-functionimplementada, são necessários apenas 8 KB para implementar a advice-addfuncionalidade, o que traz praticamente toda a funcionalidade dos 100 KB de conselhos.el.
Simplicidade do design: o defadvice possui várias noções que geralmente são difíceis de entender com precisão e / ou raramente são usadas. Por exemplo, a diferença entre "ativar" e "ativar" conselhos. Ou o significado de "pré" e / ou "compilado". Também existem peculiaridades no tratamento ad-do-it, como o fato de parecer uma referência variável em vez de uma chamada ou o fato de que você precisa (setq ad-return-value ...)explicitamente, em vez de simplesmente retornar o valor.
O defadvice sofre de vários problemas de macroexpansão e compilação: o corpo de um conselho não é exposto como "código" (que o compilador e o macroexpansor veem), mas como "dados" que são posteriormente combinados para formar uma expressão. Portanto, a macroexpansão ocorre tarde (o que pode causar surpresas se você usar coisas do tipo (eval-when-compile (require 'foo))) e o escopo lexical é difícil de preservar corretamente.
Quanto à necessidade de mudar para o novo sistema: pretendo me livrar do antigo defadvice em algum momento no futuro, mas acho que esse futuro é relativamente distante (e ele terá que mudar para lisp/obsoletedepois) para o GNU ELPA).
Existem planos para adicionar ao nadvice.el a mesma funcionalidade de modificação de argumento oferecida pelo antigo sistema de aconselhamento?
Não, isso praticamente não faz sentido no contexto de nadvice.el, onde as funções de aconselhamento são simples funções normais antigas. Mas você pode usar :aroundconselhos ( :filter-argsou :filter-resultconselhos) para obter o mesmo efeito.
Eu não posso, no entanto. Suponha que eu queira aconselhar uma função de dois argumentos, substituindo apenas o segundo argumento, para que a função aconselhada ainda seja solicitada de acordo com sua forma interativa para o primeiro. Novos conselhos parecem fornecer algumas maneiras diferentes de substituir a forma interativa de uma função recomendada, mas não vejo nada oferecendo mais nuances do que isso.
— Aaron Miller # 1
@AaronMiller: Faça uma pergunta separada sobre o SX, para que possa ser discutida sem os limites artificiais dos comentários do SX.
Feito, em emacs.stackexchange.com/q/19233/2162 . Agradeço o seu acompanhamento. (Eu também estar curioso para ver o relatório de erro que você menciona em sua resposta, mas não foram capazes de encontrá-lo via mailing list pesquisa de arquivo Google ou Você se importa ligando-o.?)
Um dos benefícios claros de o conselho ser funções normais é que você pode visitar uma definição com find-function.
No momento, ao visualizar a ajuda para uma função recomendada (novo estilo), ele fornece um link para a ajuda da função de aconselhamento e, a partir daí, um link para a fonte (como de costume para a ajuda da função).
O sistema antigo fornecia as orientações em linha, mas não havia como ver o código (geralmente eu recorria rgrep).
(Pessoalmente, gostaria de ver uma combinação das abordagens antiga e nova para exibir a ajuda, pois gostei de ter a sequência de caracteres em linha, mas tenho certeza de que isso é possível).
Sim, é uma pena que o novo sistema de aconselhamento não permita adicionar à cadeia de documentos existente, como defadvicefaz. Veja este relatório de erros do Emacs . Isso é uma falha.
No cabeçalho do arquivo:
Na minha leitura, o objetivo principal é ser mais simples que o antigo sistema de aconselhamento, não ter mais recursos. Lendo os documentos, parece que advice-addcontém um subconjunto de defadvicefuncionalidades, enquanto add-functioncontém algumas funcionalidades interessantes para aconselhar funções não tradicionais, como filtros de processo (o que provavelmente foi possível com defadvice, mas não sei como).
Até onde eu sei, defadvicenão é oficialmente reprovado, portanto, você deve se sentir à vontade para continuar usando-o por enquanto (e se você é um autor de pacote, provavelmente desejará continuar usando-o até que o 24.4 se torne mais amplamente adotado). No entanto, parece que os autores do Emacs desejam migrar completamente para o novo sistema, então provavelmente faz sentido mudar lentamente.
Veja também: Adaptando código usando o antigo defadvice
— glucas 4/04
Sim. O novo é diferente, não mais. E sim, há muito uso defadvicepor aí (e continuará a existir).
Uma coisa que eu não vi mencionado aqui - embora em alguns aspectos, é devido à abordagem mais simples (melhor modularidade e "cola") do "novo" sistema de aconselhamento, que tem sido mencionado em outras respostas - é esta: é muito mais fácil adicionar, combinar, remover, reordenar etc. etc.
É até possível fazê-lo de forma interativa e dinâmica, embora o nadvice precise de uma pequena ajuda para facilitar isso. Não conheço outro uso do nadvice dessa maneira (composição interativa de conselhos), mas há pelo menos um desses aplicativos. Uso-o no Isearch + , para permitir que você adicione e remova combinações de predicados de filtros arbitrários do Isearch (filtros) durante a pesquisa.
IOW, assim como você altera gradualmente seu padrão de pesquisa, para refinar sua pesquisa rapidamente usando vários filtros.
A filtragem Isearch é feita usando a variável isearch-filter-predicate, que já está disponível há um bom tempo. No entanto, os filtros Isearch não são definidos com frequência. Eles são tipicamente estáticos e predefinidos para um determinado contexto (por exemplo, Wdired). Não é muito fácil para os usuários defini-los e usá-los, pelo menos de forma interativa.
Existe apenas uma variável, isearch-filter-predicateportanto, alterar a filtragem realmente significa alterar o predicado de filtro único, que equivale a funções de composição, combinação de predicados, para restringir, expandir ou modificar a pesquisa.
Mas é exatamente nisso que nadvice é bom. Em suma, o nadvice é tão útil para combinar funções que pode facilitar o refinamento interativo da filtragem de pesquisa. (Consulte Dynamic Isearch Filtering para obter mais informações sobre isso.)