    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: Pure, functional, lazy ISBNs</title>
        <link>https://members.accu.org/index.php/articles/984</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Programming Topics + CVu Journal Vol 12, #2 - Mar 2000</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c65/">Programming</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c77/">CVu</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c127/">122</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c65-127/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c65+127/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;Pure, functional, lazy ISBNs</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 03 March 2000 13:15:35 +00:00 or Fri, 03 March 2000 13:15:35 +00:00</p>
<p><strong>Summary:</strong>&nbsp;<p>Sometimes the best thing you can do to improve your productivity is to take a holiday; a fresh perspective can work wonders. I'm going to describe one of my favourite holiday destinations. Haskell</p></p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e18" id="d0e18"></a></h2>
</div>
<p>Sometimes the best thing you can do to improve your productivity
is to take a holiday; a fresh perspective can work wonders. I'm
going to describe one of my favourite holiday destinations.</p>
<p>Haskell is a pure, functional programming language using lazy
evaluation.</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Pure: it has no assignments</p>
</li>
<li>
<p>Functional: you can treat functions just like any other
values</p>
</li>
<li>
<p>Lazy: it only evaluates expressions when needed</p>
</li>
</ul>
</div>
<p>I am going to give a brief introduction to the language, using
the core of the ISBN example from C Vu 11.5. The central routine
takes a sequence of integers corresponding to an ISBN or ISSN,
weights each by its position, calculates the total, and checks that
the total has remainder zero when divided by eleven.</p>
<p>A simple C++ implementation might be</p>
<pre class="programlisting">
bool is_valid(const int *a, int n) {
  int t = 0;
  for(int i = 0; i &lt; n; ++i)
    t += (i+1) * a[i];
  return (t % 11) == 0;
}
</pre>
<p>This totally ignores the complications introduced by
input/output and error handling, but translating this into Haskell
is informative.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e42" id="d0e42"></a>No
assignment</h2>
</div>
<p>Haskell functions have two parts: a definition and an
optional<sup>[<a name="d0e47" href="#ftn.d0e47" id=
"d0e47">1</a>]</sup> declaration, so we write</p>
<pre class="programlisting">
isValid :: [Int]-&gt;Bool
isValid xs = validateTotal 
        (addNumbers (weightDigits xs))
</pre>
<p>The first line declares <tt class="varname">isValid</tt> to have
type <tt class="literal">[Int]-&gt;Bool</tt>. That is, to be a
function taking a list of integers (<tt class="literal">[Int]</tt>)
and returning (<tt class="literal">-&gt;</tt>) a boolean
(<tt class="literal">Bool</tt>). The second line says that whenever
we see <tt class="varname">isValid</tt> applied to a value, we can
replace that by three other functions <tt class=
"function">validateTotal</tt>, <tt class="function">addNumbers</tt>
and <tt class="function">weightDigits</tt> applied to the same
value.</p>
<p>Function application is written by simple juxtaposition, so
<tt class="literal">weightDigits xs</tt> applies the <tt class=
"function">weightDigits</tt> function to the parameter <i class=
"parameter"><tt>xs</tt></i> which was passed to <tt class=
"varname">isValid</tt>. We could have used any name for the
parameter, but it is conventional to use a name ending in s for a
list.</p>
<p>The function <tt class="function">validateTotal</tt> is the
simplest of the three</p>
<pre class="programlisting">
validateTotal :: Int-&gt;Bool
validateTotal t = (mod t 11) == 0
</pre>
<p>where <tt class="literal">mod x y</tt> corresponds to <tt class=
"literal">x%y</tt> in C++. Apart from this, it is very close to the
corresponding C++</p>
<pre class="programlisting">
bool validate_total(int t)
{ return (t % 11) == 0; }
</pre>
<p>While C++ used a loop over an array, Haskell must add up all the
elements of a list. Lists in Haskell are either empty, written as
<tt class="literal">[ ]</tt>, or they can be split into their first
element and the rest of the list, written as (<tt class=
"literal">x:xs</tt>). Functions with lists as arguments can handle
these two cases separately, as in</p>
<pre class="programlisting">
addNumbers :: [Int]-&gt;Int
addNumbers [] = 0
addNumbers (x:xs) = x + addNumbers xs
</pre>
<p>The notation may be unfamiliar, but this definition states the
obvious: the sum of the numbers in an empty list is zero, and the
sum of the numbers in a non-empty list is given by adding the first
element to the sum of the rest.</p>
<p>This feature of Haskell is known as pattern-matching. When an
expression involves applying <tt class="function">addNumbers</tt>
to a value, it will be evaluated just enough to decide which of the
patterns will be used to rewrite the expression.</p>
<p>We can give a similar definition for <tt class=
"function">weightDigits</tt>, but we need to pass around another
parameter which indicates the current weight, so that</p>
<pre class="programlisting">
weightDigits :: [Int]-&gt;[Int]
weightDigits xs = weightDigitsBy 1 xs
</pre>
<p>where</p>
<pre class="programlisting">
weightDigitsBy :: Int-&gt;[Int]-&gt;[Int]
weightDigitsBy w [] = []
weightDigitsBy w (x:xs) = (w * x) :
            weightDigitsBy (w+1) xs
