2013-04-14 3 views
0

Предположим, у меня есть тип данных, в котором есть только одно поле, содержащее отсортированную карту.Clojure: прямой доступ к уникальному полю типа

(defrecord AdjacencyList [data]) 
(def adjacency-list (AdjacencyList. (sorted-map 1 {2 100}, 2 {3 -100}))) 

Теперь, если я хочу, чтобы манипулировать поле и держать его тип я должен сделать что-то вроде этого:

(AdjacencyList. (dissoc (:data adjacency-list) 2)) 

Есть ли способ, чтобы ссылаться на поле, вызвав запись?

(dissoc adjacency-list 2) 

Если мне нужна регулярная хэш карта я мог бы использовать реализацию карты рекорда, но мне нужен отсортированная карта, и я получил другие аналогичные типы данных, используя наборы и векторы.

Решение будет заключаться в использовании deftype вместо этого и реализации необходимых структур данных, но я надеялся, что это не будет необходимо. обновление в функции

+0

Пластинки одно поле, правильно? Есть ли причина, по которой вы не используете отсортированную карту напрямую? Это полиморфизм? – Beyamor

+0

@beyamor Правильно, это одно поле, и я реализую протокол. – adeandrade

+1

Это ваш протокол, или кто-то еще? Если вы, можете рассмотреть возможность ввода информации о типе в метаданные и вместо этого использовать несколько методов. – Chouser

ответ

2

Clojure работает на все виды ассоциативных коллекций, включая отсортированные карты и defrecords:

(обновление в смежности список [: данные] dissoc 2)

+0

Я предполагаю, что смогу обернуть обновление в функции/macro и предположить, что все мои одиночные поля называются «данными». Другое дело, что я слишком стараюсь поддерживать тип вдоль функции. Я мог бы просто разрушить: данные как параметр функции и снова преобразовать его в тип данных, если и когда функция вернет его или передаст ее другой функции. Тем не менее, это еще один мяч, чтобы держать вас в курсе. – adeandrade

Смежные вопросы