Wie kann ich alle Symboldefinitionen mit einem bestimmten Präfix aufheben?

11

Ich ändere die API meines Pakets ziemlich häufig, company-modeziehe aber jedes definierte Symbol (wie es sollte) in seine Vervollständigungen. Ich möchte nicht versehentlich einen ungebundenen Namen verwenden. Wie kann ich also alle Variablen und Funktionen aufheben, die beispielsweise mit "" beginnen my-package-? Danach kann ich es einfach load-filewieder.

Sean Allred
quelle

Antworten:

10

Mit diesem Aufruf können Sie unload-featuredie Definition aller Symbole aufheben, die beim Laden einer Elisp-Quelle oder einer bytekompilierten Datei definiert wurden. Stellen Sie sicher, dass Ihre Datei endet, indem Sie provideam Ende aufrufen . Dies setzt voraus, dass Sie die Datei mit einer der loadFunktionen oder über geladen haben require, undefinierte Symbole, die von C-M-x( eval-defun) oder ähnlichen Mechanismen definiert wurden, werden nicht angezeigt .

Wenn Sie die Bindung von Symbolen auf der Grundlage ihres Namens und nicht auf der Grundlage des Pakets aufheben möchten, das sie definiert hat, können Sie mapatomsalle Symbole durchlaufen.

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))
Gilles 'SO - hör auf böse zu sein'
quelle
Nützlich, aber ich glaube nicht, dass dies bei der von mir beschriebenen interaktiven Entwicklung effektiv sein wird. Ich bin eine Ebene tiefer als das featureSystem. Ich arbeite nur mit Funktionen und Variablen ohne explizite Gruppierung. Ich habe mich nicht darum gekümmert zu bewerten (provide 'my-package).
Sean Allred
2
@ SeanAllred Ich kann mir keinen guten Grund vorstellen, nicht zu verwenden provide. Aber auf jeden Fall, wenn Sie wirklich schmutzige Sachen machen wollen, sehen Sie sich meine Bearbeitung an.
Gilles 'SO- hör auf böse zu sein'
Oh, ich liebe provide, ich glaube einfach nicht, dass es in diesem Fall funktionieren würde. Erinnern sich Funktionen an die Datei, in der sie definiert wurden, wenn sie interaktiv ausgewertet wurden?
Sean Allred
2
unload-featurehat keine Auswirkung, wenn Sie Code auswerten, ohne ihn aus einer Datei zu laden (die hat provide).
Drew
2
@SeanAllred Nein, Funktionen merken sich nur, woher sie geladen wurden, wenn sie beim Laden einer ganzen Datei geladen wurden.
Gilles 'SO - hör auf, böse zu sein'
7
  • Verwenden Sie makunbounddiese Option , um die Verwendung eines Symbols als dynamische Variable zu entfernen (dh, um die Verwendung aufzuheben symbol-value).

  • Verwenden Sie fmakunbounddiese Option , um die Verwendung eines Symbols als Funktion zu entfernen (dh, um es für ungültig zu erklären symbol-function).

  • Verwenden Sie mapatomsdiese Option, um alle Symbole zu durchlaufen. Handle auf jeden, dessen symbol-namePräfix mit dem Präfix übereinstimmt, an dem du interessiert bist: rufe beide an makunboundund rufe fmakunboundes an.

  • Sie brauchen uninterndas Symbol nicht zu verwenden , es sei denn, Sie verwenden die Vervollständigung auch gegen Symbole selbst und nicht nur über deren Verwendung als Variablen oder Funktionen. Wenn Sie jedoch ein Symbol vollständig entfernen möchten, verwenden Sie unintern.

Drew
quelle