Jak usunąć powiązanie wszystkich definicji symboli z pewnym prefiksem?

11

Często zmieniam interfejs API mojego pakietu, ale company-modewyciąga każdy zdefiniowany symbol (tak jak powinien) w swoich uzupełnieniach. Nie chcę przypadkowo użyć niezwiązanej nazwy, więc w jaki sposób mogę cofnąć powiązanie wszystkich zmiennych i funkcji rozpoczynających się, powiedzmy my-package-,? Potem po prostu będę mógł load-fileznów.

Sean Allred
źródło

Odpowiedzi:

10

Wywołanie unload-featuresłuży do niezdefiniowania wszystkich symboli, które zostały zdefiniowane jako część ładowania źródła Elisp lub pliku skompilowanego bajtowo. Upewnij się, że plik się kończy, dzwoniąc providena końcu. Zakłada się, że plik został załadowany za pomocą jednej z loadfunkcji lub za pośrednictwem require, nie zdefiniuje symboli zdefiniowanych przez C-M-x( eval-defun) lub podobnych mechanizmów.

Jeśli naprawdę chcesz rozdzielić symbole na podstawie ich nazw, a nie na podstawie pakietu, który je zdefiniował, możesz użyć mapatomsiteracji po wszystkich symbolach.

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))
Gilles „SO- przestań być zły”
źródło
Przydatne, ale nie wierzę, że będzie to skuteczne przy interaktywnym rozwoju, jak to opisuję. Jestem o jeden poziom niżej niż featuresystem; Pracuję tylko z funkcjami i zmiennymi bez wyraźnego grupowania. Nie zawracałem sobie głowy oceną (provide 'my-package).
Sean Allred
2
@SeanAllred Nie mogę wymyślić dobrego powodu, aby nie używać provide. Ale tak czy inaczej, jeśli naprawdę chcesz robić rzeczy w brudny sposób, zobacz moją edycję.
Gilles „SO- przestań być zły”
Och, uwielbiam provide, po prostu nie sądzę, żeby to zadziałało w tym przypadku. Czy funkcje zapamiętują, w jakim pliku zostały zdefiniowane, jeśli zostały ocenione interaktywnie?
Sean Allred
2
unload-featurenie ma żadnego efektu, jeśli oceniasz kod bez ładowania go z pliku (który ma provide).
Drew
2
@SeanAllred Nie, funkcje zapamiętują tylko, skąd zostały załadowane, jeśli zostały załadowane w ramach ładowania całego pliku.
Gilles „SO- przestań być zły”
7
  • Służy makunbounddo usuwania użycia symbolu jako zmiennej dynamicznej (tj. Do jego unieważnienia symbol-value).

  • Służy fmakunbounddo usuwania użycia symbolu jako funkcji (tj. Do jego unieważnienia symbol-function).

  • Służy mapatomsdo iteracji wszystkich symboli. Działaj na każdym, którego symbol-nameodpowiada konkretny prefiks, który Cię interesuje: zadzwoń zarówno na niego, jak makunboundi fmakunboundna niego.

  • Nie potrzebujesz uninterntego symbolu, chyba że używasz również uzupełnienia samych symboli, a nie tylko ich użycia jako zmiennych lub funkcji. Ale jeśli nie chcesz, aby całkowicie usunąć symbol następnie użyć unintern.

Rysował
źródło