|
Subject: Re: Nodes and counting From: christo@xxxxxxxxxxxxxxxxxx (Frank Christoph) Date: Wed, 1 Oct 1997 00:08:58 +0900 |
> [ What I really want is an (if-exist (sibling "child2") test - Does one
> exist? I.e. test for a sibling with
> given name, to make me less dependent on the dtd structure.
At the risk of making a mountain out of a molehill, how about this:
(define (or-map f #!rest bs)
(apply or (map f bs))
(define (curry f x) ; N.B., arity(f) > 1
(lambda (!#rest xs) (apply f (cons x xs))))
(define (gid=? x #!optional str)
(cond
((and (node-list? x) (string? str))
(string=? x str))
((string? x)
(string=? (current-node) x))
(else
(error "gid=?: expected (gid=? [<node>] <string>)"))))
(let* ((pred (lambda (n) (or-map (curry gid=? n) "child2" "child3")))
(ns (node-list-filter pred (follow (current-node)))))
(if (node-list-empty? ns) 0em 2em))
Here's a slightly shorter version, but I don't think Jade implements
node-list-some?. (Of course, you can always implement it yourself. There's a
sample in the standard.):
(let ((pred (lambda (n) (or-map (curry gid=? n) "child2" "child3")))
(if (node-list-some? pred (follow (current-node))) 0em 2em))
Remember, you have to be careful with or-map. In a lazy language it's an
occasionally useful combinator, but in DSSSL the #!rest arguments will all
get evaluated no matter what they are. Compare:
(define (undef) (undef))
(define (id x) x)
(or #t (undefined)) ==> #t
(or-map id #t (undefined)) ==> <doesn't terminate>
As long as you apply or-map only to constants you won't run into any trouble,
though.
--FC
DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: Nodes and counting, Paul Prescod | Thread | Re: Nodes and counting, Dave Love |
| Re: DSSSL extensions for XSL, Paul Prescod | Date | Re: Nodes and counting, Paul Prescod |
| Month |