温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Lisp plist only in context of symbol's property list cell?
common-lisp plist symbols

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

发布于 2020-04-21 13:10:05

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

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

那我做

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

我有两次单独联系Joe,一次是特设的,另一次是“正式的”,因为它与符号 绑定Joe

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

要么

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

所以我承担的直接分配的plist状结构Joe(分配给符号Joes的价值单元)是不是一个真正支持的数据结构(如getgetf等),因为它是用符号Joe的属性列表。也不能用作列表,列表始终始终是变量的值,并且带有assocrassoc等等。因此,我是否可以得出结论,除了用于属性列表的内置符号单元格外,在现实世界中确实没有使用plist概念吗?因此,在教程中通常将plist自动描述为符号的属性列表,因此对该概念没有进一步的讨论。

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

查看更多

提问者
147pm
被浏览
28
Rainer Joswig 2020-02-06 17:01

用于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列表,CLOS类,哈希表。这些有稍微不同的用例。

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

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

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

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