W3C home > Mailing lists > Public > public-xml-processing-model-wg@w3.org > April 2006

Re: A side-effect example

From: Norman Walsh <Norman.Walsh@Sun.COM>
Date: Wed, 26 Apr 2006 07:26:46 -0400
To: public-xml-processing-model-wg@w3.org
Message-ID: <87fyk0bmrt.fsf@nwalsh.com>
/ Alex Milowski <alex@milowski.org> was heard to say:
| For me, it is unclear what is the input for each of these
| steps.

They have no inputs. That's the degenerate case of "the inputs are exactly
the same each time".

|> If the Timestamp component has no such annotation (or asserts that it
|> doesn't have side effects) then that could still be the result
|> (implementations aren't required to cache results). But this would be
|> an equally valid result:
|>   <doc>
|>   <t>43151</t>
|>   <t>43151</t>
|>   <t>43151</t>
|>   </doc>
|
| But the output *isn't* a side effect.  It is the output.  You have three
| separate steps, each of which produce some output, and as such, this
| doesn't make sense unless they run at exactly the same time.

That's not necessarily true. Let's try to come at this a different way.

I assert that there are four kinds of components in the world:

1. Side-effect free and functional. Such components have no detectable
   effect on the world except for the inputs they consume and the
   outputs they produce and given the same inputs, they always produce
   the same outputs.

   <p:step name="p:load">
     <!-- loads the given input and returns it -->
     <p:input>
       <inline-document/>
     </p:input>
     <p:output label="constant-doc"/>
   </p:step>

2. Side-effect free and non-functional. Such components have no detectable
   effect on the world except for the inputs they consume and the
   outputs they produce, but given the same inputs, they may produce
   different outputs.

   <p:step name="p:timestamp">
     <!-- takes no input, returns the time of day -->
     <p:output label="time-of-day"/>
   </p:step>

3. With side-effects and functional. Such components may update
   databases, send launch commands to missles controlled by web
   services, or otherwise "scribble on the walls" but given the same
   inputs, they always produce the same outputs.

   <p:step name="p:update-db">
     <!-- adds its input to the database and returns its input -->
     <p:input>
       <inline-document/>
     </p:input>
     <p:output label="output"/>
   </p:step>

4. With side-effects and non-functional. Such components may update
   databases, send launch commands to missles controlled by web
   services, or otherwise "scribble on the walls", and given the same
   inputs, they may produce different outputs.

   <p:step name="p:log-system-temperature">
     <!-- writes system temperature to log file, returns system temp -->
     <p:output label="temp"/>
   </p:step>

One consequence of side-effects is that they may influence order of
execution, that is, A may need to be executed before B if B relies on
side-effects of A. I think the "auxiliary inputs" proposal allows
pipeline authors to address that issue. The other consequences,
updates to databases, additions to log files, etc., I'm willing to
call "out of scope". If we have consensus on that, then we just need
to deal with 1 and 2.

We could:

1. We could assert that all pipeline components must be 1 or 2.
2. We could indicate into which category every component in the
   standard library falls. Presumably engines that allow extension
   would have to let extension authors indicate this as well.
3. We could allow pipeline authors to identify whether or not
   an individual invocation of a component was or was not functional.

We've had two telcons of discussion about how to expose this
information and we don't seem to be approaching consensus, so let's
try a new approach.

I propose that we say that all components are non-functional. That is,
a pipeline implementation must behave as if it evaluated a component
every time it occurs. "Must behave as if" is spec-ease for "implementations
that are clever enough to determine with certainty that a component is,
in fact, functional are free to cache the intermediate results because
by golly if it is, no one will be able to tell."

Pipeline authors who are concerned about controlling the number of
times a component is executed can use the 'tee' component to split
output and thereby be confident that it will be evaluated only once.


                                        Be seeing you,
                                          norm

-- 
Norman Walsh
XML Standards Architect
Sun Microsystems, Inc.

Received on Wednesday, 26 April 2006 11:27:04 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 8 January 2008 14:21:47 GMT