Basically, I'm wondering if there is such a thing as a plist in Common Lisp outside the concept of the built-in symbol property list. So if I have
(setq Joe '(:fav-season "Fall" :fav-color "Blue"))
then I do
(setf (get 'Joe 'fav-season) "Summer")
(setf (get 'Joe 'fav-color) "Green")
I've got two separate plists associated with Joe going at once, one ad-hoc, the other "official" because it's bound to the symbol Joe.
(get 'Joe 'fav-color)
"Green"
or
(symbol-plist 'Joe)
(FAV-COLOR "Green" FAV-SEASON "Summer")
So I assume the direct assigning of a plist-like structure to Joe (assigning to the symbol Joes's value cell) isn't a truly supported data structure (like get, getf etc.) as it is with the symbol Joe's property list. Nor as an alist, which is always the value of a variable and has assoc, rassoc, etc. May I therefore conclude there really is no use of the plist concept in the real world besides the built-in symbol cell for property lists? So often in tutorials, plist is automatically described as the symbol's property list, and there is no further discussion of the concept.
I guess in a backwards way, I'm pursuing the rather vague, spotty idea of what are good, best-practice data structures in Lisp.
Use GETF to retrieve values from a list, which is a property list.
CL-USER 141 > (let ((joe '(:fav-season "Fall"
:fav-color "Blue")))
(list (getf joe 'fav-color)
(getf joe :fav-color)))
(NIL "Blue")
Notice that you need to get the indicator right.
You've used GET, which can be implemented in terms of GETF:
(defun get (x y)
(getf (symbol-plist x) y))
Thus one can use property lists not just in symbol property lists - there is a basic operator for it.
Note also that there are many other data structures, which allow access to values via keys: assoc lists, CLOS classes, hash-tables. There are slightly different use cases for those.
Property lists are often used when simple key and value data needs to be used in lists - for example in source code.
Functions use property list like lists for keyword arguments, which one can manipulate:
(let ((foo (list 'window :x 100 :y 200)))
(setf (getf (rest foo) :x) 200)
(apply #'make-instance foo))
Sometimes property lists are added to CLOS classes or structures. Structures in Common Lisp may not be extensible at runtime - they can't be redefined with additional slots. So often some classes and structures have a properties slot, where one can at runtime add/remove/updated the key/value pairs.
No, they are used ubiquitously, as a lightweight “map” construct. For example, in the popular library alexandria, there are functions to convert between alists, plists, and hash-tables. It is rather that the symbol-plists have fallen somewhat out of use.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With