* Re: How to iterate over properties in a plist? [not found] <mailman.7702.1438378982.904.help-gnu-emacs@gnu.org> @ 2015-07-31 23:34 ` Pascal J. Bourguignon 0 siblings, 0 replies; 8+ messages in thread From: Pascal J. Bourguignon @ 2015-07-31 23:34 UTC (permalink / raw) To: help-gnu-emacs Marcin Borkowski <mbork@mbork.pl> writes: > Hi all, > > I need to iterate over all properties in a plist. Obviously, mapcar (or > mapc, since I need side effects only) is of no use for me. I can easily > write a plist-mapc function: > > (defun plist-mapc (function plist) > "Iterate FUNCTION (a two-argument function) over PLIST. Error > checking is for weenies." > (when plist > (funcall function (car plist) (cadr plist)) > (plist-mapc function (cddr plist)))) > > but maybe it's there already? There's: (loop for (k v) on p-list by (function cddr) do (something-with :key k :value v)) But you might still want to abstrat it away in a map-plist function. -- __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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* How to iterate over properties in a plist? @ 2015-07-31 21:42 Marcin Borkowski 2015-07-31 22:18 ` Stefan Monnier 0 siblings, 1 reply; 8+ messages in thread From: Marcin Borkowski @ 2015-07-31 21:42 UTC (permalink / raw) To: Help Gnu Emacs mailing list Hi all, I need to iterate over all properties in a plist. Obviously, mapcar (or mapc, since I need side effects only) is of no use for me. I can easily write a plist-mapc function: --8<---------------cut here---------------start------------->8--- (defun plist-mapc (function plist) "Iterate FUNCTION (a two-argument function) over PLIST. Error checking is for weenies." (when plist (funcall function (car plist) (cadr plist)) (plist-mapc function (cddr plist)))) --8<---------------cut here---------------end--------------->8--- but maybe it's there already? TIA, -- Marcin Borkowski http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski Faculty of Mathematics and Computer Science Adam Mickiewicz University ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to iterate over properties in a plist? 2015-07-31 21:42 Marcin Borkowski @ 2015-07-31 22:18 ` Stefan Monnier 2015-07-31 22:29 ` Marcin Borkowski [not found] ` <mailman.7705.1438381807.904.help-gnu-emacs@gnu.org> 0 siblings, 2 replies; 8+ messages in thread From: Stefan Monnier @ 2015-07-31 22:18 UTC (permalink / raw) To: help-gnu-emacs > 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. Stefan ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to iterate over properties in a plist? 2015-07-31 22:18 ` Stefan Monnier @ 2015-07-31 22:29 ` Marcin Borkowski 2015-07-31 22:42 ` Dmitry Gutov [not found] ` <mailman.7705.1438381807.904.help-gnu-emacs@gnu.org> 1 sibling, 1 reply; 8+ messages in thread From: Marcin Borkowski @ 2015-07-31 22:29 UTC (permalink / raw) To: help-gnu-emacs 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. > Stefan Best, -- Marcin Borkowski http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski Faculty of Mathematics and Computer Science Adam Mickiewicz University ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to iterate over properties in a plist? 2015-07-31 22:29 ` Marcin Borkowski @ 2015-07-31 22:42 ` Dmitry Gutov 2015-08-01 13:34 ` Michael Heerdegen 0 siblings, 1 reply; 8+ messages in thread From: Dmitry Gutov @ 2015-07-31 22:42 UTC (permalink / raw) To: Marcin Borkowski, help-gnu-emacs On 08/01/2015 01:29 AM, Marcin Borkowski wrote: > 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. (setcdr (assoc value alist) new-value) works pretty well (but you'll probably need to add a not-found check). ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to iterate over properties in a plist? 2015-07-31 22:42 ` Dmitry Gutov @ 2015-08-01 13:34 ` Michael Heerdegen 0 siblings, 0 replies; 8+ messages in thread From: Michael Heerdegen @ 2015-08-01 13:34 UTC (permalink / raw) To: help-gnu-emacs Dmitry Gutov <dgutov@yandex.ru> writes: > (setcdr (assoc value alist) new-value) works pretty well (but you'll > probably need to add a not-found check). And in Emacs 25: (setf (alist-get key alist) new-value) even without not-found checking. Michael. ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <mailman.7705.1438381807.904.help-gnu-emacs@gnu.org>]
* Re: How to iterate over properties in a plist? [not found] ` <mailman.7705.1438381807.904.help-gnu-emacs@gnu.org> @ 2015-07-31 23:33 ` Pascal J. Bourguignon 2015-08-01 22:49 ` Stefan Monnier 0 siblings, 1 reply; 8+ messages in thread From: Pascal J. Bourguignon @ 2015-07-31 23:33 UTC (permalink / raw) To: help-gnu-emacs 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to iterate over properties in a plist? 2015-07-31 23:33 ` Pascal J. Bourguignon @ 2015-08-01 22:49 ` Stefan Monnier 0 siblings, 0 replies; 8+ messages in thread From: Stefan Monnier @ 2015-08-01 22:49 UTC (permalink / raw) To: help-gnu-emacs > There's no difference between a-lists and p-list: Far from it, there are many reasons to prefer alists: - there's twice as much memory parallelism in alists. - plists need to be "parsed" in order to figure out if an element is a key or a value. - plists come much later in the dictionary. Stefan ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2015-08-01 22:49 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <mailman.7702.1438378982.904.help-gnu-emacs@gnu.org> 2015-07-31 23:34 ` How to iterate over properties in a plist? Pascal J. Bourguignon 2015-07-31 21:42 Marcin Borkowski 2015-07-31 22:18 ` Stefan Monnier 2015-07-31 22:29 ` Marcin Borkowski 2015-07-31 22:42 ` Dmitry Gutov 2015-08-01 13:34 ` Michael Heerdegen [not found] ` <mailman.7705.1438381807.904.help-gnu-emacs@gnu.org> 2015-07-31 23:33 ` Pascal J. Bourguignon 2015-08-01 22:49 ` Stefan Monnier
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).