基本上,我想知道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
的价值单元)是不是一个真正支持的数据结构(如get
,getf
等),因为它是用符号Joe
的属性列表。也不能用作列表,列表始终始终是变量的值,并且带有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中的结构在运行时可能无法扩展-不能使用其他插槽重新定义它们。因此,某些类和结构通常具有属性插槽,在该插槽中可以在运行时添加/删除/更新键/值对。
是的,但更大的问题是,plist是仅(主要)仅与符号的属性列表一起使用,还是曾经单独使用过?
我的困惑来自于教程似乎暗示仅在符号情况下使用plist的情况。现在我了解到,当一个变量具有一个plist作为值时,几乎使用与symbol-plists相同的语法。现在,我必须学习何时使用键/值列表,结构或对象。仍然,我们可以创建一个符号,并用一个大的plist加载它,这似乎很奇怪,但是如果我们不给它一个实际值,它实际上不是任何变量,无论是全局变量还是词法变量。有没有做过,或者比普通可变工作有优势?
@ 147pm过去在Lisp中,符号遍历在内部很重要:诸如值或函数之类的东西可能已经记录在plist中。另外,带有ppl的符号可能是最早的对象(从OOP的角度来看),其中plist条目是slot&values。
直到今天下午147时,某些Lisp系统仍在符号上包含一些内部信息:文档字符串,源位置,编译器信息,...