REDUCE is a lisp based system for symbolic computation by A. Hearn.
The real lisp is hidden for the user by a pascal like language, called
rlisp, which is parsed and converted to ordinary lisp, when read. 
Due to the nature of lisp any expression that returns a value may
appear at almost any place, for instance

b:=for i:=1:if x then y else z sum a(i)+if c then d else e+
     while x do begin ...; return ...; ... end;

is a perfectly correct rlisp expression. REDUCE itself and all
available libraries are written in rlisp. Users can also write their
own packages in rlisp, containing both low and high level REDUCE
procedures.

Besides the ordinary stuff available in almost any computer algebra
program, there are user written packages available for differential
geometry, determining symmetries of differential equations, lie
algebras etc., possibly using non standard data structures based on
lisp objects.

It will be clear from the rlisp expression given above that one has to
be very careful about what has to appear in math mode and what in text
mode. Moreover some additional indentation for complicated expressions
may be desirable. 
The second problem can be solved by carefully implementing the
production rules, the first one we solved by putting everything in
text mode except for the unary and binary operators like +, -, :=,
etc., and applying some tricks to get spaces that cannot be removed by
a cancel.

Changes necessary to weave and tangle in order to parse rlisp source
code correctly are the following:
- rlisp only knows one kind of string, namely the one surrounded by double
  quotes ", whereas a single quote ' is explicitly used as a 'quote'.
  This means that the parsing of strings had to be adapted.
- rlisp has an escape character '!', which means that an identifier
  may contain any character if it is preceded by an exclamation mark
  (in this way identifiers may even contain spaces), hence the parsing
  of identifiers had to be altered.
- we changed some things which seemed to be bugs: a) in the debug part of
  the weave code we replaced "\\{" by "\\\\{" since our compiler
  complained about it, b) "+\equiv" isn't TeX'ed in a very nice way so
  we replaced it by a new TeX macro "\PS" to be used for multiply
  defined modules.
- a minor change: we like tangle also to print the newlines in macros, so
  we #define'd NEWLINES_IN_MACROS.
- rlisp doesn't allow underscores to occur in identifiers, unless
  preceded by '!'. Therefore, we postprocess the tangled file in order
  to remove the underscores. Indeed this can also be done by changing
  tangle.web in the appropriate place, but I think it is more work to
  find the exact place where the change has to be made, than writing a
  C program that does a similar job. However, if you are more familiar
  with tangle than we are and know exactly where to make the change,
  feel free to do so (underscores preceded by '!' and in strings
  should stay).

Moreover, previewing the weaved & TeX'ed tangle I discovered what
seems to be a bug in your set of production rules of ceeweave, namely
'extern' followed by two simps seems to be missing a space, whereas
'extern' followed by one simp gives no problem.

I hope this 'blurb' about REDUCE and the necessary changes is
satisfactory. I have put all necessary files tarred, compressed and
uuencoded at the end of this mail. It is also available by anonymous
ftp from utmfu0.math.utwente.nl (130.89.60.149).

If you have comments or suggestions on our work, feel free to react.

Marcel Roelofs. 
