Этот вопрос тесно связан с this one, но я думаю, это более общий.Как мы можем создать «экземпляры» типа или записи «на лету»
Недавно я попытался создать «экземпляры» типа «на лету» с помощью мультиметодов (или с помощью уникального конструктора функций, если это возможно), основанный на теге метаданных. Я связал тип (класс 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))
Повторное чтение комментария цитированного предыдущего вопроса, возможно, единственный способ изменить функции datatypes clojure: -/ – jneira
Вы хотите написать собственный заводский код для каждого типа записи и связать его с типом записи так или иначе, чтобы вы может вызвать фабрику, используя имя типа записи (а не имя фабрики)? – Chouser
mmm точно это была оригинальная идея, без явной фабрики, если это возможно, используя методы с несколькими методами или протоколы (или несколько с отправкой), чтобы добавить конструкторы расширяемым способом. – jneira