Bagaimana saya bisa melepaskan ikatan semua definisi simbol dengan awalan tertentu?

11

Saya mengganti API paket saya cukup sering, tetapi company-modemenarik setiap simbol yang ditentukan (sebagaimana mestinya) dalam pelengkapannya. Saya tidak ingin secara tidak sengaja menggunakan nama tidak terikat, jadi bagaimana saya bisa melepaskan ikatan semua variabel dan fungsi yang dimulai dengan, katakanlah my-package-,? Setelah ini, saya akan bisa melakukannya load-filelagi.

Sean Allred
sumber

Jawaban:

10

Panggil unload-featureuntuk tidak mendefinisikan semua simbol yang didefinisikan sebagai bagian dari memuat sumber Elisp atau file yang dikompilasi byte Pastikan file Anda diakhiri dengan menelepon providedi bagian akhir. Ini mengasumsikan bahwa Anda memuat file dengan salah satu loadfungsi atau melalui require, itu tidak akan mendefinisikan simbol yang didefinisikan oleh C-M-x( eval-defun) atau mekanisme serupa.

Jika Anda benar-benar ingin melepaskan ikatan simbol berdasarkan namanya alih-alih berdasarkan paket yang mendefinisikannya, Anda dapat menggunakannya mapatomsuntuk beralih ke semua simbol.

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Berguna, tetapi saya tidak percaya ini akan efektif dengan pengembangan interaktif seperti yang saya jelaskan. Saya satu tingkat lebih dalam dari featuresistem; Saya hanya bekerja dengan fungsi dan variabel tanpa pengelompokan eksplisit. Saya belum repot mengevaluasi (provide 'my-package).
Sean Allred
2
@SeanAllred Saya tidak bisa memikirkan alasan yang baik untuk tidak menggunakan provide. Tapi bagaimanapun, jika Anda benar-benar ingin melakukan hal-hal dengan cara yang kotor, lihat edit saya.
Gilles 'SANGAT berhenti menjadi jahat'
Oh, aku suka provide, aku hanya berpikir itu tidak akan berhasil dalam kasus ini. Apakah fungsi mengingat file apa yang mereka tetapkan jika mereka dievaluasi secara interaktif?
Sean Allred
2
unload-featuretidak berpengaruh jika Anda mengevaluasi kode tanpa memuatnya dari file (yang memiliki provide).
Drew
2
@SeanAllred Tidak, fungsi hanya mengingat dari mana mereka diambil jika mereka dimuat sebagai bagian dari memuat seluruh file.
Gilles 'SANGAT berhenti menjadi jahat'
7
  • Gunakan makunbounduntuk menghapus penggunaan simbol sebagai variabel dinamis (yaitu, untuk membatalkannya symbol-value).

  • Gunakan fmakunbounduntuk menghapus penggunaan simbol sebagai fungsi (yaitu, untuk membatalkannya symbol-function).

  • Gunakan mapatomsuntuk beralih di atas semua simbol. Bertindak pada masing-masing yang symbol-namecocok dengan awalan tertentu yang Anda minati: panggilan keduanya makunbounddan fmakunbounddi atasnya.

  • Anda tidak perlu uninternmenggunakan simbol, kecuali jika Anda juga menggunakan pelengkap terhadap simbol itu sendiri, dan tidak hanya atas penggunaannya sebagai variabel atau fungsi. Tapi jika Anda tidak ingin benar-benar menghapus simbol kemudian menggunakan unintern.

Drew
sumber