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