Как мы можем создавать «экземпляры» типа или записи на лету - PullRequest
1 голос
/ 20 сентября 2010

Этот вопрос тесно связан с этим , но я думаю, что он более общий.

В последнее время я пытаюсь создавать "экземпляры" типа "на лету" с помощью мультиметодов (или уникальной функцииконструктор, если возможно), основанный на теге метаданных.Я связал тип (класс Java под капотом) с этим тегом, а затем я не знал, как продолжить элегантным образом (без eval или java отражения и строк);new - это специальная форма, с которой трудно работать, хотя вы используете макросы.

В seudo-коде это будет:

(def my-tagged-data (with-meta my-data {:my-type-tag my-ns.My-Type}))
(def factory-function [tagged-data] 
     (create (:my-type-tag (meta tagged-data)) tagged-data))

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Вы можете предоставить заводские функции для своих типов.

(def my-tagged-data (with-meta my-data {:my-type-factory `my-type-factory}))

(defn factory-function
  [tagged-data] 
  (@(resolve (:my-type-factory (meta tagged-data))) tagged-data))

Это может быть или не быть возможным.

0 голосов
/ 20 сентября 2010

Я думаю, что вы должны использовать отражение. (Думаю, лучше, чем eval).

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