Возможно ли иметь структуру, вложенную в структуру в Clojure? Рассмотрим следующий код:
(defstruct rect :height :width)
(defstruct color-rect :color (struct rect))
(defn
#^{:doc "Echoes the details of the rect passed to it"}
echo-rect
[r]
(println (:color r))
(println (:height r))
(println (:width r)))
(def first-rect (struct rect 1 2))
;(def c-rect1 (struct color-rect 249 first-rect)) ;form 1
;output "249 nil nil"
(def c-rect1 (struct color-rect 249 1 2)) ;form 2
;output "Too many arguments to struct constructor
(echo-rect c-rect1)
Конечно, это надуманный пример, но бывают случаи, когда я хочу разбить большую структуру данных на более мелкие подструктуры, чтобы облегчить поддержку кода. Как показывают комментарии, если я делаю форму 1, я получаю «249 nil nil», но если я делаю форму 2, я получаю «Слишком много аргументов для конструктора структуры».
Если я неправильно подхожу к этому вопросу, подскажите, что мне делать. Поиск в группе Clojure google мне ничего не дал.
Редактировать:
Я предполагаю, что я не был так ясен в постановке своего вопроса, как я думал, что был:
1.) Можно ли в Clojure вложить одну структуру в другую? (Судя снизу, это да.)
2.) Если да, то каким будет правильный синтаксис? (Опять же, судя снизу, похоже, что есть несколько способов сделать это.)
3.) Как получить значение по указанному ключу, если у вас есть структура, вложенная в другую структуру?
Я предполагаю, что мой пример кода не очень хорошо продемонстрировал то, что я пытался сделать. Я добавляю это сюда, чтобы другим, ищущим это, было легче найти этот вопрос и ответы на него.