Как я могу отменить привязку всех определений символов к определенному префиксу?


11

Я довольно часто меняю API своего пакета, но company-modeвытягиваю каждый определенный символ (как и должно быть) в его дополнениях. Я не хочу случайно использовать несвязанное имя, так как я могу отменить привязку всех переменных и функций, которые начинаются, скажем, с my-package-? После этого я просто смогу load-fileснова.

Ответы:


10

Вызов unload-featureотмены определения всех символов, определенных как часть загрузки исходного кода Elisp или файла, скомпилированного байтами. Убедитесь, что ваш файл заканчивается, позвонив provideв конце. Это предполагает, что вы загрузили файл с помощью одной из loadфункций или через него require, он не будет неопределенными символами, определенными C-M-x( eval-defun) или аналогичными механизмами.

Если вы действительно хотите отменить привязку символов на основе их имени, а не на основе пакета, который их определил, вы можете использовать mapatomsдля перебора всех символов.

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

Полезно, но я не верю, что это будет эффективно с интерактивной разработкой, как я описываю. Я на один уровень глубже, чем featureсистема; Я работаю только с функциями и переменными без какой-либо явной группировки. Я не удосужился оценить (provide 'my-package).
Шон Оллред

2
@SeanAllred Я не могу придумать вескую причину не использовать provide. Но в любом случае, если вы действительно хотите сделать что-то грязное, посмотрите мои правки.
Жиль "ТАК - перестань быть злым"

О, я люблю provide, я просто не думаю, что это сработает в этом случае. Помнят ли функции, в каком файле они были определены, если они оценивались в интерактивном режиме?
Шон Оллред

2
unload-featureне имеет никакого эффекта, если вы оцениваете код, не загружая его из файла (который имеет provide).
Дрю

2
@SeanAllred Нет, функции помнят, откуда они были загружены, только если они были загружены как часть загрузки всего файла.
Жиль "ТАК - перестань быть злым"

7
  • Используйте, makunboundчтобы удалить использование символа в качестве динамической переменной (то есть, чтобы аннулировать его symbol-value).

  • Используйте, fmakunboundчтобы удалить использование символа в качестве функции (то есть, чтобы аннулировать его symbol-function).

  • Используйте mapatomsдля перебора всех символов. Действуйте на каждого, чей symbol-nameсовпадает с конкретным префиксом, который вас интересует: звоните как makunboundи fmakunboundна него.

  • Вам не нужен uninternсимвол, если только вы не используете завершение для самих символов, а не только для их использования в качестве переменных или функций. Но если вы действительно хотите , чтобы полностью удалить символ затем использовать unintern.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.