Атомы имеют свойства в Maclisp. Как сделать то же самое в Clojure?

Цитата из Справочного руководства Maclisp (1975): "Каждый атомарный символ имеет связанный с ним список свойств, который можно получить с помощью функции plist ".

Список свойств Maclisp представлял собой список пар "индикатор / значение". В Maclisp,

(get x y)

получает свойство x y.

(putprop x 'banana y)

устанавливает y-свойство x в значение banana.

Мне поручено преобразовать много старого кода Maclisp в Clojure. Я новичок в Clojure, но ненадолго, пока разворачивается этот проект. Прежде чем я сбегу и напишу что-нибудь сам, мне интересно, есть ли в Clojure уже функция "списка свойств"? Или что-то близкое?

А если нет, что бы собранные боги Clojure заставили меня реализовать такую ​​функцию? Помните, что каждый атомарный символ в Maclisp может, но не обязательно, иметь список свойств. Спасибо.

1 ответ

Решение

Clojure имеет карты метаданных, связанных с переменными / значениями данных:

user> (def x [1 2 3])
#'user/x

user> (reset-meta! #'x {:my-data 1})
;;=> {:my-data 1}

обратите внимание, что эти метаданные связаны с переменной, а не с данными, привязанными к переменной

user> (-> x var meta)
{:my-data 1}

user> (-> #'x meta) ;; short form
{:my-data 1}

user> (-> x meta)
nil

в противном случае вы можете прикрепить его к самому значению:

user> (def x ^{:some-data 101} [1 2 3])
#'user/x
user> (meta x)
{:some-data 101}

в зависимости от того, как вы хотите его использовать.

Другие вопросы по тегам