[movitz-cvs] CVS movitz/losp/muerte
ffjeld
ffjeld at common-lisp.net
Sun Apr 30 21:38:40 UTC 2006
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory clnet:/tmp/cvs-serv18377
Modified Files:
cons.lisp
Log Message:
Lifted sublis and nsublis from cmucl.
--- /project/movitz/cvsroot/movitz/losp/muerte/cons.lisp 2006/04/07 21:33:54 1.12
+++ /project/movitz/cvsroot/movitz/losp/muerte/cons.lisp 2006/04/30 21:38:40 1.13
@@ -9,7 +9,7 @@
;;;; Created at: Fri Dec 8 15:25:45 2000
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: cons.lisp,v 1.12 2006/04/07 21:33:54 ffjeld Exp $
+;;;; $Id: cons.lisp,v 1.13 2006/04/30 21:38:40 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -275,3 +275,42 @@
(defun acons (key datum alist)
"=> new-alist"
(cons (cons key datum) alist))
+
+(defun sublis (alist tree &key key (test 'eql) test-not)
+ "Substitutes from alist into tree nondestructively."
+ (declare (inline assoc))
+ (let ((key (or key 'identity))
+ (test (if test-not (complement test-not) test)))
+ (labels ((s (subtree)
+ (let* ((key-val (funcall key subtree))
+ (assoc (assoc key-val alist :test test)))
+ (cond (assoc (cdr assoc))
+ ((atom subtree) subtree)
+ (t (let ((car (s (car subtree)))
+ (cdr (s (cdr subtree))))
+ (if (and (eq car (car subtreE))
+ (eq cdr (cdr subtree)))
+ subtree
+ (cons car cdr))))))))
+ (s tree))))
+
+(defun nsublis (alist tree &key key (test #'eql) (test-not nil notp))
+ "Substitutes new for subtrees matching old."
+ (declare (inline assoc))
+ (let ((key (or key 'identity))
+ (test (if test-not (complement test-not) test))
+ (temp))
+ (labels ((s (subtree)
+ (cond ((Setq temp (nsublis-macro))
+ (cdr temp))
+ ((atom subtree) subtree)
+ (t (do* ((last nil subtree)
+ (subtree subtree (Cdr subtree)))
+ ((atom subtree)
+ (if (setq temp (assoc (funcall key subtree) alist :test test))
+ (setf (cdr last) (cdr temp))))
+ (if (setq temp (assoc (funcall key subtree) alist :test test))
+ (return (setf (Cdr last) (Cdr temp)))
+ (setf (car subtree) (s (car subtree)))))
+ subtree))))
+ (s tree))))
More information about the Movitz-cvs
mailing list