Date: 2020-10-07 18:10:00

Up | Next | Prev | PrevTail | Tail

## 17 Symbolic Mode

At the system level, REDUCE is based on a version of the programming language Lisp known as Standard Lisp which is described in J. Marti, Hearn, A. C., Griss, M. L. and Griss, C., “Standard LISP Report" SIGPLAN Notices, ACM, New York, 14, No 10 (1979) 48-68. We shall assume in this section that the reader is familiar with the material in that paper. This also assumes implicitly that the reader has a reasonable knowledge about Lisp in general, say at the level of the LISP 1.5 Programmer’s Manual (McCarthy, J., Abrahams, P. W., Edwards, D. J., Hart, T. P. and Levin, M. I., “LISP 1.5 Programmer’s Manual”, M.I.T. Press, 1965) or any of the books mentioned at the end of this section. Persons unfamiliar with this material will have some diﬃculty understanding this section.

Although REDUCE is designed primarily for algebraic calculations, its source language is general enough to allow for a full range of Lisp-like symbolic calculations. To achieve this generality, however, it is necessary to provide the user with two modes of evaluation, namely an algebraic mode and a symbolic mode. To enter symbolic mode, the user types symbolic; (or lisp;) and to return to algebraic mode one types algebraic;. Evaluations proceed diﬀerently in each mode so the user is advised to check what mode he is in if a puzzling error arises. He can ﬁnd his mode by typing

eval_mode;

The current mode will then be printed as ALGEBRAIC or SYMBOLIC.

Expression evaluation may proceed in either mode at any level of a calculation, provided the results are passed from mode to mode in a compatible manner. One simply preﬁxes the relevant expression by the appropriate mode. If the mode name preﬁxes an expression at the top level, it will then be handled as if the global system mode had been changed for the scope of that particular calculation.

For example, if the current mode is ALGEBRAIC, then the commands

symbolic car ’(a);
x+y;

will cause the ﬁrst expression to be evaluated and printed in symbolic mode and the second in algebraic mode. Only the second evaluation will thus aﬀect the expression workspace. On the other hand, the statement

x + symbolic car ’(12);

will result in the algebraic value X+12.

The use of SYMBOLIC (and equivalently ALGEBRAIC) in this manner is the same as any operator. That means that parentheses could be omitted in the above examples since the meaning is obvious. In other cases, parentheses must be used, as in

symbolic(x := ’a);

Omitting the parentheses, as in

symbolic x := a;

would be wrong, since it would parse as

symbolic(x) := a;

For convenience, it is assumed that any operator whose ﬁrst argument is quoted is being evaluated in symbolic mode, regardless of the mode in eﬀect at that time. Thus, the ﬁrst example above could be equally well written:

car ’(a);

Except where explicit limitations have been made, most REDUCE algebraic constructions carry over into symbolic mode. However, there are some diﬀerences. First, expression evaluation now becomes Lisp evaluation. Secondly, assignment statements are handled diﬀerently, as we shall discuss shortly. Thirdly, local variables and array elements are initialized to NIL rather than 0. (In fact, any variables not explicitly declared INTEGER are also initialized to NIL in algebraic mode, but the algebraic evaluator recognizes NIL as 0.) Finally, function deﬁnitions follow the conventions of Standard Lisp.

To begin with, we mention a few extensions to our basic syntax which are designed primarily if not exclusively for symbolic mode.

17.1 Symbolic Inﬁx Operators
17.2 Symbolic Expressions
17.3 Quoted Expressions
17.4 Lambda Expressions
17.5 Symbolic Assignment Statements
17.6 FOR EACH Statement
17.7 Symbolic Procedures
17.8 Standard Lisp Equivalent of Reduce Input
17.9 Communicating with Algebraic Mode
17.10 Rlisp ’88
17.11 References

Up | Next | Prev | PrevTail | Front