How is (:A 1 :D 4) wrong? There is no way to get it to just (:D 4) via mutation when passing to a function. If we want to have just (:D 4), we will need to either pass in (nil nil <plist>) which will give (nil nil :D 4) or we will need to encapsulate or box the value before going in, by using something like https://bitbucket.org/tarballs_are_good/cl-ref . All in all, it still returns (:D 4), but it just modifies as much of the list structure as it can. -Robert On Sat, Feb 23, 2013 at 11:53 AM, Stas Boukarev <stassats@gmail.com> wrote:
Robert Smith <quad@symbo1ics.com> writes:
Good style remarks, I suppose, which I can change.
On Sat, Feb 23, 2013 at 8:08 AM, Stas Boukarev <stassats@gmail.com> wrote:
And I don't quite understand the purpose of (unless (eq first plist) (setf (cddr plist) first))
The point of that was for more DWIMness.
Without it, we have:
CL-USER> (let ((x (list :a 1 :b 2 :c 3 :d 4))) (print (delete-from-plist x :a :b :c)) x)
(:D 4) (:A 1 :B 2 :C 3 :D 4)
And with it, we have:
CL-USER> (let ((x (list :a 1 :b 2 :c 3 :d 4))) (print (delete-from-plist x :a :b :c)) x)
(:D 4) (:A 1 :D 4)
If your typical mode of operation is to (setf x (delete-from...)), then of course either are fine. If your goal is to use DELETE-FROM-PLIST for its side effects, then I think the latter is more useful. In fact, for really simple and efficient imperative maintenance of a plist, just prepend (nil nil), and use the function purely for mutation. I don't see how (:A 1 :D 4) is useful, it's less wrong, but it's still wrong.
-- With best regards, Stas.