Как мне обратиться к функциям из загруженного файла? - PullRequest
4 голосов
/ 19 июля 2011

У меня есть функция, которая загружает выражения из другого файла, но я не знаю, что это за имя файла, оно хранится в переменной:

(defn run-migration [filename]
  (load filename)
  (run))

Я знаю, что у всех этих файлов есть общий метод, называемый «запустить». Поэтому я пытаюсь вызвать его после загрузки в эту функцию, но получаю сообщение об ошибке «Невозможно разрешить символ: выполнить», когда пытаюсь запросить этот файл в реплике до того, как файл будет загружен. Очевидно, что clojure пытается скомпилировать файл и «run» не привязан в это время, потому что загрузка происходит внутри функции?

Возможно, я поступаю неправильно. Любое руководство по хорошему (идиоматическому) способу иметь набор файлов, которые загружаются и запускаются во время выполнения?

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

В одном из моих проектов я динамически загружаю модули, используя следующий код (фрагмент реального кода):

... loop over found namespaces with following body....
(require (vector n :reload true))
(let [load-fun (ns-resolve n (symbol "load-rules"))]
     (when load-fun
        (try
          (load-fun)
        (catch Exception ex
        (error (str "Error during executing of func from namespace '" n "': " ex))))))

здесь n - символ, представляющий пространство имен.Этот символ создается динамически путем поиска в classpath ... Вот пример кода, который я использую для поиска модулей в classpath

2 голосов
/ 19 июля 2011

вы можете сказать компилятору, что функция run будет определена позже:

user> (declare run)
#'user/run
user> (load "filename")

, который загрузит ваш файл в репл. Возможно, вы захотите установить пространство имен, в которое вы загружаете файл, связав ns , хотя это не обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...