Subject: Re: Filtering nodes From: Brandon Ibach <bibach@xxxxxxxxxxxxxx> Date: Thu, 9 Nov 2000 16:08:06 -0600 |
Quoting Maltby, David G <david.g.maltby@xxxxxxxx>: > I would like to write a two node-list-filters, (first-ns nl) and > (last-ns nl), such that given the following node-list nl = (T N N S S S N), > (first-ns nl) would return (N N) which would be the two nodes following T > and before S, and (last-ns nl) would return (N) which would be the > last node in the node-list. > > The content model for the container of these elements would be > <!element C (T?, N*, S+, N*)> > > It seems some clever use of (node-list-filter) should be able to sort this > out but I am struggling with the appropriate lambda expression. Maybe there > is a better way. I have looked through section 10.2.3 but perhaps I am not > seeing the grove for the all the nodes. Any thoughts? > Well, I'd go with an approach using (node-list-reduce), which is a more general tool than (node-list-filter). In fact, you may have noticed that the standard defines (n-l-f) in terms of (n-l-r). The benefit of (n-l-r) in this case is that it allows us to carry an arbitrary object through the processing of the node list. The goal of (first-ns) could be stated as "return all of the N nodes until we see an S node": (define (first-ns nl) (node-list-reduce nl (lambda (o n) (let ((s (or (car o) (string=? (gi n) "S")))) (list s (if (and (not s) (string=? (gi n) "N")) (node-list (cadr o) n) (cadr o))))) (list #f (empty-node-list)))) Here, we carry a list object containing a boolean and a node list. The node list is, of course, the result which we are building. The boolean tracks whether we have seen an S node yet. The definition is similar for (last-ns), whose goal is "return all of the N nodes after we see an S node": (define (last-ns nl) (node-list-reduce nl (lambda (o n) (let ((s (or (car o) (string=? (gi n) "S")))) (list s (if (and s (string=? (gi n) "N")) (node-list (cadr o) n) (cadr o))))) (list #f (empty-node-list)))) In fact, the definitions are identical except for the (not) in (first-ns), right before the check to see if the current node is an N. It wouldn't take much to create a single definition, called by both of these functions, which takes an extra boolean argument to specify which set of N nodes you want. Here's a hint: (define (xor a b) (if (and a b) #f (or a b))) -Brandon :) DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Filtering nodes, Maltby, David G | Thread | Re: Filtering nodes, ptyso |
Filtering nodes, Maltby, David G | Date | Re: Filtering nodes, ptyso |
Month |