[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How to iterate over properties in a plist?
From: |
Pascal J. Bourguignon |
Subject: |
Re: How to iterate over properties in a plist? |
Date: |
Sat, 01 Aug 2015 01:33:23 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) |
Marcin Borkowski <mbork@mbork.pl> writes:
> On 2015-08-01, at 00:18, Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>
>>> I need to iterate over all properties in a plist.
>>
>> First things first: go complain to whoever decided to use a plist
>> instead of an alist.
>
> Why? I did consider both and decided that a plist will be better in my
> use-case. Reasons: it is short anyway (no more than 3-5 properties at
> most), and I need to change it frequently (i.e., change the values of
> individual properties). This last operation seems much nicer in
> a plist. AFAIK, the "canonical" way to change a key-value pair in an
> alist is to push the new one at the beginning. In my case, the list
> will grow quickly.
You can use mutation on a-lists, and you can push new values on p-lists
too.
There's no difference between a-lists and p-list:
- in both cases, you need to traverse two cons to check the next key.
- you have the same number of memory accesses for all the operations.
It's really only a matter of taste.
Plus, p-list can be used to pass &key arguments to functions.
(defun* f (&key a b c)
(list a b c))
(apply (function f) '(:a 1 :c 2))
--> (1 nil 2)
and also with destructuring-bind:
(destructuring-bind (&key a b c) '(:a 1 :c 2)
(list a b c))
--> (1 nil 2)
You cannot do that with a-lists, there's no way to define an argument
taking and destructuring an a-list cons cell.
So if you ever have to use the contents of your dictionary as flat arguments
to a function, you will prefer a p-list.
(But of course, you can also write your function as taking a single
a-list or a single p-list, and query the parameter instead of
destructuring it into separate parameters).
Otherwise getf use eql to compare keys, &key accepts only symbols, while
assoc* (assoc in Common Lisp), takes a :test and a :key argument to find
keys. So if you use those standard lisp functions to process a-lists
and p-list, this may further constraint your choice.
--
__Pascal Bourguignon__ http://www.informatimago.com/
“The factory of the future will have only two employees, a man and a
dog. The man will be there to feed the dog. The dog will be there to
keep the man from touching the equipment.” -- Carl Bass CEO Autodesk