</pre>
<p>The declaration of <tt class="function">weightDigitsBy</tt> says
that it is a function taking an integer and returning another
function (<tt class="literal">[Int]-&gt;[Int]</tt>). By applying
<tt class="function">weightByDigits</tt> to the value 1 we get a
function which we can in turn apply to the list xs in order to get
the result we wanted. Using functions which return other functions,
instead of functions with multiple arguments, is known as
currying<sup>[<a name="d0e152" href="#ftn.d0e152" id=
"d0e152">2</a>]</sup>. (STL's function adapter <tt class=
"classname">bind1st</tt> achieves the same effect for binary
functions since <tt class="function">bind1st(f,x)(y)</tt> is just
<tt class="function">f(x,y)</tt>.)</p>
<p>Now</p>
<pre class="programlisting">
weightDigits xs = weightDigitsBy 1 xs
</pre>
<p>so applying <tt class="function">weightDigits</tt> to any value
has the same result as applying the function <tt class=
"function">weightDigitsBy</tt> 1; that is <tt class=
"function">weightDigits</tt> and <tt class=
"function">weightDigitsBy</tt> 1 are exactly the same function. It
follows that we can write</p>
<pre class="programlisting">
weightDigits = weightDigitsBy 1
</pre>
<p>dropping the parameter from both sides.</p>
<p>So far we've turned seven lines of C++ into a dozen longer lines
of Haskell. We can redress the balance by making use of some
features of the Haskell library.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e189" id="d0e189"></a>Folding
things up</h2>
</div>
<p>We did not need to define <tt class="classname">addNumbers</tt>.
The library function <tt class="function">sum</tt> does the same
thing, but at first sight its definition is nothing like the one
above. Simplifying slightly<sup>[<a name="d0e200" href=
"#ftn.d0e200" id="d0e200">3</a>]</sup>, the library defines</p>
<pre class="programlisting">
fold ::  (t -&gt; u -&gt; u) -&gt; u -&gt; [t] -&gt; u
fold f a [] = a
fold f a (x:xs) = f x (fold f a xs)
</pre>
<p>and then defines <tt class="function">sum</tt> as</p>
<pre class="programlisting">
sum :: [Int]-&gt;Int
sum = fold (+) 0
</pre>
<p><tt class="literal">(+)</tt> is just shorthand for the addition
function; for any binary operator <tt class="literal">@, (@)</tt>
is the corresponding curried function. <tt class="literal">(x @)
and (@ y)</tt> are shorthands for the corresponding unary
functions, so that <tt class="literal">(1 +)</tt> is a function
which adds one to its argument, while <tt class="literal">(/
3)</tt> divides by three.</p>
<p>What does <tt class="function">fold</tt> do? If the list is
empty, then it returns the seed value <tt class="varname">a</tt>
which we passed in. If the list is not empty, then it uses the
function <tt class="function">f</tt> to combine the first element
of the list with the result of <tt class="function">fold</tt> on
the rest of the list. The lower-case type names in the declaration
of <tt class="function">fold</tt> indicate that it is
polymorphic<sup>[<a name="d0e246" href="#ftn.d0e246" id=
"d0e246">4</a>]</sup> with respect to those types; any type can be
used. In the case of <tt class="function">sum</tt>, both those
types are <tt class="type">Int</tt>.</p>
<p><tt class="function">fold</tt> generalises the definition of
<tt class="function">addNumbers</tt>. It captures the shape of the
recursion, but allows the seed value and combining function to be
passed in. Once <tt class="function">fold</tt> is defined, we can
use it to define similar functions without having to code the
recursion explicitly. For example</p>
<pre class="programlisting">
product :: [Int]-&gt;Int
product = fold (*) 1
</pre>
<p>multiplies together the elements of a list.</p>
<p>Those familiar with the Standard Template Library may feel that
they've seen this before. fold corresponds almost exactly to the
accumulate algorithm from the STL.</p>
<pre class="programlisting">
template&lt;class InputIterator, class T&gt;
T accumulate(InputIterator first,
     InputIterator last, T init, 
    BinaryFunction binary_op);
