/* ==================================================================== */
/* file: macro.dem */
/* At some point, we get the message: DISPLACE undefined */
/* First, we'll play with some macros that do stack manipulation.
A stack behaves like a pile of physical objects. You can pile
more things on top of it or you can examine/remove the top object.
Classically, the operators PUSH and POP apply to stacks. Let's
try some examples... */
/* PUSH -- Adds a value to top of a stack */
PUSH(VALUE,STACKNAME)::=BUILDQ([VALUE,STACKNAME],
STACKNAME:CONS(VALUE,STACKNAME))$
/* POP -- Removes a value from top of a stack */
POP(STACKNAME)::=BUILDQ([STACKNAME],
BLOCK([TEMP:FIRST(STACKNAME)],
STACKNAME:REST(STACKNAME),TEMP))$
A:[];
PUSH('FOO,A);
PUSH('BAR,A);
A;
POP(A);
A;
POP(A);
A;
/* Now let's write a function-defining function. Suppose we have some
function that we feel like we are always recycling by making just a few
minor changes and leaving most of it intact ... eg,
POLY1(X):=X^3+45*X^2+432*X+1
POLY2(X):=X^3+45*X^2+432*X+2
... etc.
We might consider writing a macro for ourselves to save us the typing
done by defining this new each time. eg, ... */
POLYDEF(N)::=BUILDQ([NAME:CONCAT('POLY,N),N],
NAME(X):=X^3+45*X^2+432*X+N);
MEMBER('POLY83,FUNCTIONS);
POLYDEF(83);
DISPFUN(POLY83);