Comment puis-je dissocier toutes les définitions de symboles avec un certain préfixe?

11

Je modifie l'API de mon package assez fréquemment, mais company-modetire tous les symboles définis (comme il se doit) dans ses finitions. Je ne veux pas utiliser accidentellement un nom non lié, alors comment puis-je dissocier toutes les variables et fonctions commençant par, disons my-package-? Après cela, je pourrai simplement le faire à load-filenouveau.

Sean Allred
la source

Réponses:

10

Appelez unload-featurepour annuler la définition de tous les symboles définis dans le cadre du chargement d'une source Elisp ou d'un fichier compilé en octets. Assurez-vous que votre fichier se termine en appelant provideà la fin. Cela suppose que vous avez chargé le fichier avec l'une des loadfonctions ou via require, il ne sera pas des symboles non définis définis par C-M-x( eval-defun) ou des mécanismes similaires.

Si vous voulez vraiment dissocier les symboles en fonction de leur nom plutôt qu'en fonction du package qui les a définis, vous pouvez utiliser mapatomspour parcourir tous les symboles.

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))
Gilles 'SO- arrête d'être méchant'
la source
Utile, mais je ne pense pas que cela sera efficace avec le développement interactif tel que je le décris. Je suis un niveau plus profond que le featuresystème; Je travaille uniquement avec des fonctions et des variables sans regroupement explicite. Je n'ai pas pris la peine d'évaluer (provide 'my-package).
Sean Allred
2
@SeanAllred Je ne vois pas de bonne raison de ne pas l'utiliser provide. Mais de toute façon, si vous voulez vraiment faire les choses de façon sale, voyez mon montage.
Gilles 'SO- arrête d'être méchant'
Oh, j'aime provide, je ne pense tout simplement pas que cela fonctionnerait dans ce cas. Les fonctions se souviennent-elles du fichier dans lequel elles ont été définies si elles ont été évaluées de manière interactive?
Sean Allred
2
unload-featuren'a aucun effet si vous évaluez le code sans le charger à partir d'un fichier (qui a provide).
Tiré
2
@SeanAllred Non, les fonctions ne se souviennent d'où elles ont été chargées que si elles ont été chargées dans le cadre du chargement d'un fichier entier.
Gilles 'SO- arrête d'être méchant'
7
  • Utilisez makunboundpour supprimer l'utilisation d'un symbole comme variable dynamique (c'est-à-dire pour l'annuler symbol-value).

  • Utilisez fmakunboundpour supprimer l'utilisation d'un symbole en tant que fonction (c'est-à-dire pour l'annuler symbol-function).

  • Utilisez mapatomspour parcourir tous les symboles. Agissez sur chacun d'entre eux dont symbol-namele préfixe vous intéresse: appelez les deux makunboundet fmakunbounddessus.

  • Vous n'avez pas besoin uninterndu symbole, sauf si vous utilisez également la complétion par rapport aux symboles eux-mêmes, et pas seulement leur utilisation en tant que variables ou fonctions. Mais si vous ne voulez supprimer complètement un symbole puis utilisez unintern.

A dessiné
la source