</pre>
<p><tt class="function">accumulate</tt> captures the shape of a
particular loop, just as <tt class="function">fold</tt> does for
the recursion.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e281" id="d0e281"></a>Zipping
along</h2>
</div>
<p>We have simplified the definition of <tt class=
"function">addNumbers</tt> to</p>
<pre class="programlisting">
addNumbers = sum
</pre>
<p>Finding a direct replacement for <tt class=
"function">weightDigits</tt> in the library seems less likely; the
recursion in <tt class="function">weightDigitsBy</tt> involves both
a list and an incrementing weighting factor. We can, however,
replace that parameter with another list</p>
<pre class="programlisting">
weightByList :: [Int]-&gt;[Int]-&gt;[Int]
weightByList ws [] = []
weightByList (w:ws) (x:xs) = (w * x) :
               weightByList ws xs
</pre>
<p>That is, <tt class="function">weightByList</tt> takes a list of
weights which will be used for the corresponding values in the list
of digits. <tt class="function">weightDigits</tt> can then supply a
suitable list of weights</p>
<pre class="programlisting">
weightDigits xs = weightByList [1..(length xs)] xs
</pre>
<p>where <tt class="literal">[1..n]</tt> builds the list of numbers
from 1 to n inclusive. <tt class="function">weightByList</tt> just
multiplies together corresponding elements of two lists.
Generalising away from the multiplication we find that the library
contains</p>
<pre class="programlisting">
zipWith :: (t-&gt;u-&gt;v)-&gt;[t]-&gt;[u]-&gt;[v]
zipWith f xs [] = []
zipWith f [] ys = []
zipWith f (x:xs) (y:ys) = (f x y) : zipWith f xs ys
</pre>
<p>which combines corresponding elements of the two argument lists
using <tt class="varname">f</tt>, giving back the list of results.
<tt class="function">weightDigits</tt> is then just</p>
<pre class="programlisting">
weightDigits xs = zipWith (*) [1..(length xs)] xs
</pre>
<p>Finally, since <tt class="function">zipWith</tt> finishes as
soon as either of its argument lists runs out, we can pass in any
weight list which is at least as long as xs. In particular, we can
pass in [1..] which is the infinite list of integers starting from
one. Lazy evaluation guarantees that only the required portion will
be evaluated. That means that we can write</p>
<pre class="programlisting">
weightDigits = zipWith (*) [1..]
</pre></div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e338" id="d0e338"></a>Take it to
the limit</h2>
</div>
<p>Functional programming borrows the idea of composition from
mathematics. If <tt class="function">f</tt> and <tt class=
"function">g</tt> are functions, then <tt class="function">f.g</tt>
is the function which applies <tt class="function">f</tt> after
applying <tt class="function">g</tt>, so that</p>
<pre class="programlisting">
(f.g) x = f (g x)
</pre>
<p>The corresponding part of STL has not been standardised. Austern
[<a href="#Austern">Austern</a>] calls it <tt class=
"function">unary_compose</tt>. According to Josuttis[<a href=
"#Josuttis">Josuttis</a>] SGI called it <tt class=
"function">compose1</tt> and Boost<sup>[<a name="d0e374" href=
"#ftn.d0e374" id="d0e374">5</a>]</sup> uses <tt class=
"function">compose_f_gx</tt>.</p>
<p>Using this notation, we can write</p>
<pre class="programlisting">
isValid = validateTotal.addNumbers.weightDigits
</pre>
<p>We can even apply the same trick to rewrite <tt class=
"function">validateTotal</tt> from</p>
<pre class="programlisting">
validateTotal t = (mod t 11) == 0
</pre>
<p>to</p>
<pre class="programlisting">
validateTotal = (0 ==) . flip mod 11
</pre>
<p>The operator section <tt class="literal">(0 ==)</tt> compares
its argument against zero, and <tt class="literal">flip mod 11</tt>
takes the remainder of its argument by eleven. <tt class=
"function">flip</tt> reverses the order of arguments to a function,
that is</p>
<pre class="programlisting">
flip :: (t-&gt;u-&gt;v)-&gt;(u-&gt;t-&gt;v)
flip f y x = f x y
</pre>
<p>The closest STL analogue is <tt class="function">bind2nd</tt>
since <tt class="function">bind2nd(f,y)(x)</tt> evaluates to
<tt class="function">f(x,y)</tt>.</p>
<p>Eliminating all three of the helper functions, we can write
<tt class="function">isValid</tt> as</p>
<pre class="programlisting">
isValid :: [Int]-&gt;Bool
isValid = (0 ==).flip mod 11.sum.zipWith (*) [1..]
</pre>
<p>Or &quot;is zero equal to the remainder (modulo eleven) of the total
of the product of each digit with its position?&quot;, which is the
specification we started with.</p>
<p>Functional programs are often like this; they have a natural,
terse form which is close to the original description. The above
one-line definition is what I wrote down straight after the reading
the original C Vu article.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e432" id="d0e432"></a>Back to
C++</h2>
</div>
<p>Can we use the STL to produce a corresponding one-line C++
program? The last two components of</p>
<pre class="programlisting">
isValid = (0 ==).flip mod 11.sum.zipWith (*) [1..]
</pre>
<p>take corresponding values from two lists, multiply them together
and add up the results. Rummaging through the STL algorithms,
<tt class="function">inner_product</tt> takes corresponding values
from two input iterators, multiplies them together and adds up the
results. The simpler version of this algorithm defaults to using
<tt class="methodname">operator*</tt> and <tt class=
"methodname">operator+</tt>, and is</p>
<pre class="programlisting">
template&lt;class InputerIterator1,
           class InputIterator2, class T&gt;
