Super Haddock (was Re: Literate Programming)

Magnus Carlsson
Fri, 25 Apr 2003 11:13:57 -0700

Johannes Waldmann writes:
 > > On Friday 25 April 2003 09:09, Ketil Z. Malde wrote:
 > > > I'm not sure I would like this.  I guess I'm one of (the apparen=
 > > > very few?) who are using LaTeX lhs style (using \begin/\end{code=
 > I don't use .lhs normally but I would love to see some "active lhs",=

 > that is, text containing Haskell expressions that actually
 > get evaluated when (or before) typsetting.
 > (Mathematica has this, and I'm sure some other systems do it also.)
 > Preferably accompanied by a class (like Show)=20
 > producing formatted output - perhaps LaTeX, perhaps HTML.
 > (Example application: I'm writing a graph theory text,
 > and I want to embed pictures that are produced by a Haskell program)=

 > I once built a similar beast (for active literate programming
 > in a domain specific language - not Haskell)=20
 > (but the implementation was done in Haskell, of course)
 > to typeset my PhD thesis.

Thomas Hallgren and I wrote a little system called HacWrite similar to
what you describe, for producing our thesis.  (Yes, it was
procrastination! :-)

Basically, it was Haskell, enhanced with a new literal for markup
text, within =ABfunny quotation marks like this=BB.  Within the text, o=
could again escape to Haskell by using curly brackets.  We had
backends generating LaTeX and HTML.  For example, the HacWrite source

  section =ABCongruence rules=BB $do

    =ABFollowing the style of {cite"berry:chemical"}, we define a
    bunch of congruence rules which can be used freely to find
    reaction rules to apply.=BB

    eqtable eqop
      [ (s+t        , t+s             ,=ABCommutativity of {parop}=BB)
      , (p(s+t)+u   , s+p(t+u)        ,=ABAssociativity of {parop}=BB)
      , (p(s<<t)<<u , s<<p(t<<u)      ,=ABAssociativity of {serop}=BB)
      , (s<<p(t!u)  , p(s<=B7t)<<u      ,=ABInternal communication in
      , (p(s+t)<=B7u  , p(s<=B7u)+p(t<=B7u) ,=ABDistributivity of
                                       {feedop} over {parop}=BB)
      , (p(s!t)<=B7u  , s!p(t<=B7u)       ,=ABOutput from {feedop}=BB)
      , (p(s!t)<<u  , s!p(t<<u)       ,=ABOutput from {serop}=BB)
      , (p(x?s)<=B7t  , s//(t,x)        ,=ABSubstitution=BB)

produced the (moderately nice-looking) HTML code at=20

and the hard copy (via LaTeX) on page 241 in

Although HacWrite was somewhat primitive, it was delightful to be able
to define and use Haskell functions instead of LaTeX macros.

I wonder how many typesetting systems like these there are out there,
written by PhD students...