[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Looking for "literate programming" tools for Scheme/LISP



A while ago, I prepared some really simple tools for processing files
that were both documents and source code.  The basic idea is to use a
verbatim environment (with *no* interesting processing) for code, but
under a different name.  Consequently, it will work for any programming
language, but will never do any fancy formatting.

The idea is this:  You write a ".ptex" file.  Two "projections" are
defined for such files: one converts a ".ptex" file to a ".tex" file;
the other converts it to a ".lsp" (or whateverP file.  Two new
environments are defined:

   program  --  converted directly to verbatim for ".tex";
                contents outout as-is for ".lsp".

   program-only -- like program, but discarded for ".tex"

All that's required are two AWK scripts and some entries in a
Makefile:

-------------------- Makefile entries --------------------

.SUFFIXES: .ptex .tex .lisp .lsp

.ptex.tex: ; awk -f totex < $*.ptex > $*.tex

.ptex.lsp: ; awk -f tocode < $*.ptex > $*.lsp

.ptex.lisp: ; awk -f tocode < $*.ptex > $*.lisp

-------------------- totex script --------------------
BEGIN { state="copy" }

state == "copy" && /^ *\\begin{program}/       {print "\\begin{verbatim}"; break}
state == "copy" && /^ *\\end{program}/         {print "\\end{verbatim}"; break}
state == "copy" && /^ *\\begin{program-only}/  {state="ignore"; break}
state == "copy"                                {print; break}

/^ *\\end{program-only}/                       {state = "copy"; break}
-------------------- tocode script --------------------
BEGIN { state="ignore" }

state == "copy" && /^ *\\end{program}/         {state = "ignore"; printf "\n"; break}
state == "copy" && /^ *\\end{program-only}/    {state = "ignore"; printf "\n"; break}
state == "copy"                                {print; break}

/^ *\\begin{program-only}/                     {state = "copy"; break}
/^ *\\begin{program}/                          {state = "copy"; break}
-------------------- end --------------------

Simple, but can be effective.

Jeff Dalton,                      JANET: J.Dalton@uk.ac.ed             
AI Applications Institute,        ARPA:  J.Dalton%uk.ac.ed@nsfnet-relay.ac.uk
Edinburgh University.             UUCP:  ...!ukc!ed.ac.uk!J.Dalton