[cl-soap-cvs] CVS update: cl-soap/src/lxml.lisp
Sven Van Caekenberghe
scaekenberghe at common-lisp.net
Mon Oct 3 12:29:22 UTC 2005
Update of /project/cl-soap/cvsroot/cl-soap/src
In directory common-lisp.net:/tmp/cvs-serv23895/src
Modified Files:
lxml.lisp
Log Message:
added example sexpr-get, (setf sexpr-getf), sexpr-select and sexpr-remove
Date: Mon Oct 3 14:29:21 2005
Author: scaekenberghe
Index: cl-soap/src/lxml.lisp
diff -u cl-soap/src/lxml.lisp:1.8 cl-soap/src/lxml.lisp:1.9
--- cl-soap/src/lxml.lisp:1.8 Fri Sep 30 21:56:00 2005
+++ cl-soap/src/lxml.lisp Mon Oct 3 14:29:21 2005
@@ -1,8 +1,8 @@
;;;; -*- mode: lisp -*-
;;;;
-;;;; $Id: lxml.lisp,v 1.8 2005/09/30 19:56:00 scaekenberghe Exp $
+;;;; $Id: lxml.lisp,v 1.9 2005/10/03 12:29:21 scaekenberghe Exp $
;;;;
-;;;; Some tools to manipulate lxml
+;;;; Common utilities (mostly lxml) and some internal/experimental stuff
;;;;
;;;; Copyright (C) 2005 Sven Van Caekenberghe, Beta Nine BVBA. All Rights Reserved.
;;;;
@@ -47,7 +47,7 @@
"Find all elements of a specific tag in a lxml XML DOM list"
(remove-if-not #'(lambda (x) (eql (lxml-get-tag x) tag)) lxml))
-;;; internal
+;;; internal shared/common code
(defun actual-name (qname)
"For now we ignore prefixes ;-)"
@@ -58,5 +58,54 @@
(defun find-item-named (item-name sequence)
(find (actual-name item-name) sequence :test #'string-equal :key #'get-name))
+
+;;; manipulating sexpr (structured/nested plists with string keys)
+
+(defun sexpr-getf (sexpr key &optional default)
+ "Find the value of key in sexpr (returning default if not found)"
+ (cond ((null sexpr) default)
+ ((consp sexpr) (let ((current-key (first sexpr)))
+ (if (stringp current-key)
+ (if (string-equal current-key key)
+ (second sexpr)
+ (sexpr-getf (rest (rest sexpr)) key default))
+ (error "Illegal key in sexpr: ~s" current-key))))
+ (t (error "Not an sexpr: ~s" sexpr))))
+
+(defun (setf sexpr-getf) (value sexpr key)
+ "Destructively modify the value of key in sexpr to value (add at tail if not found)"
+ (cond ((null sexpr) (error "Cannot destructively add to the empty list"))
+ ((consp sexpr) (let ((current-key (first sexpr)))
+ (if (stringp current-key)
+ (if (string-equal current-key key)
+ (setf (second sexpr) value)
+ (if (null (rest (rest sexpr)))
+ (setf (rest (rest sexpr)) (list key value))
+ (setf (sexpr-getf (rest (rest sexpr)) key) value)))
+ (error "Illegal key in sexpr: ~s" current-key))
+ sexpr))
+ (t (error "Not an sexpr: ~s" sexpr))))
+
+(defun sexpr-select (sexpr keys)
+ "Return a new sexpr with keys and their values retained"
+ (cond ((null sexpr) '())
+ ((consp sexpr) (let ((current-key (first sexpr)))
+ (if (stringp current-key)
+ (if (member current-key keys :test #'string-equal)
+ `(,current-key ,(second sexpr) ,@(sexpr-select (rest (rest sexpr)) keys))
+ (sexpr-select (rest (rest sexpr)) keys))
+ (error "Illegal key in sexpr: ~s" current-key))))
+ (t (error "Not an sexpr: ~s" sexpr))))
+
+(defun sexpr-remove (sexpr keys)
+ "Return a new sexpr with keys and their values not retained"
+ (cond ((null sexpr) '())
+ ((consp sexpr) (let ((current-key (first sexpr)))
+ (if (stringp current-key)
+ (if (member current-key keys :test #'string-equal)
+ (sexpr-remove (rest (rest sexpr)) keys)
+ `(,current-key ,(second sexpr) ,@(sexpr-remove (rest (rest sexpr)) keys)))
+ (error "Illegal key in sexpr: ~s" current-key))))
+ (t (error "Not an sexpr: ~s" sexpr))))
;;;; eof
More information about the Cl-soap-cvs
mailing list