Является ли require
идемпотентная? то есть делать
(require 'helm)
и
(require 'helm)
(require 'helm)
конец с тем же результатом?
Да. Из названных функций (акцент мой):
Имя элемента - это символ, обозначающий набор функций, переменных и т. Д. Файл, определяющий их, должен предоставлять функцию. Другая программа, которая использует их, может гарантировать, что они определены, требуя особенность. Это загружает файл определений, если он еще не был загружен.
Чтобы требовать наличия функции, вызовите
require
ее имя в качестве аргумента.require
ищет в глобальной переменной,features
чтобы увидеть, была ли уже предоставлена нужная функция. Если нет, он загружает функцию из соответствующего файла . Этот файл должен вызыватьсяprovide
на верхнем уровне, чтобы добавить функциюfeatures
; если это не удается,require
сигнализирует об ошибке .
Да, при условии, что код соответствует
helm.el
илиhelm.elc
соблюдает правило, которое он должен вызывать(provide 'helm)
. Вызов(provide 'helm)
помечает символhelm
как загруженную функцию , и это заставляет второй вызов(require 'helm)
ничего не делать.Если загруженный пакет не вызывает,
provide
тоrequire
сигнализирует об ошибке, и функция не помечается как загруженная, поэтому при повторном вызове(require 'helm)
попытка загрузки снова (и, как правило, происходит сбой по той же причине).источник