Невозможно импортировать записи clojure

Я создал запись вроде этого:

(defrecord User [user-id email])

: но когда я пытаюсь получить доступ к нему из другого пространства имен, я получаю сообщение об ошибке:

(User. "name" "email")

java.lang.IllegalArgumentException: Невозможно разрешить имя класса: Пользователь

Работает, когда я делаю:

(oe.model.modelcore.User. "name" "email")

: Я знаю, что мне нужно будет импортировать Java-класс, но есть ли способ clojure сделать это автоматически, когда я это сделаю:

(use 'oe.model.modelcore :reload)

Ответ 1

Технически вы должны это требовать (необязательно использовать его), чтобы файл, содержащий определение записи, был скомпилирован и был создан класс. Затем вы должны импортировать его так, чтобы он был доступен для создания в качестве класса Java. Если вы создаете функцию-конструктор в первых ns, например

(defn new-user [id email] 
  (User. id email))

то вам не нужно будет импортировать его в вызывающий ns.

Я написал это некоторое время назад:

Ответ 2

Вам нужно импортировать запись следующим образом:

(ns some-ns
  (:import [oe.model.modelcore User]))

Ответ 3

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

Однако, предпочтительный путь (так как Clojure 1.4) должен использовать функции конструктора, созданные defrecord (здесь они будут называться ->User и map->User). Эти функции позволяют избежать форм взаимодействия и просто ссылаться на функции конструктора, как и на любую другую функцию. Избегая вмешательства, это более портативное решение с меньшим хостингом:

(ns some-ns 
  (:require [oe.model.modelcore :refer (->User)]))

(def user (->User "name" "email"))

Ответ 4

Это может быть очень сложно, если в вашем пространстве имен есть - (тире).

Как оказалось, были две ошибки:

- Импорт defrecord из другого пространства имен не просто: используйте. Я должен был сначала: потребовать пространство имен, а затем импортировать defrecord. Это была тривиальная проблема для решения, и я быстро ее понял. Только это не сработало в моем случае

- Пункты "-" и "Подчеркивания" _ "являются неприятностью, поскольку мы смешиваем Lisp с Java. В то время как файловая система использует символы подчеркивания Clojure преобразует объекты в тире. Brilliant.

Итак, чтобы исправить вторую ошибку, я использую следующее в блоке ns

(ns adder.core
    (:require building-blocks.activity)
    (:import [building_blocks.activity Activity]))

https://cyrax.wordpress.com/2013/07/22/clojure-importrequireuse-defrecord-from-another-namespace/