Есть два способа достичь того, что вы пытаетесь сделать. Сначала давайте рассмотрим пример deftype
.
user=> (deftype Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 2 3 4 5))
#'user/b
user=> (:a b)
nil
user=> (.a b)
1
Вы заметите несколько вещей здесь. Как уже упоминалось, вам нужно "." создать экземпляр вашего типа. Кроме того, вы не получаете доступ к ключевому слову (":" запись), только доступ к полю (опять же, с ".").
Другой метод заключается в определении записи с помощью defrecord
:
user=> (defrecord Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 3 5 7 9))
#'user/b
user=> (:a b)
1
user=> (.a b)
1
Это дает вам доступ к полям и ключевым словам. Этот доступ также легко вкладывается, если вы решите, что одно из ваших полей будет содержать другую запись.