1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711 |
- \section{Syntax}
- \begin{Command}[semicolon]{;}
- The semicolon is a statement delimiter, indicating results are to be printed
- when used in interactive mode.
- \begin{Examples}
- (x+1)**2; & X^{2} + 2*X + 1 \\
- df(x**2 + 1,x); & 2*X
- \end{Examples}
- \begin{Comments}
- Entering a \key{Return} without a semicolon or dollar sign results in a
- prompt on the following line. A semicolon or dollar sign can be
- added at this point to execute the statement. In interactive mode, a
- statement that is ended with a semicolon and \key{Return} has its results
- printed on the screen.
- Inside a group statement \name{<<}\ldots\name{>>}
- or a \name{begin}\ldots\name{end} block, a
- semicolon or dollar sign separates individual REDUCE statements. Since
- results are not printed from a block without a specific \name{return}
- statement, there is no difference between using the semicolon or dollar
- sign. In a group statement, the last value produced is the value
- returned by the group statement. Thus, if a semicolon or dollar sign is
- placed between the last statement and the ending brackets, the group
- statement returns the value 0 or {\em nil}, rather than the value of the
- last statement.
- \end{Comments}
- \end{Command}
- \begin{Command}[dollar]{$}
- The dollar sign is a statement delimiter, indicating results are not to be
- printed when used in interactive mode.
- \begin{Examples}
- (x+1)**2$ &
- \explanationo{The workspace is set to $x^{2} + 2x + 1$
- but nothing shows on the screen} \\
- ws; & X^{2} + 2*X + 1
- \end{Examples}
- \begin{Comments}
- Entering a \key{Return} without a semicolon or dollar sign results in a
- prompt on the following line. A semicolon or dollar sign can
- be added at this point to execute the statement. In interactive mode, a
- statement that ends with a dollar sign \name{\$} and a \key{Return} is
- executed, but the results not printed.
- Inside a \nameref{group} statement \name{<<}\ldots\name{>>}
- or a \name{begin}\ldots\name{end} \nameref{block}, a
- semicolon or dollar sign separates individual REDUCE statements. Since
- results are not printed from a \nameref{block} without a specific
- \nameref{return}
- statement, there is no difference between using the semicolon or dollar
- sign.
- In a group statement, the last value produced is the value returned by the
- group statement. Thus, if a semicolon or dollar sign is placed between the
- last statement and the ending brackets, the group statement returns the
- value 0 or {\em nil}, rather than the value of the last statement.
- \end{Comments}
- \end{Command}
- \begin{Command}[percent]{%}
- The percent sign is used to precede comments; everything from a percent
- to the end of the line is ignored.
- \begin{Examples}
- df(x**3 + y,x);\% This is a comment \key{Return} & 3*X^{2} \\
- int(3*x**2,x) \%This is a comment; \key{Return} \\
- \explanation{A prompt is given, waiting for the semicolon that was not
- detected in the comment}
- \end{Examples}
- \begin{Comments}
- Statement delimiters \name{;} and \name{\$} are not detected between a
- percent sign and the end of the line.
- \end{Comments}
- \end{Command}
- % \begin{Operator}[ampersand]{&}
- %
- % ***** To be added *****
- %
- % \end{Operator}
- %
- %
- \begin{Operator}[dot]{.}
- \index{list}
- The . (dot) infix binary operator adds a new item to the beginning of an
- existing \nameref{list}. In high energy physics expressions,
- it can also be used
- to represent the scalar product of two Lorentz four-vectors.
- \begin{Syntax}
- \meta{item} \name{.} \meta{list}
- \end{Syntax}
- \meta{item} can be any REDUCE scalar expression, including a list;
- \meta{list} must be a \nameref{list} to avoid producing an error message.
- The dot operator is right associative.
- \begin{Examples}
- liss := a . \{\}; & LISS := \{A\} \\
- liss := b . liss; & LISS := \{B,A\} \\
- newliss := liss . liss; & NEWLISS := \{\{B,A\},B,A\} \\
- firstlis := a . b . \{c\}; & FIRSTLIS := \{A,B,C\} \\
- secondlis := x . y . \{z\}; & SECONDLIS := \{X,Y,Z\} \\
- for i := 1:3 sum part(firstlis,i)*part(secondlis,i);
- & A*X + B*Y + C*Z
- \end{Examples}
- \end{Operator}
- \begin{Operator}[assign]{:=}
- \index{assign}
- The \name{:=} is the assignment operator, assigning the value on the right-hand
- side to the identifier or other valid expression on the left-hand side.
- \begin{Syntax}
- \meta{restricted\_expression} \name{:=} \meta{expression}
- \end{Syntax}
- \meta{restricted\_expression} is ordinarily a single identifier, though simple
- expressions may be used (see Comments below). \meta{expression} is any
- valid REDUCE expression. If \meta{expression} is a \nameref{matrix}
- identifier, then
- \meta{restricted\_expression} can be a matrix identifier (redimensioned if
- necessary) which has each element set to the corresponding elements
- of the identifier on the right-hand side.
- \begin{Examples}
- a := x**2 + 1; & A := X^{2} + 1 \\
- a; & X^{2} + 1 \\
- first := second := third; & FIRST := SECOND := THIRD \\
- first; & THIRD \\
- second; & THIRD \\
- b := for i := 1:5 product i; & B := 120 \\
- b; & 120 \\
- w + (c := x + 3) + z; & W + X + Z + 3 \\
- c; & X + 3 \\
- y + b := c; & Y + B := C \\
- y; & - (B - C)
- \end{Examples}
- \begin{Comments}
- The assignment operator is right associative, as shown in the second and
- third examples. A string of such assignments has all but the last
- item set to the value of the last item. Embedding an assignment statement
- in another expression has the side effect of making the assignment, as well
- as causing the given replacement in the expression.
- Assignments of values to expressions rather than simple identifiers (such as in
- the last example above) can also be done, subject to the following remarks:
- \begin{itemize}
- \item[(i)]
- If the left-hand side is an identifier, an operator, or a power, the
- substitution rule is added to the rule table.
- \item[(ii)]
- If the operators \name{- + /} appear on the left-hand side, all but the first
- term of the expression is moved to the right-hand side.
- \item[(iii)]
- If the operator \name{*} appears on the left-hand side, any constant terms are
- moved to the right-hand side, but the symbolic factors remain.
- \end{itemize}
- Assignment is valid for \nameref{array} elements, but not for entire arrays.
- The assignment operator can also be used to attach functionality to operators.
- A recursive construction such as \name{a := a + b} is allowed, but when
- \name{a} is referenced again, the process of resubstitution continues
- until the expression stack overflows (you get an error message).
- Recursive assignments can be done safely inside controlled loop
- expressions, such as \nameref{for}\ldots or \nameref{repeat}\ldots\name{until}.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[equalsign]{=}
- The \name{=} operator is a prefix or infix equality comparison operator.
- \begin{Syntax}
- \name{=}\(\meta{expression}\name{,}\meta{expression}\)
- or
- \meta{expression} \name{=} \meta{expression}
- \end{Syntax}
- \meta{expression} can be any REDUCE scalar expression.
- \begin{Examples}
- a := 4; & A := 4 \\
- if =(a,10) then write "yes" else write "no";
- & no \\
- b := c; & B := C \\
- if b = c then write "yes" else write "no";
- & yes \\
- on rounded; \\
- if 4.0 = 4 then write "yes" else write "no";
- & yes
- \end{Examples}
- \begin{Comments}
- This logical equality operator can only be used inside a conditional
- statement, such as \nameref{if}\ldots\name{then}\ldots\name{else}
- or \nameref{repeat}\ldots\name{until}. In other places the equal
- sign establishes an algebraic object of type \nameref{equation}.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[replace]{=>}
- The \name{=>} operator is a binary operator used in \nameref{rule} lists to
- denote replacements.
- \begin{Examples}
- operator f; \\
- let f(x) => x^2; \\
- f(x); & x^{2}
- \end{Examples}
- \end{Operator}
- \begin{Operator}[plussign]{+}
- The \name{+} operator is a prefix or infix n-ary addition operator.
- \begin{Syntax}
- \meta{expression} \{ \name{+}\meta{expression}\}\repeated
- {\em or} \name{+}\(\meta{expression} \{,\meta{expression}\}\repeated\)
- \end{Syntax}
- \meta{expression} may be any valid REDUCE expression.
- \begin{Examples}
- x**4 + 4*x**2 + 17*x + 1; & X^{4} + 4*X^{2} + 17*X + 1 \\
- 14 + 15 + x; & X + 29 \\
- +(1,2,3,4,5); & 15
- \end{Examples}
- \begin{Comments}
- \name{+} is also valid as an addition operator for \nameref{matrix} variables
- that are of the same dimensions and for \nameref{equation}s.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[minussign]{-}
- The \name{-} operator is a prefix or infix binary subtraction operator, as well
- as the unary minus operator.
- \begin{Syntax}
- \meta{expression} \name{-} \meta{expression}
- or \name{-}\(\meta{expression},\meta{expression}\)
- \end{Syntax}
- \meta{expression} may be any valid REDUCE expression.
- \begin{Examples}
- 15 - 4; & 11 \\
- x*(-5); & - 5*X \\
- a - b - 15; & A - B - 15 \\
- -(a,4); & A - 4
- \end{Examples}
- \begin{Comments}
- The subtraction operator is left associative, so that a - b - c is equivalent
- to (a - b) - c, as shown in the third example. The subtraction operator is
- also valid with \nameref{matrix} expressions of the correct dimensions
- and with \nameref{equation}s.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[asterisk]{*}
- The \name{*} operator is a prefix or infix n-ary multiplication operator.
- \begin{Syntax}
- \meta{expression} \{ \name{*} \meta{expression}\}\repeated
- or \name{*}\(\meta{expression} \{,\meta{expression}\}\repeated\)
- \end{Syntax}
- \meta{expression} may be any valid REDUCE expression.
- \begin{Examples}
- 15*3; & 45 \\
- 24*x*yvalue*2; & 48*X*YVALUE \\
- *(6,x); & 6*X \\
- on rounded; \\
- 3*1.5*x*x*x; & 4.5*X^{3} \\
- off rounded; \\
- 2x**2; & 2*X^{2}
- \end{Examples}
- \begin{Comments}
- REDUCE assumes you are using an implicit multiplication operator when an
- identifier is preceded by a number, as shown in the last line above. Since
- no valid identifiers can begin with numbers, there is no ambiguity in
- making this assumption.
- The multiplication operator is also valid with \nameref{matrix} expressions
- of the
- proper dimensions: matrices \IFTEX{$A$}{A} and \IFTEX{$B$}{B}
- can be multiplied if
- \IFTEX{$A$}{A} is \IFTEX{$n \times m$}{n x m} and \IFTEX{$B$}{B} is
- \IFTEX{$m \times p$}{m x p}. Matrices and \nameref{equation}s can also be
- multiplied by scalars: the
- result is as if each element was multiplied by the scalar.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[slash]{/}
- The \name{/} operator is a prefix or infix binary division operator or
- prefix unary \nameref{recip}rocal operator.
- \begin{Syntax}
- \meta{expression}\name{/}\meta{expression} {\em or}
- \name{/}\meta{expression}
- or \name{/}\(\meta{expression},\meta{expression}\)
- \end{Syntax}
- \meta{expression} may be any valid REDUCE expression.
- \begin{Examples}
- 20/5; & 4 \\
- 100/6; & \rfrac{50}{3} \\
- 16/2/x; & \rfrac{8}{X} \\
- /b; & \rfrac{1}{B} \\
- /(y,5); & \rfrac{Y}{5} \\
- on rounded; \\
- 35/4; & 8.75 \\
- /20; & 0.05
- \end{Examples}
- \begin{Comments}
- The division operator is left associative, so that \name{a/b/c} is equivalent
- to \name{(a/b)/c}. The division operator is also valid with square
- \nameref{matrix} expressions of the same dimensions: With \IFTEX{$A$}{A} and
- \IFTEX{$B$}{B} both \IFTEX{$n \times n$}{n x n} matrices and \IFTEX{$B$}{B}
- invertible, \IFTEX{$A/B$}{A/B} is
- given by \IFTEX{$A \times B^{-1}$}{A*B^{-1}}.
- Division of a matrix by a scalar is defined, with the results being the
- division of each element of the matrix by the scalar. Division of a
- scalar by a matrix is defined if the matrix is invertible, and has the
- effect of multiplying the scalar by the inverse of the matrix. When
- \name{/} is used as a reciprocal operator for a matrix, the inverse of
- the matrix is returned if it exists.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[power]{**}
- The \name{**} operator is a prefix or infix binary exponentiation operator.
- \begin{Syntax}
- \meta{expression} \name{**}\meta{expression}
- or \name{**}\(\meta{expression},\meta{expression}\)
- \end{Syntax}
- \meta{expression} may be any valid REDUCE expression.
- \begin{Examples}
- x**15; & X^{15} \\
- x**y**z; & X^{Y*Z} \\
- x**(y**z); & X^{Y^{Z}} \\
- **(y,4); & Y^{4} \\
- on rounded; \\
- 2**pi; & 8.82497782708
- \end{Examples}
- \begin{Comments}
- The exponentiation operator is left associative, so that \name{a**b**c} is
- equivalent to \name{(a**b)**c}, as shown in the second example. Note
- that this is {\em not} \name{a**(b**c)}, which would be right associative.
- When \nameref{nat} is on (the default), REDUCE output produces raised
- exponents, as shown. The symbol \name{^}, which is the upper-case 6 on
- most keyboards, may be used in the place of \name{**}.
- A square \nameref{matrix} may also be raised to positive and negative powers
- with the exponentiation operator (negative powers require the matrix to be
- invertible). Scalar expressions and \nameref{equation}s may be raised to
- fractional and floating-point powers.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[caret]{^}
- The \name{^} operator is a prefix or infix binary exponentiation operator.
- It is equivalent to \nameref{power} or **.
- \begin{Syntax}
- \meta{expression} \name{^}\meta{expression}
- or \name{^}\(\meta{expression},\meta{expression}\)
- \end{Syntax}
- \meta{expression} may be any valid REDUCE expression.
- \begin{Examples}
- x^15; & X^{15} \\
- x^y^z; & X^{Y*Z} \\
- x^(y^z); & X^{Y^{Z}} \\
- ^(y,4); & Y^{4} \\
- on rounded; \\
- 2^pi; & 8.82497782708
- \end{Examples}
- \begin{Comments}
- The exponentiation operator is left associative, so that \name{a^b^c} is
- equivalent to \name{(a^b)^c}, as shown in the second example. Note
- that this is \meta{not} \name{a^(b^c)}, which would be right associative.
- When \nameref{nat} is on (the default), REDUCE output produces raised
- exponents, as shown.
- A square \nameref{matrix} may also be raised to positive
- and negative powers with
- the exponentiation operator (negative powers require the matrix to be
- invertible). Scalar expressions and \nameref{equation}s
- may be raised to fractional and floating-point powers.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[geqsign]{>=}
- \name{>=} is an infix binary comparison operator, which returns {\em true} if
- its first argument is greater than or equal to its second argument.
- \begin{Syntax}
- \meta{expression} \name{>=} \meta{expression}
- \end{Syntax}
- \meta{expression} must evaluate to an integer or floating-point number.
- \begin{Examples}
- if (3 >= 2) then yes; & yes \\
- a := 15; & A := 15 \\
- if a >= 20 then big else small;
- & small \\
- \end{Examples}
- \begin{Comments}
- The binary comparison operators can only be used for comparisons between
- numbers or variables that evaluate to numbers. The truth values returned
- by such a comparison can only be used inside programming constructs, such
- as \nameref{if}\ldots\name{then}\ldots\name{else}
- or \nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[greater]{>}
- The \name{>} is an infix binary comparison operator that returns
- {\em true} if its first argument is strictly greater than its second.
- \begin{Syntax}
- \meta{expression} \name{>} \meta{expression}
- \end{Syntax}
- \meta{expression} must evaluate to a number, e.g., integer, rational or
- floating point number.
- \begin{Examples}
- on rounded; \\
- if 3.0 > 3 then write "different" else write "same"; & same \\
- off rounded; \\
- a := 20; & A := 20 \\
- if a > 20 then write "bigger" else write "not bigger"; & not bigger \\
- \end{Examples}
- \begin{Comments}
- The binary comparison operators can only be used for comparisons between
- numbers or variables that evaluate to numbers. The truth values returned
- by such a comparison can only be used inside programming constructs, such
- as \nameref{if}\ldots\name{then}\ldots\name{else} or
- \nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[leqsign]{<=}
- \name{<=} is an infix binary comparison operator that returns
- {\em true} if its first argument is less than or equal to its second argument.
- \begin{Syntax}
- \meta{expression} \name{<=} \meta{expression}
- \end{Syntax}
- \meta{expression} must evaluate to a number, e.g., integer, rational or
- floating point number.
- \begin{Examples}
- a := 10; & A := 10 \\
- if a <= 10 then true; & true
- \end{Examples}
- \begin{Comments}
- The binary comparison operators can only be used for comparisons between
- numbers or variables that evaluate to numbers. The truth values returned
- by such a comparison can only be used inside programming constructs, such
- as \nameref{if}\ldots\name{then}\ldots\name{else} or
- \nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[less]{<}
- \name{<} is an infix binary logical comparison operator that
- returns {\em true} if its first argument is strictly less than its second
- argument.
- \begin{Syntax}
- \meta{expression} \name{<} \meta{expression}
- \end{Syntax}
- \meta{expression} must evaluate to a number, e.g., integer, rational or
- floating point number.
- \begin{Examples}
- f := -3; & F := -3 \\
- if f < -3 then write "yes" else write "no"; & no
- \end{Examples}
- \begin{Comments}
- The binary comparison operators can only be used for comparisons between
- numbers or variables that evaluate to numbers. The truth values returned
- by such a comparison can only be used inside programming constructs, such
- as \nameref{if}\ldots\name{then}\ldots\name{else}
- or \nameref{repeat}\ldots\name{until} or
- \nameref{while}\ldots\name{do}.
- \end{Comments}
- \end{Operator}
- \begin{Operator}[tilde]{~}
- The \name{~} is used as a unary prefix operator in the left-hand
- sides of \nameref{rule}s to mark \nameref{free variable}s. A double tilde
- marks an optional \nameref{free variable}.
- \end{Operator}
- \begin{Command}[group]{<<}
- The \name{<<}\ldots\name{>>} command is a group statement,
- used to group statements
- together where REDUCE expects a single statement.
- %%%INCONSISTENT??? \name{or}
- \begin{Syntax}
- \name{<<}\meta{statement}\{; \meta{statement} \name{or}
- \$\meta{statement}\}\optional \name{>>}
- \end{Syntax}
- \meta{statement} may be any valid REDUCE statement or expression.
- \begin{Examples}
- a := 2; & A := 2 \\
- if a < 5 then <<b := a + 10; write b>>; & 12 \\
- <<d := c/15; f := d + 3; f**2>>;
- & \rfrac{C^{2} + 90*C + 202}{225}
- \end{Examples}
- \begin{Comments}
- The value returned from a group statement is the value of the last
- individual statement executed inside it. Note that when a semicolon is
- placed between the last statement and the closing brackets, 0 or
- {\em nil} is returned. Group statements are often used in the
- consequence portions of \nameref{if}\ldots\name{then},
- \nameref{repeat}\ldots\name{until}, and
- \nameref{while}\ldots\name{do}
- clauses. They may also be used in interactive
- operation to execute several statements at one time. Statements inside
- the group statement are separated by semicolons or dollar signs.
- \end{Comments}
- \end{Command}
- \begin{Operator}{AND}
- The \name{and} binary logical operator returns {\em true} if both of its
- arguments are {\em true}.
- \begin{Syntax}
- \meta{logical\_expression} \name{and} \meta{logical\_expression}
- \end{Syntax}
- \meta{logical\_expression} must evaluate to {\em true} or {\em nil}.
- \begin{Examples}
- a := 12; & A := 12 \\
- if numberp a and a < 15 then write a**2 else write "no";
- & 144 \\
- clear a; \\
- if numberp a and a < 15 then write a**2 else write "no";
- & no
- \end{Examples}
- \begin{Comments}
- Logical operators can only be used inside conditional statements, such as
- \nameref{while}\ldots\name{do} or
- \nameref{if}\ldots\name{then}\ldots\name{else}. \name{and} examines each of
- its arguments in order, and quits, returning {\em nil}, on finding an
- argument that is not {\em true}. An error results if it is used in other
- contexts.
- \name{and} is left associative: \name{x and y and z} is equivalent to
- \name{(x and y) and z}.
- \end{Comments}
- \end{Operator}
- \begin{Command}{BEGIN}
- \name{begin} is used to start a \nameref{block} statement, which is closed with
- \name{end}.
- \begin{Syntax}
- \name{begin} \meta{statement}\{\name{;} \meta{statement}\}\optional \ \name{end}
- \end{Syntax}
- \meta{statement} is any valid REDUCE statement.
- \begin{Examples}
- begin for i := 1:3 do write i end; &
- \begin{multilineoutput}{1cm}
- 1
- 2
- 3
- \end{multilineoutput} \\
- begin scalar n;n:=1;b:=for i:=1:4 product(x-i);return n end;
- & 1 \\
- b; &
- X^{4} - 10*X^{3} + 35*X^{2} - 50*X + 24
- \end{Examples}
- \begin{Comments}
- A \name{begin}\ldots\name{end} block can do actions (such as \name{write}), but
- does not
- return a value unless instructed to by a \nameref{return} statement, which must
- be the last statement executed in the block. It is unnecessary to insert
- a semicolon before the \name{end}.
- Local variables, if any, are declared in the first statement immediately
- after \name{begin}, and may be defined as \name{scalar, integer,} or
- \name{real}. \nameref{array} variables declared
- within a \name{begin}\ldots\name{end} block
- are global in every case, and \nameref{let} statements have global
- effects. A \nameref{let} statement involving a formal parameter affects
- the calling parameter that corresponds to it. \nameref{let} statements
- involving local variables make global assignments, overwriting outside
- variables by the same name or creating them if they do not exist. You
- can use this feature to affect global variables from procedures, but be
- careful that you do not do it inadvertently.
- \end{Comments}
- \end{Command}
- \begin{Command}{block}
- A \name{block} is a sequence of statements enclosed by
- commands \nameref{begin} and \nameref{end}.
- \begin{Syntax}
- \name{begin} \meta{statement}\{\name{;} \meta{statement}\}\optional \ \name{end}
- \end{Syntax}
- For more details see \nameref{begin}.
- \end{Command}
- \begin{Command}{COMMENT}
- Beginning with the word \name{comment}, all text until the next statement
- terminator (\name{;} or \name{\$}) is ignored.
- \begin{Examples}
- x := a**2 comment--a is the velocity of the particle;;
- & X := A^{2}
- \end{Examples}
- \begin{Comments}
- Note that the first semicolon ends the comment and the second one
- terminates the original REDUCE statement.
- Multiple-line comments are often needed in interactive files. The
- \name{comment} command allows a normal-looking text to accompany the
- REDUCE statements in the file.
- \end{Comments}
- \end{Command}
- \begin{Operator}{CONS}
- The \name{cons} operator adds a new element to the beginning of a
- \nameref{list}. Its
- operation is identical to the symbol \nameref{dot} (dot). It can be used
- infix or prefix.
- \begin{Syntax}
- \name{cons}\(\meta{item},\meta{list}\) or \meta{item} \name{cons} \meta{list}
- \end{Syntax}
- \meta{item} can be any REDUCE scalar expression, including a list; \meta{list}
- must be a list.
- \begin{Examples}
- liss := cons(a,{b}); & \{A,B\} \\
- liss := c cons liss; & \{C,A,B\} \\
- newliss := for each y in liss collect cons(y,list x);
- & NEWLISS := \{\{C,X\},\{A,X\},\{B,X\}\} \\
- for each y in newliss sum (first y)*(second y);
- & X*(A + B + C)
- \end{Examples}
- \begin{Comments}
- If you want to use \name{cons} to put together two elements into a new list,
- you must make the second one into a list with curly brackets or the \name{list}
- command. You can also start with an empty list created by \name{\{\}}.
- The \name{cons} operator is right associative: \name{a cons b cons c} is valid
- if \name{c} is a list; \name{b} need not be a list. The list produced is
- \name{\{a,b,c\}}.
- \end{Comments}
- \end{Operator}
- \begin{Command}{END}
- The command \name{end} has two main uses:
- \begin{itemize}
- \item[(i)]
- as the ending of a \nameref{begin}\ldots\name{end} \nameref{block}; and
- \item[(ii)]
- to end input from a file.
- \end{itemize}
- \begin{Comments}
- In a \name{begin}\ldots\name{end} \nameref{block}, there need not be a delimiter
- (\name{;} or \name{\$}) before the \name{end}, though there must be one
- after it, or a right bracket matching an earlier left bracket.
- Files to be read into REDUCE should end with \name{end;}, which must be
- preceded by a semicolon (usually the last character of the previous line).
- The additional semicolon avoids problems with mistakes in the files. If
- you have suspended file operation by answering \name{n} to a \name{pause}
- command, you are still, technically speaking, ``in" the file. Use
- \name{end} to exit the file.
- An \name{end} at the top level of a program is ignored.
- \end{Comments}
- \end{Command}
- \begin{Type}{EQUATION}
- \index{equation}\index{equal}\index{arithmetic}
- An \name{equation} is an expression where two algebraic expressions
- are connected by the (infix) operator \nameref{equal} or by \nameindex{=}.
- For access to the components of an \name{equation} the operators
- \nameref{lhs}, \nameref{rhs} or \nameref{part} can be used. The
- evaluation of the left-hand side of an \name{equation} is controlled
- by the switch \nameref{evallhseqp}, while the right-hand side is
- evaluated unconditionally. When an \name{equation} is part of a
- logical expression, e.g. in a \nameref{if} or \nameref{while} statement,
- the equation is evaluated by subtracting both sides can comparing
- the result with zero.
- Equations occur in many contexts, e.g. as arguments of the \nameref{sub}
- operator and in the arguments and the results
- of the operator \nameref{solve}. An equation can be member of a \nameref{list}
- and you may assign an equation to a variable. Elementary arithmetic is supported
- for equations: if \nameref{evallhseqp} is on, you may add and subtract
- equations, and you can combine an equation with a scalar expression by
- addition, subtraction, multiplication, division and raise an equation
- to a power.
- \begin{Examples}
- on evallhseqp;\\
- u:=x+y=1$\\
- v:=2x-y=0$\\
- 2*u-v; & - 3*y=-2\\
- ws/3; & y=\rfrac{2}{3}\\
- \end{Examples}
- Important: the equation must occur in the leftmost term of such an expression.
- For other operations, e.g. taking function values of both sides, use the
- \nameref{map} operator.
- \end{Type}
- \begin{Operator}{FIRST}
- \index{list}\index{decomposition}
- The \name{first} operator returns the first element of a \nameref{list}.
- \begin{Syntax}
- \name{first}\(\meta{list}\) or \name{first} \meta{list}
- \end{Syntax}
- \meta{list} must be a non-empty list to avoid an error message.
- \begin{Examples}
- alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\
- first alist; & A \\
- blist := \{x,y,\{ww,aa,qq\},z\}; & BLIST := \{X,Y,\{WW,AA,QQ\},Z\} \\
- first third blist; & WW
- \end{Examples}
- \end{Operator}
- \begin{Command}{FOR}
- \index{loop}
- The \name{for} command is used for iterative loops. There are many
- possible forms it can take.
- \begin{INFO}
- {
- \begin{verbatim}
- / \
- / |STEP <number> UNTIL| \
- |<var>:=<number>| |<number>|
- FOR| | : | |<action> <exprn>
- | \ / |
- |EACH <var> IN <list> |
- \ /
- where <action> ::= DO|PRODUCT|SUM|COLLECT|JOIN.
- \end{verbatim}
- }
- \end{INFO}
- \begin{TEX}
- \begin{Syntax}
- \name{for}
- \begin{alternative}
- \meta{var} \name{:=} \meta{start} \name{:} \meta{stop}\\
- \meta{var} \name{:=} \meta{start} \name{step} \meta{inc}
- \name{until} \meta{stop}\\
- \name{each} \meta{var} \name{in} \meta{list}
- \end{alternative}
- \begin{alternative}
- \name{collect}\\
- \name{do}\\
- \name{join}\\
- \name{product}\\
- \name{sum}
- \end{alternative}
- \meta{expression}
- \end{Syntax}
- \end{TEX}
- \meta{var} can be any valid REDUCE identifier except \name{t} or
- \name{nil}, \meta{inc}, \meta{start} and \meta{stop} can be any expression
- that evaluates to a positive or negative integer. \meta{list} must be a
- valid \nameref{list} structure.
- The action taken must be one of the actions shown
- above, each of which is followed by a single REDUCE expression, statement
- or a \nameref{group} (\name{<<}\ldots\name{>>}) or \nameref{block}
- (\nameref{begin}\ldots\nameref{end}) statement.
- \begin{Examples}
- for i := 1:10 sum i;
- & 55 \\
- for a := -2 step 3 until 6 product a;
- & -8 \\
- a := 3; & A := 3 \\
- for iter := 4:a do write iter; \\
- m := 0; & M := 0 \\
- for s := 10 step -1 until 3 do <<d := 10*s;m := m + d>>; \\
- m; & 520 \\
- for each x in {q,r,s} sum x**2; & Q^{2} + R^{2} + S^{2} \\
- for i := 1:4 collect 1/i;
- & \{1,\rfrac{1}{2},\rfrac{1}{3},\rfrac{1}{4}\} \\
- for i := 1:3 join list solve(x**2 + i*x + 1,x);
- & \begin{multilineoutput}{5cm}
- \{\{X= -\rfrac{SQRT(3)*I + 1}{2},
- X= -\rfrac{SQRT(3)*I - 1}{2}\}
- \{X=-1\},
- \{X= - \rfrac{SQRT(5) + 3}{2},X=\rfrac{SQRT(5) - 3}{2}\}\}
- \end{multilineoutput}
- \end{Examples}
- \begin{Comments}
- The behavior of each of the five action words follows:
- \begin{TEX}
- \begin{center}
- \begin{tabular}{|l|p{5cm}|p{5cm}|}
- \hline
- \multicolumn{3}{|c|}{Action Word Behavior}\\
- \hline
- \multicolumn{1}{|c|}{Keyword} &
- \multicolumn{1}{c|}{Argument Type} & \multicolumn{1}{c|}{Action} \\
- \hline
- do & statement, command, group or block &
- Evaluates its argument once for each iteration of the loop, not saving
- results \\
- collect & expression, statement, command, group, block, list &
- Evaluates its argument once for each iteration of the loop, storing the results
- in a list which is returned by the \verb|for| statement when done \\
- join & list or an operator which produces a list &
- Evaluates its argument once for each iteration of the loop, appending the
- elements in each individual result list onto the overall result list \\
- product & expression, statement, command,
- \nameref{group} or \nameref{block} &
- Evaluates its argument once for each iteration of the loop, multiplying the
- results together and returning the overall product \\
- sum & expression, statement, command, group or block &
- Evaluates its argument once for each iteration of the loop, adding the results
- together and returning the overall sum\\
- \hline
- \end{tabular}
- \end{center}
- \end{TEX}
- \begin{INFO}
- {\begin{verbatim}
- Action Word Behavior
- Keyword Argument Type Action
- do statement, command, group Evaluates its argument once
- or block for each iteration of the loop,
- not saving results
- collect expression, statement, Evaluates its argument once for
- command, group, block, list each iteration of the loop,
- storing the results in a list
- which is returned by the for
- statement when done
- join list or an operator which Evaluates its argument once for
- produces a list each iteration of the loop,
- appending the elements in each
- individual result list onto the
- overall result list
- product expression, statement, Evaluates its argument once for
- command, group or block each iteration of the loop,
- multiplying the results together
- and returning the overall product
- sum expression, statement, Evaluates its argument once for
- command, group or block each iteration of the loop,
- adding the results together and
- returning the overall sum
- \end{verbatim} }
- \end{INFO}
- For number-driven \name{for} statements, if the ending limit is smaller
- than the beginning limit (larger in the case of negative steps) the action
- statement is not executed at all. The iterative variable is local to the
- \name{for} statement, and does not affect the value of an identifier with
- the same name. For list-driven \name{for} statements, if the list is
- empty, the action statement is not executed, but no error occurs.
- You can use nested \name{for} statements, with the inner \name{for}
- statement after the action keyword. You must make sure that your inner
- statement returns an expression that the outer statement can handle.
- \end{Comments}
- \end{Command}
- \begin{Command}{FOREACH}
- \index{loop}
- \name{foreach} is a synonym for the \name{for each} variant of the
- \nameref{for} construct. It is designed to iterate down a list, and an
- error will occur if a list is not used. The use of \name{for each} is
- preferred to \name{foreach}.
- \begin{Syntax}
- \name{foreach} \meta{variable} in \meta{list} \meta{action} \meta{expression} \\
- where \meta{action} ::= \name{do | product | sum | collect | join}
- \end{Syntax}
- \begin{Examples}
- foreach x in {q,r,s} sum x**2; & Q^{2} + R^{2} + S^{2}
- \end{Examples}
- \end{Command}
- \begin{Operator}{GEQ}
- The \name{geq} operator is a binary infix or prefix logical operator. It
- returns true if its first argument is greater than or equal to its second
- argument. As an infix operator it is identical with \name{>=}.
- \begin{Syntax}
- \name{geq}\(\meta{expression},\meta{expression}\) or \meta{expression}
- \name{geq} \meta{expression}
- \end{Syntax}
- \meta{expression} can be any valid REDUCE expression that evaluates to a
- number.
- \begin{Examples}
- a := 20; & A := 20 \\
- if geq(a,25) then write "big" else write "small";
- & small \\
- if a geq 20 then write "big" else write "small";
- & big \\
- if (a geq 18) then write "big" else write "small";
- & big
- \end{Examples}
- \begin{Comments}
- Logical operators can only be used in conditional statements such as \\
- \nameref{if}\ldots\name{then}\ldots\name{else} or
- \nameref{repeat}\ldots\name{until}.
- \end{Comments}
- \end{Operator}
- \begin{Command}{GOTO}
- Inside a \name{begin}\ldots\name{end} \nameref{block}, \name{goto}, or
- preferably, \name{go to}, transfers flow of control to a labeled statement.
- \begin{Syntax}
- \name{go to} \meta{labeled_statement} or \name{goto} \meta{labeled_statement}
- \end{Syntax}
- \meta{labeled_statement} is of the form \meta{label} \name{:}\meta{statement}
- \begin{Examples}
- \begin{multilineinput}
- procedure dumb(a);
- begin scalar q;
- go to lab;
- q := df(a**2 - sin(a),a);
- write q;
- lab: return a
- end;
- \end{multilineinput} & DUMB \\
- dumb(17); & 17
- \end{Examples}
- \begin{Comments}
- \name{go to} can only be used inside a \name{begin}\ldots\name{end}
- \nameref{block}, and inside
- the block only statements at the top level can be labeled, not ones inside
- \name{<<}\ldots\name{>>}, \nameref{while}\ldots\name{do}, etc.
- \end{Comments}
- \end{Command}
- \begin{Operator}{GREATERP}
- The \name{greaterp} logical operator returns true if its first argument is
- strictly greater than its second argument. As an infix operator it is
- identical with \name{>}.
- \begin{Syntax}
- \name{greaterp}\(\meta{expression},\meta{expression}\) or \meta{expression}
- \name{greaterp} \meta{expression}
- \end{Syntax}
- \meta{expression} can be any valid REDUCE expression that evaluates to a
- number.
- \begin{Examples}
- a := 20; & A := 20 \\
- if greaterp(a,25) then write "big" else write "small";
- & small \\
- if a greaterp 20 then write "big" else write "small";
- & small \\
- if (a greaterp 18) then write "big" else write "small";
- & big
- \end{Examples}
- \begin{Comments}
- Logical operators can only be used in conditional statements such as \\
- \nameref{if}\ldots\name{then}\ldots\name{else}
- or \nameref{repeat}\ldots\nameref{while}.
- \end{Comments}
- \end{Operator}
- \begin{Command}{IF}
- The \name{if} command is a conditional statement that executes a statement
- if a condition is true, and optionally another statement if it is not.
- \begin{Syntax}
- \name{if} \meta{condition} \name{then} \meta{statement}
- \ \&option\(\name{else}\ \meta{statement}\)
- \end{Syntax}
- \meta{condition} must be a logical or comparison operator that evaluates to
- a \nameref{boolean value}.
- \meta{statement} must be a single REDUCE statement or a
- \nameref{group} (\name{<<}\ldots\name{>>}) or
- \nameref{block} (\name{begin}\ldots\name{end}) statement.
- \begin{Examples}
- if x = 5 then a := b+c else a := d+f;
- & D + F \\
- x := 9; & X := 9 \\
- if numberp x and x<20 then y := sqrt(x) else write "illegal";
- & 3 \\
- clear x; \\
- if numberp x and x<20 then y := sqrt(x) else write "illegal";
- & illegal \\
- x := 12; & X := 12 \\
- a := if x < 5 then 100 else 150;
- & A := 150 \\
- b := u**(if x < 10 then 2);
- & B := 1 \\
- bb := u**(if x > 10 then 2);
- & BB := U^{2}
- \end{Examples}
- \begin{Comments}
- An \name{if} statement may be used inside an assignment statement and sets
- its value depending on the conditions, or used anywhere else an
- expression would be valid, as shown in the last example. If there is no
- \nameindex{else} clause, the value is 0 if a number is expected, and nothing
- otherwise.
- The \name{else} clause may be left out if no action is to be taken if the
- condition is false.
- The condition may be a compound conditional statement using \nameref{and} or
- \nameref{or}. If a non-conditional statement, such as a constant, is used by
- accident, it is assumed to have value {\em true}.
-
- Be sure to use \nameref{group} or \nameref{block} statements after
- \nameindex{then} or \name{else}.
- The \name{if} operator is right associative. The following constructions are
- examples:
- \begin{itemize}
- \item[(1)]
- \begin{Syntax}
- \name{if} \meta{condition} \name{then} \name{if} \meta{condition} \name{then}
- \meta{action} \name{else} \meta{action}
- \end{Syntax}
- %\end{itemize}
- which is equivalent to
- \begin{Syntax}
- \name{if} \meta{condition} \name{then} \(\name{if}\ \meta{condition}
- \ \name{then}\ \meta{action}\ \name{else}\ \meta{action}\);
- \end{Syntax}
- %\begin{itemize}
- \item[(2)]
- \begin{Syntax}
- \name{if} \meta{condition} \name{then} \meta{action} \name{else if}
- \meta{condition} \name{then} \meta{action} \name{else} \meta{action}
- \end{Syntax}
- which is equivalent to
- \begin{Syntax}
- \name{if}\ \meta{condition} \name{then} \meta{action} \name{else} \\
- \(\name{if}\ \meta{condition}\ \name{then}\ \meta{action}
- \ \name{else}\ \meta{action}\).
- \end{Syntax}
- \end{itemize}
- \end{Comments}
- \end{Command}
- \begin{Operator}{LIST}
- \index{list}
- The \name{list} operator constructs a list from its arguments.
- \begin{Syntax}
- \name{list}\(\meta{item} \{,\meta{item}\}\optional\) or
- \name{list}\(\) to construct an empty list.
- \end{Syntax}
- \meta{item} can be any REDUCE scalar expression, including another list.
- Left and right curly brackets can also be used instead of the operator
- \name{list} to construct a list.
- \begin{Examples}
- liss := list(c,b,c,\{xx,yy\},3x**2+7x+3,df(sin(2*x),x));
- & LISS := \{C,B,C,\{XX,YY\},3*X^{2} + 7*X + 3,2*COS(2*X)\} \\
- length liss; & 6 \\
- liss := \{c,b,c,\{xx,yy\},3x**2+7x+3,df(sin(2*x),x)\};
- & LISS := \{C,B,C,\{XX,YY\},3*X^{2} + 7*X + 3,2*COS(2*X)\} \\
- emptylis := list(); & EMPTYLIS := \{\} \\
- a . emptylis; & \{A\}
- \end{Examples}
- \begin{Comments}
- Lists are ordered, hierarchical structures. The elements stay where you
- put them, and only change position in the list if you specifically change
- them. Lists can have nested sublists to any (reasonable) level. The
- \nameref{part} operator can be used to access elements anywhere within a list
- hierarchy. The \nameref{length} operator counts the
- number of top-level elements
- of its list argument; elements that are themselves lists still only
- count as one element.
- \end{Comments}
- \end{Operator}
- \begin{Operator}{OR}
- The \name{or} binary logical operator returns {\it true} if either one or
- both of its arguments is {\it true}.
- \begin{Syntax}
- \meta{logical expression} \name{or} \meta{logical expression}
- \end{Syntax}
- \meta{logical expression} must evaluate to {\it true} or {\it nil}.
- \begin{Examples}
- a := 10; & A := 10 \\
- \begin{multilineinput}
- if a<0 or a>140 then write "not a valid human age" else
- write "age = ",a;
- \end{multilineinput} \\
- & age = 10 \\
- a := 200; & A := 200 \\
- if a < 0 or a > 140 then write "not a valid human age";
- & not a valid human age
- \end{Examples}
- \begin{Comments}
- The \name{or} operator is left associative: \name{x or y or z} is equivalent to
- \name{(x or y)} \name{or z}.
- Logical operators can only be used in conditional expressions, such as \\
- \nameref{if}\ldots\name{then}\ldots\name{else}
- and \nameref{while}\ldots\name{do}.
- \name{or} evaluates its arguments in order and quits, returning {\it true},
- on finding the first {\it true} statement.
- \end{Comments}
- \end{Operator}
- \begin{Command}{PROCEDURE}
- The \name{procedure} command allows you to define a mathematical operation as a
- function with arguments.
- \begin{Syntax}
- \&\meta{option} \name{procedure} \meta{identifier}
- \(\meta{arg}\{,\meta{arg}\}\repeated\)\name{;}\meta{body}
- \end{Syntax}
- The \meta{option} may be \nameref{algebraic} or \nameref{symbolic},
- indicating the
- mode under which the procedure is executed, or \nameref{real} or
- \nameref{integer}, indicating the type of answer expected. The default is
- algebraic. Real or integer procedures are subtypes of algebraic
- procedures; type-checking is done on the results of integer procedures, but
- not on real procedures (in the current REDUCE release). \meta{identifier}
- may be any valid REDUCE identifier that is not already a procedure name,
- operator, \nameref{array} or \nameref{matrix}.
- \meta{arg} is a formal parameter that may be any
- valid REDUCE identifier. \meta{body} is a single statement (a \nameref{group}
- or \nameref{block} statement may be used) with the desired activities in it.
- \begin{Examples}
- \begin{multilineinput}
- procedure fac(n);
- if not (fixp(n) and n>=0)
- then rederr "Choose nonneg. integer only"
- else for i := 0:n-1 product i+1;
- \end{multilineinput}
- & FAC \\
- fac(0); & 1 \\
- fac(5); & 120 \\
- fac(-5); & ***** choose nonneg. integer only
- \end{Examples}
- \begin{Comments}
- Procedures are automatically declared as operators upon definition. When
- REDUCE has parsed the procedure definition and successfully converted it to
- a form for its own use, it prints the name of the procedure. Procedure
- definitions cannot be nested. Procedures can call other procedures, or can
- recursively call themselves. Procedure identifiers can be cleared as you
- would clear an operator. Unlike \nameref{let} statements, new definitions
- under the same procedure name replace the previous definitions completely.
- Be careful not to use the name of a system operator for your own procedure.
- REDUCE may or may not give you a warning message. If you redefine a system
- operator in your own procedure, the original function of the system operator
- is lost for the remainder of the REDUCE session.
- Procedures may have none, one, or more than one parameter. A REDUCE
- parameter is a formal parameter only; the use of {\it x} as a parameter in
- a \name{procedure} definition has no connection with a value of {\it x} in
- the REDUCE session, and the results of calling a procedure have no effect
- on the value of {\it x}. If a procedure is {\it called} with {\it x} as a
- parameter, the current value of {\it x} is used as specified in the
- computation, but is not changed outside the procedure.
- Making an assignment statement by \name{:=} with a
- formal parameter on the left-hand side only changes the value of the
- calling parameter within the procedure.
- Using a \nameref{let} statement inside a procedure always changes the value
- globally: a \name{let} with a formal parameter makes the change to the calling
- parameter. \name{let} statements cannot be made on local variables inside
- \nameref{begin}\ldots\name{end} \nameref{block}\name{s}.
- When \nameref{clear} statements are used on formal
- parameters, the calling variables associated with them are cleared globally too.
- The use of \name{let} or \name{clear} statements inside procedures
- should be done with extreme caution.
- Arrays and operators may be used as parameters to procedures. The body of the
- procedure can contain statements that appropriately manipulate these
- arguments. Changes are made to values of the calling arrays or operators.
- Simple expressions can also be used as arguments, in the place of scalar
- variables. Matrices may {\it not} be used as arguments to procedures.
- A procedure that has no parameters is called by the procedure name,
- immediately followed by empty parentheses. The empty parentheses may be left
- out when writing a procedure with no parameters, but must appear in a call of
- the procedure. If this is a nuisance to you, use a \nameref{let} statement on
- the name of the procedure (i.e., \name{let noargs = noargs()}) after which
- you can call the procedure by just its name.
- Procedures that have a single argument can leave out the parentheses around
- it both in the definition and procedure call. (You can use the parentheses if
- you wish.) Procedures with more than one argument must use parentheses, with
- the arguments separated by commas.
- Procedures often have a \name{begin}\ldots\name{end} block in them. Inside the
- block, local variables are declared using \name{scalar}, \name{real} or
- \name{integer} declarations.
- The declarations must be made immediately after the word
- \name{begin}, and if more than one type of declaration is made, they are
- separated by semicolons. REDUCE currently does no type checking on local
- variables; \name{real} and \name{integer} are treated just like \name{scalar}.
- Actions take place as specified in the statements inside the block statement.
- Any identifiers that are not formal parameters or local variables are treated
- as global variables, and activities involving these identifiers are global in
- effect.
- If a return value is desired from a procedure call, a specific
- \nameref{return} command must be the last statement executed before exiting
- from the procedure. If no \name{return} is used, a procedure returns a
- zero or no value.
- Procedures are often written in a file using an editor, then the file
- is input using the command \nameref{in}. This method allows easy changes in
- development, and also allows you to load the named procedures whenever
- you like, by loading the files that contain them.
- \end{Comments}
- \end{Command}
- \begin{Command}{REPEAT}
- \index{loop}
- The \nameref{repeat} command causes repeated execution of a statement
- \nameindex{until}
- the given condition is found to be true. The statement is always executed
- at least once.
- \begin{Syntax}
- \name{repeat} \meta{statement} \name{until} \meta{condition}
- \end{Syntax}
- \meta{statement} can be a single statement, \nameref{group} statement, or
- a \name{begin}\ldots\name{end} \nameref{block}. \meta{condition} must be
- a logical operator that evaluates to {\it true} or {\it nil}.
- \begin{Examples}
- <<m := 4; repeat <<write 100*x*m;m := m-1>> until m = 0>>;
- & \begin{multilineoutput}{6cm}
- 400*X
- 300*X
- 200*X
- 100*X
- \end{multilineoutput}\\
- <<m := -1; repeat <<write m; m := m-1>> until m <= 0>>;
- & -1
- \end{Examples}
- \begin{Comments}
- \name{repeat} must always be followed by an \name{until} with a condition.
- Be careful not to generate an infinite loop with a condition that is never
- true. In the second example, if the condition had been \name{m = 0}, it
- would never have been true since \name{m} already had value -2 when the
- condition was first evaluated.
- \end{Comments}
- \end{Command}
- \begin{Operator}{REST}
- \index{list}\index{decomposition}
- The \name{rest} operator returns a \nameref{list} containing all but the first
- element of the list it is given.
- \begin{Syntax}
- \name{rest}\(\meta{list}\) or \name{rest} \meta{list}
- \end{Syntax}
- \meta{list} must be a non-empty list, but need not have more than one element.
- \begin{Examples}
- alist := {a,b,c,d}; & ALIST := \{A,B,C,D\}; \\
- rest alist; & \{B,C,D\} \\
- blist := {x,y,{aa,bb,cc},z}; & BLIST := \{X,Y,\{AA,BB,CC\},Z\} \\
- second rest blist; & \{AA,BB,CC\} \\
- clist := {c}; & CLIST := C \\
- rest clist; & \{\}
- \end{Examples}
- \end{Operator}
- \begin{Command}{RETURN}
- The \name{return} command causes a value to be returned from inside a
- \name{begin}\ldots\name{end} \nameref{block}.
- \begin{TEX}
- \begin{Syntax}
- \name{begin} \meta{statements} \name{return} \meta{\&option(expression)}
- \name{end}
- \end{Syntax}
- \end{TEX}
- \begin{INFO}
- {\begin{Syntax}
- \name{begin} \meta{statements} \name{return} \meta{(expression)}
- \name{end}
- \end{Syntax}
- }\end{INFO}
- \meta{statements} can be any valid REDUCE statements. The value of
- \meta{expression} is returned.
- \begin{Examples}
- begin write "yes"; return a end; &
- \begin{multilineoutput}{5cm}
- yes
- A
- \end{multilineoutput}\\
- \begin{multilineinput}
- procedure dumb(a);
- begin if numberp(a) then return a else return 10 end;
- \end{multilineinput}
- & DUMB \\
- dumb(x); & 10 \\
- dumb(-5); & -5 \\
- \begin{multilineinput}
- procedure dumb2(a);
- begin c := a**2 + 2*a + 1; d := 17; c*d; return end;
- \end{multilineinput} & DUMB2 \\
- dumb2(4); \\
- c; & 25 \\
- d; & 17
- \end{Examples}
- \begin{Comments}
- Note in \name{dumb2} above that the assignments were made as requested, but
- the product \name{c*d} cannot be accessed. Changing the procedure to read
- \name{return c*d} would remedy this problem.
- The \name{return} statement is always the last statement executed before
- leaving the block. If \name{return} has no argument, the block is exited but
- no value is returned. A block statement does not need a \name{return} ;
- the statements inside terminate in their normal fashion without one.
- In that case no value is returned, although the specified actions inside the
- block take place.
- The \name{return} command can be used inside \name{<<}\ldots\name{>>}
- \nameref{group} statements and
- \nameref{if}\ldots\name{then}\ldots\name{else} commands that
- are inside \name{begin}\ldots\name{end} \nameref{block}s.
- It is not valid in these constructions that are not inside
- a \name{begin}\ldots\name{end}
- block. It is not valid inside \nameref{for},
- \nameref{repeat}\ldots\name{until} or \nameref{while}\ldots\name{do}
- loops in any construction. To force early termination from loops, the
- \name{go to}(\nameref{goto}) command must be used.
- When you use nested block statements, a
- \name{return} from an inner block exits returning a value to the next-outermost
- block, rather than all the way to the outside.
- \end{Comments}
- \end{Command}
- \begin{Operator}{REVERSE}
- \index{list}
- The \name{reverse} operator returns a \nameref{list} that is the reverse of the
- list it is given.
- \begin{Syntax}
- \name{reverse}\(\meta{list}\) or \name{reverse} \meta{list}
- \end{Syntax}
- \meta{list} must be a \nameref{list}.
- \begin{Examples}
- aa := \{c,b,a,\{x**2,z**3\},y\}; & AA := \{C,B,A,\{X^{2},Z^{3}\},Y\} \\
- reverse aa; & \{Y,\{X^{2},Z^{3}\},A,B,C\} \\
- reverse(q . reverse aa); & \{C,B,A,\{X^{2},Z^{3}\},Y,Q\}
- \end{Examples}
- \begin{Comments}
- \name{reverse} and \nameref{cons} can be used together to add a new element to
- the end of a list (\name{.} adds its new element to the beginning). The
- \name{reverse} operator uses a noticeable amount of system resources,
- especially if the list is long. If you are doing much heavy-duty list
- manipulation, you should probably design your algorithms to avoid much
- reversing of lists. A moderate amount of list reversing is no problem.
- \end{Comments}
- \end{Operator}
- \begin{Type}{RULE}
- \index{rule}\index{rule list}
- A \name{rule} is an instruction to replace an algebraic expression
- or a part of an expression by another one.
- \begin{Syntax}
- \meta{lhs} => \meta{rhs} or
- \meta{lhs} => \meta{rhs} \name{when} \meta{cond}
- \end{Syntax}
- \meta{lhs} is an algebraic expression used as search pattern and
- \meta{rhs} is an algebraic expression which replaces matches of
- \meta{rhs}. \name{=>} is the operator \nameref{replace}.
- \meta{lhs} can contain \nameref{free variable}s which are
- symbols preceded by a tilde \nameindex{~} in their leftmost position
- in \meta{lhs}.
- A double tilde marks an \nameref{optional free variable}.
- If a rule has a \name{when} \meta{cond}
- part it will fire only if the evaluation of \meta{cond} has a
- result \nameref{true}. \meta{cond} may contain references to
- free variables of \meta{lhs}.
- Rules can be collected in a \nameref{list} which then forms a
- \nameindex{rule list}. \name{Rule lists} can be used to collect
- algebraic knowledge for a specific evaluation context.
- \name{Rules} and \name{rule lists} are globally activated and
- deactivated by \nameref{let}, \nameref{forall}, \nameref{clearrules}.
- For a single evaluation they can be locally activate by \nameref{where}.
- The active rules for an operator can be visualized by \nameref{showrules}.
- \begin{Examples}
- operator f,g,h; \\
- let f(x) => x^2; \\
- f(x); & x^{2}\\
- g_rules:=\{g(~n,~x)=>h(n/2,x) when evenp n,\\
- g(~n,~x)=>h((1-n)/2,x) when not evenp n\}$\\
- let g_rules;\\
- g(3,x); & h(-1,x)
- \end{Examples}
- \end{Type}
- \begin{Type}{Free Variable}
- \index{variable}
- A variable preceded by a tilde is considered as \name{free variable}
- and stands for an arbitrary part in an algebraic form during
- pattern matching. Free variables occur in the left-hand sides
- of \nameref{rule}s, in the side relations for \nameref{compact}
- and in the first arguments of \nameref{map} and \nameref{select}
- calls. See \nameref{rule} for examples.
- In rules also \nameref{optional free variable}s may occur.
- \end{Type}
- \begin{Type}{Optional Free Variable}
- \index{variable}
- A variable preceded by a double tilde is considered as
- \name{optional free variable}
- and stands for an arbitrary part part in an algebraic form during
- pattern matching. In contrast to ordinary \nameref{free variable}s
- an operator pattern with an \name{optional free variable}
- matches also if the operand for the variable is missing. In such
- a case the variable is bound to a neutral value.
- Optional free variables can be used as
- term in a sum: set to 0 if missing,
- factor in a product: set to 1 if missing,
- exponent: set to 1 if missing
- \begin{Examples}
- sin(~~u + ~~n * pi) => sin(u) when evenp u;
- \end{Examples}
- Optional free variables are allowed only in the left-hand sides
- of \nameref{rule}s.
- \end{Type}
- \begin{Operator}{SECOND}
- \index{list}\index{decomposition}
- The \name{second} operator returns the second element of a list.
- \begin{Syntax}
- \name{second}\(\meta{list}\) or \name{second} \meta{list}
- \end{Syntax}
- \meta{list} must be a list with at least two elements, to avoid an error
- message.
- \begin{Examples}
- alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\
- second alist; & B \\
- blist := \{x,\{aa,bb,cc\},z\}; & BLIST := \{X,\{AA,BB,CC\},Z\} \\
- second second blist; & BB
- \end{Examples}
- \end{Operator}
- \begin{Operator}{SET}
- \index{assign}
- The \name{set} operator is used for assignments when you want both sides of
- the assignment statement to be evaluated.
- %%% INCONSISTENT??? hyphen after restricted
- \begin{Syntax}
- \name{set}\(\meta{restricted\_expression},\meta{expression}\)
- \end{Syntax}
- \meta{expression} can be any REDUCE expression; \meta{restricted\_expression}
- must be an identifier or an expression that evaluates to an identifier.
- \begin{Examples}
- a := y; & A := Y \\
- set(a,sin(x^2)); & SIN(X^{2}) \\
- a; & SIN(X^{2}) \\
- y; & SIN(X^{2}) \\
- a := b + c; & A := B + C \\
- set(a-c,z); & Z \\
- b; & Z
- \end{Examples}
- \begin{Comments}
- Using an \nameref{array} or \nameref{matrix} reference as the first
- argument to \name{set} has
- the result of setting the {\it contents} of the designated element to
- \name{set}'s second argument. You should be careful to avoid unwanted
- side effects when you use this facility.
- \end{Comments}
- \end{Operator}
- \begin{Operator}{SETQ}
- \index{assign}
- The \name{setq} operator is an infix or prefix binary assignment operator.
- It is identical to \name{:=}.
- \begin{Syntax}
- \name{setq}\(\meta{restricted\_expression},\meta{expression}\) or \\
- \meta{restricted\_expression} \name{setq} \meta{expression}
- \end{Syntax}
- \meta{restricted expression} is ordinarily a single identifier, though
- simple expressions may be used (see Comments below). \meta{expression} can
- be any valid REDUCE expression. If \meta{expression} is a \nameref{matrix}
- identifier, then \meta{restricted\_expression} can be a matrix identifier
- (redimensioned if necessary), which has each element set to the
- corresponding elements of the identifier on the right-hand side.
- \begin{Examples}
- setq(b,6); & B := 6 \\
- c setq sin(x); & C := SIN(X) \\
- w + setq(c,x+3) + z; & W + X + Z + 3 \\
- c; & X + 3 \\
- setq(a1 + a2,25); & A1 + A2 := 25 \\
- a1; & - (A2 - 25)
- \end{Examples}
- \begin{Comments}
- Embedding a \name{setq} statement in an expression has the side effect of making
- the assignment, as shown in the third example above.
- Assignments are generally done for identifiers, but may be done for simple
- expressions as well, subject to the following remarks:
- \begin{itemize}
- \item[(i)]
- If the left-hand side is an identifier, an operator, or a power, the rule
- is added to the rule table.
- \item[(ii)]
- If the operators \name{- + /} appear on the left-hand side, all but the first
- term of the expression is moved to the right-hand side.
- \item[(iii)]
- If the operator \name{*} appears on the left-hand side, any constant terms are
- moved to the right-hand side, but the symbolic factors remain.
- \end{itemize}
- Be careful not to make a recursive \name{setq} assignment that is not
- controlled inside a loop statement. The process of resubstitution
- continues until you get a stack overflow message. \name{setq} can be used
- to attach functionality to operators, as the \name{:=} does.
- \end{Comments}
- \end{Operator}
- \begin{Operator}{THIRD}
- \index{list}\index{decomposition}
- The \name{third} operator returns the third item of a \nameref{list}.
- \begin{Syntax}
- \name{third}\(\meta{list}\) or \name{third} \meta{list}
- \end{Syntax}
- \meta{list} must be a list containing at least three items to avoid an error
- message.
- \begin{Examples}
- alist := \{a,b,c,d\}; & ALIST := \{A,B,C,D\} \\
- third alist; & C \\
- blist := \{x,\{aa,bb,cc\},y,z\}; & BLIST := \{X,\{AA,BB,CC\},Y,Z\}; \\
- third second blist; & CC \\
- third blist; & Y
- \end{Examples}
- \end{Operator}
- \begin{Operator}{WHEN}
- \index{rule}
- The \name{when} operator is used inside a \name{rule} to make the
- execution of the rule depend on a boolean condition which is
- evaluated at execution time. For the use see \nameref{rule}.
- \end{Operator}
|