Является ли использование многократного использования одного и того же символа идемпотентом?

11

Является ли requireидемпотентная? то есть делать

(require 'helm)

и

(require 'helm)
(require 'helm)

конец с тем же результатом?

PythonNut
источник

Ответы:

14

Да. Из названных функций (акцент мой):

Имя элемента - это символ, обозначающий набор функций, переменных и т. Д. Файл, определяющий их, должен предоставлять функцию. Другая программа, которая использует их, может гарантировать, что они определены, требуя особенность. Это загружает файл определений, если он еще не был загружен.

Чтобы требовать наличия функции, вызовите requireее имя в качестве аргумента. requireищет в глобальной переменной, featuresчтобы увидеть, была ли уже предоставлена ​​нужная функция. Если нет, он загружает функцию из соответствующего файла . Этот файл должен вызыватьсяprovide на верхнем уровне, чтобы добавить функциюfeatures ; если это не удается, requireсигнализирует об ошибке .

lunaryorn
источник
Принято для цитирования документов.
PythonNut
Пожалуйста, включите информацию из ответа Жиля здесь. Или, @Gilles, тоже подойдет этот ответ в ваш.
Давелоял
13

Да, при условии, что код соответствует helm.elили helm.elcсоблюдает правило, которое он должен вызывать (provide 'helm). Вызов (provide 'helm)помечает символ helmкак загруженную функцию , и это заставляет второй вызов (require 'helm)ничего не делать.

Если загруженный пакет не вызывает, provideто requireсигнализирует об ошибке, и функция не помечается как загруженная, поэтому при повторном вызове (require 'helm)попытка загрузки снова (и, как правило, происходит сбой по той же причине).

Жиль "ТАК - прекрати быть злым"
источник
+1 Спасибо за дополнительную информацию. Это решило мою путаницу после прочтения документов.
PythonNut