|
Subject: Re: (dsssl) newbie coding question From: Brandon Ibach <bibach@xxxxxxxxxxxxxx> Date: Tue, 2 Oct 2001 01:52:04 -0500 |
Quoting Trent Shipley <tcshipley@xxxxxxxxxxxxx>:
> Unfortunately constructs like the below dont work. Depending on the
> variation that I try the OpenJade parser says there is no current
> node to provide a context, or the function fails to return a value of
> type style, or it an object having a given id number can't be found.
>
> (define p-style-prime
> (cond ((has-ancestor "NOTE")(note-p-style))
> (else (standard-p-style))))
>
The problem with this (define) has to do with DSSSL's processing
model. Top-level (define)s, such as this, are evaluated before
document processing begins. Therefore, there is no "current node" to
examine. What you want is to create a *procedure* which, upon every
invocation, will evaluate the properties of the current node to
determine which style to use:
(define (p-style-prime n)
(cond ((have-ancestor? "NOTE" n) note-p-style)
(else standard-p-style)))
Note the parens around "p-style-prime", indicating a procedure
definition, with an argument, "n". Also, you would not want the
parens around "note-p-style" or "standard-p-style", as these are style
values, not procedures. You don't want to invoke the style, you just
want to return it.
Now, the usage would look like:
(define (STANDARD-PARAGRAPH)
(make paragraph
use: (p-style-prime (current-node))
...))
Note the parens, again, around "p-style-prime", to invoke it as a
procedure, passing the result of the (current-node) procedure, which,
of course, returns the "current node" (or, "this-node"). :)
> Ideally the cast would be polymorphic so that a call to
> p-style-prime uses the current (nodal) context. However, a call with
> the form (p-style-prime this-node) would be fine provided someone can
> tell me how to name "this-node".
>
Well, we have the latter, above. Wanna shoot for the former?
Let's use DSSSL's "optional" feature to provide a default for the
argument to our procedure:
(define (p-style-prime #!optional (n (current-node)))
(cond ((have-ancestor? "NOTE" n) note-p-style)
(else standard-p-style)))
The only change here is declaring that the "n" argument is
"optional", and providing a default for it. Unless you explicitly
specify a value for "n" in your invocation of (p-style-prime), DSSSL
will automatically supply the result of the (current-node) procedure
as a default value for "n". Thus, the usage becomes:
(define (STANDARD-PARAGRAPH)
(make paragraph
use: (p-style-prime)
...))
I hope this is all clear. If not, let me know. :)
-Brandon :)
DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| (dsssl) newbie coding question, Trent Shipley | Thread | Re: (dsssl) newbie coding question, Holger Klawitter |
| (dsssl) polymorphic em, Trent Shipley | Date | Re: (dsssl) polymorphic em, Brandon Ibach |
| Month |