help-gnu-emacs
[Top][All Lists]
Advanced

[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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]