Атомы имеют свойства в 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}
в зависимости от того, как вы хотите его использовать.