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

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.

Нарисовалась
источник