Como posso desvincular todas as definições de símbolos com um determinado prefixo?

11

Estou alterando a API do meu pacote com bastante frequência, mas company-modeextrai todos os símbolos definidos (como deveriam) em suas conclusões. Como não quero usar acidentalmente um nome não vinculado, como posso desvincular todas as variáveis ​​e funções que começam com, digamos my-package-,? Depois disso, simplesmente poderei load-filenovamente.

Sean Allred
fonte

Respostas:

10

Chame unload-featurepara indefinir todos os símbolos que foram definidos como parte do carregamento de um arquivo Elisp de origem ou de compilação de bytes. Verifique se o seu arquivo termina chamando provideno final. Isso pressupõe que você carregou o arquivo com uma das loadfunções ou via require, ele não definirá símbolos indefinidos definidos por C-M-x( eval-defun) ou mecanismos similares.

Se você realmente deseja desvincular símbolos com base no nome deles, e não no pacote que os definiu, pode usar mapatomspara iterar sobre todos os símbolos.

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))
Gilles 'SO- parar de ser mau'
fonte
Útil, mas não acredito que isso seja eficaz no desenvolvimento interativo, como descrevo. Eu sou um nível mais profundo que o featuresistema; Estou trabalhando apenas com funções e variáveis ​​sem nenhum agrupamento explícito. Eu não me incomodei em avaliar (provide 'my-package).
Sean Allred
2
@SeanAllred Não consigo pensar em um bom motivo para não usar provide. Mas enfim, se você realmente quer fazer as coisas da maneira suja, veja minha edição.
Gilles 'SO- stop being evil' em
Ah, eu amo provide, só não acho que funcionaria nesse caso. As funções lembram em que arquivo elas foram definidas se avaliadas interativamente?
Sean Allred
2
unload-featurenão terá efeito se você avaliar o código sem carregá-lo de um arquivo (que possui provide).
Desenhou
2
@SeanAllred Não, as funções lembram apenas de onde foram carregadas, se foram carregadas como parte do carregamento de um arquivo inteiro.
Gilles 'SO- stop be evil' em
7
  • Use makunboundpara remover o uso de um símbolo como uma variável dinâmica (ou seja, para anulá-lo symbol-value).

  • Use fmakunboundpara remover o uso de um símbolo como uma função (ou seja, para anulá-lo symbol-function).

  • Use mapatomspara iterar sobre todos os símbolos. Aja em cada um que symbol-namecorresponda ao prefixo específico em que você está interessado: ligue para ele makunbounde fmakunboundpara ele.

  • Você não precisa uninterndo símbolo, a menos que esteja usando também a conclusão contra os próprios símbolos, e não apenas sobre o uso deles como variáveis ​​ou funções. Mas se você não quiser remover completamente um símbolo, em seguida, usar unintern.

Desenhou
fonte