Lisp plist 仅在符号的属性列表单元格的上下文中?



基本上,我想知道在内置符号属性列表的概念之外,Common Lisp中是否存在plist这样的东西。所以如果我有

(setq Joe '(:fav-season  "Fall" :fav-color  "Blue"))

那我做

(setf (get 'Joe 'fav-season) "Summer")
(setf (get 'Joe 'fav-color) "Green")

我有两个单独的plist与Joe同时进行相关联,一个是临时的,另一个是"官方的",因为它绑定到符号Joe

(get 'Joe 'fav-color)
"Green"

(symbol-plist 'Joe)
(FAV-COLOR "Green" FAV-SEASON "Summer")

因此,我假设将类似 plist 的结构直接分配给Joe(分配给符号Joes的值单元格(并不是真正支持的数据结构(如getgetf等(,就像符号Joe的属性列表一样。也不是作为一个 alist,它总是变量的值,并且具有assocrassoc等。 因此,我可以得出结论,除了属性列表的内置符号单元格之外,现实世界中真的没有使用 plist 概念吗?因此,在教程中,plist 经常被自动描述为交易品种的属性列表,并且没有进一步讨论这个概念。

我想以一种倒退的方式,我正在追求一个相当模糊的、参差不齐的想法,即什么是 Lisp 中好的、最佳实践的数据结构。

使用GETF从列表(属性列表(中检索值。

CL-USER 141 > (let ((joe '(:fav-season  "Fall"
:fav-color  "Blue")))
(list (getf joe 'fav-color)
(getf joe :fav-color)))
(NIL "Blue")

请注意,您需要正确设置指标

您已经使用了GET,它可以在GETF方面实现:

(defun get (x y)
(getf (symbol-plist x) y))

因此,不仅可以在符号属性列表中使用属性列表 - 它有一个基本的运算符。

另请注意,还有许多其他数据结构,它们允许通过键访问值:assoc lists、CLOS 类、哈希表。这些用例略有不同。

当需要在列表中使用简单的键和值数据时,通常在列表中使用属性列表 - 例如在源代码中。

函数使用属性列表,如关键字参数的列表,可以操作:

(let ((foo (list 'window :x 100 :y 200)))
(setf (getf (rest foo) :x) 200)
(apply #'make-instance foo))

有时,属性列表会添加到 CLOS 类或结构中。Common Lisp 中的结构在运行时可能无法扩展 - 它们不能用额外的插槽重新定义。通常,某些类和结构具有属性槽,可以在运行时添加/删除/更新键/值对。

不,它们无处不在,作为轻量级的"map"结构。 例如,在流行的库alexandria中,有一些函数可以在 alists、plist 和哈希表之间进行转换。 相反,符号主义者已经有些不常用了。

如果您将符号用作一种"对象",而不仅仅是作为变量的名称,那么它的 plist 可能会非常有帮助。 例如,在构建表示偏序(偏序集(的数据结构时,我使用符号作为偏序元素。 偏序集的给定元素 x 将有一个过去,但也有一个未来,依此类推。 这些"值"中的任何一个或两个都可以方便地保留在列表中。 如果你想"标记"一个元素,也可以使用 plist;这种技术在编写算法时非常有用,例如找到偏序集的最小ELT。

最新更新