T inner_product(InputIterator1 first1,
           InputIterator1 last1,
           InputIterator2 first2, T init);
</pre>
<p>That suggests we want an input iterator corresponding to
<tt class="literal">[1..]</tt>, the list of integers up from one.
Following the skeleton in Matthew Austern's book [<a href=
"#Austern">Austern</a>], that is</p>
<pre class="programlisting">
#include &lt;iterator&gt;

class upfrom
  : public std::iterator&lt;std::input_iterator_tag, int, ptrdiff_t, const int *, const int &amp;&gt;{
  int n;
public:
  upfrom(int x) : n(x) { }  
  reference operator*() const  { return n; }  
  pointer operator-&gt;() const  { return &amp;n; }  
  upfrom operator++() { return upfrom(++n); }  
  upfrom operator++(int){ return upfrom(n++); }  
  bool operator==(const upfrom &amp;x) const
              { return n == x.n; }  
  bool operator!=(const upfrom &amp;x) const
              { return n != x.n; }  
} ;
</pre>
<p>This is simplistic: we could certainly extend this to make it a
forward iterator, and the <tt class="type">int</tt> could be
replaced by a template parameter. However, it is all we need to
write the C++ equivalent of the Haskell as</p>
<pre class="programlisting">
#include &lt;algorithm&gt;
bool is_valid(const int *a, int n) {
  return (std::inner_product(a, a+n,
             upfrom(1), 0) % 11) == 0;
}
</pre>
<p>STL does not have a direct analogue for <tt class=
"function">zipWith</tt>, although constructing one is an
interesting exercise. Examining the above version of <tt class=
"function">is_valid</tt> may suggest why: splitting the call to
<tt class="function">inner_product</tt> into separate calls to
<tt class="function">accumulate</tt> and <tt class=
"function">zip_with</tt> requires storing the intermediate values.
The use of lazy evaluation allows Haskell to avoid this.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e486" id="d0e486"></a>Scratching
the surface</h2>
</div>
<p>I've been using it to tackle a toy problem, but Haskell is far
from a toy language. It has user-defined types, concise
list-comprehensions, both local and anonymous functions, a module
system for structuring projects, a substantial I/O library, and a
class system which is somewhere between inheritance and generic
programming.</p>
<p>It does have weaknesses. The most widespread version is
interpreted, the best compilers lag behind C compilers, and most
implementations require garbage collection. Using C-style APIs from
Haskell is a major challenge.</p>
<p>The lack of assignment is a problem in that habits established
with conventional languages may become a hindrance, but it is also
a major benefit. No assignment means no side-effects, so the subtle
problems caused by aliasing and evaluation order disappear at a
stroke. The easiest C++ classes to reason about are those with
value semantics (only const methods). In effect, Haskell permits
nothing else.</p>
<p>Reports suggest that programming in Haskell can be more
productive and less error-prone than in more conventional
languages. I regularly use Haskell for small puzzle-solving
programs, and I've had good results using it to prototype tools for
analysing other programs; pattern-matching functions are
well-suited for performing such symbolic manipulation. I would
hesitate before writing an interactive GUI application in Haskell,
although I have seen it done.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e497" id=
"d0e497"></a>Conclusion</h2>
</div>
<p>STL is relatively new and uses parts of C++ fresh from
standardisation, but the related ideas behind the Haskell library
can be traced back at least twenty years to the work of the Lisp
community. As such they have been part of my own toolkit for over a
decade; meeting them again in the STL was a pleasant surprise.</p>
<p>Every programming language can give you a different perspective,
especially the weird ones. Learn another language; it can be the
easiest way to improve your programming and could have benefits you
never anticipated.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e504" id=
"d0e504"></a>Acknowledgements</h2>
</div>
<p>Francis' talk on being multi-lingual, discussions over coffee at
the JACC seminar, Matthew Austern's book [<a href=
"#Austern">Austern</a>] on STL, and feedback from Phil Bass all
helped me to finish an article I've been thinking about for
years.</p>
<p>My favourite functional programming textbook [<a href=
"#Abelson">Abelson</a>] uses Scheme. Richard Bird's book [<a href=
"#Bird">Bird</a>] is a standard introductory text on Haskell. Mark
Jones' work on Hugs [<a href="#Jones-">Jones-</a>] helped make a
free version of Haskell available on a wide range of systems.</p>
</div>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e523" id="d0e523"></a>References</h2>
</div>
<div class="bibliomixed"><a name="Austern" id="Austern"></a>
<p class="bibliomixed">[Austern] Matthew Austern, &quot;Generic
Programming and the STL.&quot; ISBN 0 201 30956 4, Addison Wesley.</p>
</div>
<div class="bibliomixed"><a name="Josuttis" id="Josuttis"></a>
<p class="bibliomixed">[Josuttis] Nicolai M Josuttis, &quot;The C++
Standard Library.&quot; ISBN 0 201 37926 0, Addison Wesley.</p>
</div>
<div class="bibliomixed"><a name="Abelson" id="Abelson"></a>
<p class="bibliomixed">[Abelson] Harold Abelson, &quot;Structure and
interpretation of computer programs.&quot; ISBN 0 262 01077 1, MIT
Press.</p>
</div>
<div class="bibliomixed"><a name="Bird" id="Bird"></a>
<p class="bibliomixed">[Bird] Richard Bird, &quot;Introduction to
Functional Programming using Haskell.&quot; 0 13 484346 0,
Prentice-Hall.</p>
</div>
<div class="bibliomixed"><a name="Jones-" id="Jones-"></a>
<p class="bibliomixed">[Jones-] Mark P Jones et al., &quot;Hugs98.&quot;
Available from <span class="bibliomisc"><a href=
"http://www.haskell.org" target=
"_top">http://www.haskell.org</a></span>.</p>
</div>
</div>
<div class="footnotes"><br>
<hr class="c2" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.d0e47" href="#d0e47" id=
"ftn.d0e47">1</a>]</sup> The declaration is optional since Haskell
can deduce the type of any expression. Warnings of mismatches
between the declared and deduced types help to catch silly
mistakes.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e152" href="#d0e152" id=
"ftn.d0e152">2</a>]</sup> After Haskell B Curry who first described
it in the context of the lambda calculus, a mathematical construct
which has functions but no other values.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e200" href="#d0e200" id=
"ftn.d0e200">3</a>]</sup> Actually, I'm simplifying a lot. There
are issues here to do with the direction of the fold, associativity
of f, overloading of +, and forcing non-lazy evaluation.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e246" href="#d0e246" id=
"ftn.d0e246">4</a>]</sup> This is the term is used by the
functional programming community. It is only loosely related to
dynamic binding in C++.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e374" href="#d0e374" id=
"ftn.d0e374">5</a>]</sup> <a href="http://www.boost.org/" target=
"_top">http://www.boost.org/</a></p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
