Benefícios práticos do novo sistema de aconselhamento no Emacs 24.4


53

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"?

Respostas:


57

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).


11
Existem planos para adicionar ao nadvice.el a mesma funcionalidade de modificação de argumento oferecida pelo antigo sistema de aconselhamento?
— Aaron Miller

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.
— Stefan

2
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.
— Stefan

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.?)
— Aaron Miller

9

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).


2
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.
— Drew

8

No cabeçalho do arquivo:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

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.



Sim. O novo é diferente, não mais. E sim, há muito uso defadvicepor aí (e continuará a existir).
— Tirou

0

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.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.