特定のプレフィックスを持つすべてのシンボル定義のバインドを解除するにはどうすればよいですか?


11

私はパッケージのAPIをかなり頻繁に変更していますが、完了時にすべての定義済みシンボルを(必要に応じて)company-modeプルします。バインドされていない名前を誤って使用したくないので、たとえば、で始まるすべての変数と関数のバインドを解除するにはどうすればよいですか?この後、再びできるようになります。my-package-load-file

回答:


10

コールunload-featureのelispソースまたはバイトコンパイルされたファイルを読み込むの一部として定義されたすべてのシンボルを未定義します。provide最後に呼び出して、ファイルが終了することを確認します。これは、load関数の1つまたはを介してファイルをロードしたことを前提としています。()または同様のメカニズムでrequire定義された未定義のシンボルはありません。C-M-xeval-defun

シンボルを定義したパッケージではなく名前に基づいてシンボルのバインドを本当に解除する場合はmapatoms、すべてのシンボルを反復処理するために使用できます。

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))

便利ですが、私が説明しているように、インタラクティブな開発ではこれが効果的ではないと思います。私はfeatureシステムよりも1レベル深いです。明示的なグループ化を行わずに、関数と変数のみを使用しています。私は評価を気にしませんでした(provide 'my-package)
ショーンオールレッド14年

2
@SeanAllred私は使用しない正当な理由を考えることができませんprovide。しかし、とにかく、あなたが本当に物事を汚いやり方でやりたいなら、私の編集を見てください。
ジル「SO-悪であるのをやめる」14年

ああ、大好きですprovide、この場合うまくいかないと思います。関数は、インタラクティブに評価された場合、定義されたファイルを覚えていますか?
ショーンオールレッド14年

2
unload-featureファイルからロードせずにコードを評価する場合は効果がありません(その場合provide)。
ドリュー

2
@SeanAllredいいえ、関数はファイル全体のロードの一部としてロードされた場合にのみ、ロード元を記憶します。
ジル 'SO-悪であるのをやめる' 14年

7
  • makunboundダイナミック変数としてのシンボルの使用を削除するために使用します(つまり、その無効にしますsymbol-value)。

  • fmakunbound関数としてのシンボルの使用を削除するために使用します(つまり、そのを無効にしますsymbol-function)。

  • mapatomsすべてのシンボルを反復処理するために使用します。symbol-name興味のある特定のプレフィックスと一致するそれぞれに作用します:両方makunboundを呼び出しますfmakunbound

  • 変数または関数としての使用だけでなく、シンボル自体に対する補完も使用している場合除きunintern、シンボルは必要ありません。ただし、シンボルを完全に削除する場合、を使用します。unintern

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.