原子在 Maclisp 中具有属性。如何在 Clojure 中做同样的事情?

Lio*_*let 1 clojure property-list maclisp

引自 (1975) Maclisp 参考手册:“每个原子符号都与一个属性列表相关联,可以使用plist函数检索它。”

Maclisp 属性列表是“指标/值”对的列表。在 Maclisp 中,

(get x y)
Run Code Online (Sandbox Code Playgroud)

得到 x 的 y 属性。

(putprop x 'banana y)
Run Code Online (Sandbox Code Playgroud)

将 x 的 y 属性设置为香蕉。

我的任务是将许多旧的 Maclisp 代码转换为 Clojure。我是 Clojure 的新手,但随着这个项目的展开,我不会太久。在我跑去自己写一些东西之前,我想知道 Clojure 是否已经有“属性列表”功能?或者接近的东西?

如果没有,组装的 Clojure 众神会让我做什么来实现这样的功能?请记住,Maclisp 中的每个原子符号都可以但不必具有属性列表。谢谢你。

lee*_*ski 7

clojure 具有与变量/数据值关联的元数据映射:

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

user> (reset-meta! #'x {:my-data 1})
;;=> {:my-data 1}
Run Code Online (Sandbox Code Playgroud)

请注意,此元数据与变量相关联,而不是与变量绑定数据相关联

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

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

user> (-> x meta)
nil
Run Code Online (Sandbox Code Playgroud)

否则,您可以将其附加到值本身:

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

取决于你想如何使用它。