Common lisp 仅在符号';s属性列表单元格?

Common lisp 仅在符号';s属性列表单元格?,common-lisp,plist,symbols,Common Lisp,Plist,Symbols,基本上,我想知道在内置符号属性列表的概念之外,公共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-

基本上,我想知道在内置符号属性列表的概念之外,公共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"

因此,我假设将类似plist的结构直接分配给
Joe
(分配给符号
Joes
的值单元格)并不像符号
Joe
的属性列表那样是真正受支持的数据结构(如
get
getf
等)。也不是作为一个列表,它始终是一个变量的值,具有
assoc
rassoc
,等等。因此,我是否可以得出结论,除了用于属性列表的内置符号单元之外,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列表、CLOS类、哈希表。对于这些,有一些稍微不同的用例

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

函数使用类似属性列表的列表作为关键字参数,用户可以对其进行操作:

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

有时属性列表会添加到CLOS类或结构中。Common 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列表、CLOS类、哈希表。对于这些,有一些稍微不同的用例

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

函数使用类似属性列表的列表作为关键字参数,用户可以对其进行操作:

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

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

不,它们作为轻量级“映射”构造被广泛使用。例如,在流行的alexandria库中,有一些函数可以在alist、plist和哈希表之间进行转换。相反,符号plist已经有些过时了。

不,它们作为一种轻量级的“地图”结构被广泛使用。例如,在流行的alexandria库中,有一些函数可以在alist、plist和哈希表之间进行转换。更确切地说,符号plist已经不再使用了。

是的,但对于我更大的问题,plist是否仅(主要)用于符号的属性列表,还是它自己使用过?我的困惑来自于教程似乎暗示plist仅用于符号的情况。现在我明白了,当变量有一个plist作为值时,使用的语法几乎与符号plists相同。现在我必须学习何时使用键/值列表、结构或对象。尽管如此,我们可以创建一个符号,用一个大的plist加载它,这似乎很奇怪,但如果我们不给它一个实际值,它实际上不是任何类型的变量,全局变量或词汇变量。在Lisp中,@147pm符号plists在内部很重要:像值或函数之类的东西可能是plist上的条目。另外,带有plist的符号可能是最早的对象(在面向对象的意义上),其中plist条目是插槽和值。@147pm时至今日,一些Lisp系统有一些关于符号的内部信息:文档字符串、源位置、编译器信息……是的,但对于我更大的问题,plist仅仅是一个plist(主要是一个)与符号的属性列表一起使用,还是它自己使用过?我的困惑来自于教程似乎暗示plist仅用于符号的情况。现在我明白了,当变量有一个plist作为值时,使用的语法几乎与符号plists相同。现在我必须学习何时使用键/值列表、结构或对象。尽管如此,我们可以创建一个符号,用一个大的plist加载它,这似乎很奇怪,但如果我们不给它一个实际值,它实际上不是任何类型的变量,全局变量或词汇变量。在Lisp中,@147pm符号plists在内部很重要:像值或函数之类的东西可能是plist上的条目。此外,带有plist的符号可能是最早的对象(在面向对象的意义上),其中plist条目是插槽和值。@147pm直到今天,一些Lisp系统仍然有一些关于符号的内部信息:文档字符串、源代码