оценить привязку функции к текущему пространству имен с помощью read-string - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь оценить строку, содержащую вызов функции. Функция определена в том же пространстве имен, где происходит оценка. Все работает хорошо, если символ приходит из библиотеки со ссылкой внутри ns body, например: (ns myname.myapp (:require [clj-time.core])).

Моя цель - загрузить файл (формат edn), который взаимодействует с пользовательскими символами. Вот минимальная настройка для воспроизведения проблемы:

(ns myname.myapp
  (:import [java.time Instant])
  (:gen-class))

(defn time-now []
  (->
   (Instant/now)
   (.toString)))

(defn -main [& args]
  (prn (eval (read-string "{:now (time-now)}"))))

Если я оцениваю sexp по sexp внутри буфера исходного файла, то все в порядке, но выполнение cli clj -m myname/myapp приводит к Unable to resolve symbol: time-now in this context. Любые идеи? Заранее спасибо.

1 Ответ

1 голос
/ 12 апреля 2020

Дело в том, что когда код оценивается внутри IDE / текстового редактора, текущее пространство имен указывает на последнее оцененное пространство имен, а в приведенном выше примере это myname.myapp, поэтому код работает.

Но при работающем модуле jar или cli активное пространство имен имеет другое имя (ether clojure.core или user). Решение состоит в том, чтобы перепривязать пространство имен во время оценки:

(ns myname.myapp
  (:import [java.time Instant])
  (:gen-class))

(defn time-now []
  (->
   (Instant/now)
   (.toString)))

(defn -main [& args]
  (binding [*ns* (find-ns 'myname.myapp)]
    (prn (eval (read-string "{:now (time-now)}")))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...