X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=lists.lisp;fp=lists.lisp;h=8bc548d829f924dabe8bf4b11b56618987e589ad;hp=ed2148ee347cba703e88b21cd44a1f400df42288;hb=7c7e6a18fd67e5370fd78690da2642cbe79e4113;hpb=0f12822c9d49849c26424743b3744d26056be4cc diff --git a/lists.lisp b/lists.lisp index ed2148e..8bc548d 100644 --- a/lists.lisp +++ b/lists.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: lists.lisp,v 1.6 2003/06/18 17:12:29 kevin Exp $ +;;;; $Id: lists.lisp,v 1.7 2003/06/20 08:35:22 kevin Exp $ ;;;; ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -166,7 +166,21 @@ ((null pl) alist) (setq alist (acons (car pl) (cadr pl) alist)))) +(defmacro update-plist (pkey value plist &key (test '#'eql)) + "Macro to support below (setf get-alist)" + (let ((pos (gensym))) + `(let ((,pos (member ,pkey ,plist :test ,test))) + (if ,pos + (progn + (setf (cadr ,pos) ,value) + ,plist) + (setf ,plist (append ,plist (list ,pkey ,value))))))) + (defun get-plist (key plist &key (test 'eql) (missing nil)) (let-if (pos (member key plist :test test)) (cadr pos) missing)) + +(defun (setf get-plist) (value key plist &key (test #'eql)) + (update-plist key value plist :test test) + value)