Previous: Advanced Syntax Patterns, Up: Syntax Tables [Contents][Index]

It is possible to attach a *condition* to a syntax rule. For
example, the rules

foo ( # ) := ifoo(#1) :: integer(#1) foo ( # ) := gfoo(#1)

will parse ‘`foo(3)`’ as ‘`ifoo(3)`’, but will parse
‘`foo(3.5)`’ and ‘`foo(x)`’ as calls to `gfoo`

. Any
number of conditions may be attached; all must be true for the
rule to succeed. A condition is “true” if it evaluates to a
nonzero number. See Logical Operations, for a list of Calc
functions like `integer`

that perform logical tests.

The exact sequence of events is as follows: When Calc tries a
rule, it first matches the pattern as usual. It then substitutes
‘`#1`’, ‘`#2`’, etc., in the conditions, if any. Next, the
conditions are simplified and evaluated in order from left to right,
using the algebraic simplifications (see Simplifying Formulas).
Each result is true if it is a nonzero number, or an expression
that can be proven to be nonzero (see Declarations). If the
results of all conditions are true, the expression (such as
‘`ifoo(#1)`’) has its ‘`#`’s substituted, and that is the
result of the parse. If the result of any condition is false, Calc
goes on to try the next rule in the syntax table.

Syntax rules also support `let`

conditions, which operate in
exactly the same way as they do in algebraic rewrite rules.
See Other Features of Rewrite Rules, for details. A `let`

condition is always true, but as a side effect it defines a
variable which can be used in later conditions, and also in the
expression after the ‘`:=`’ sign:

foo ( # ) := hifoo(x) :: let(x := #1 + 0.5) :: dnumint(x)

The `dnumint`

function tests if a value is numerically an
integer, i.e., either a true integer or an integer-valued float.
This rule will parse `foo`

with a half-integer argument,
like ‘`foo(3.5)`’, to a call like ‘`hifoo(4.)`’.

The lefthand side of a syntax rule `let`

must be a simple
variable, not the arbitrary pattern that is allowed in rewrite
rules.

The `matches`

function is also treated specially in syntax
rule conditions (again, in the same way as in rewrite rules).
See Matching Commands. If the matching pattern contains
meta-variables, then those meta-variables may be used in later
conditions and in the result expression. The arguments to
`matches`

are not evaluated in this situation.

sum ( # , # ) := sum(#1,a,b,c) :: matches(#2, a=[b..c])

This is another way to implement the Maple mode `sum`

notation.
In this approach, we allow ‘`#2`’ to equal the whole expression
‘`i=1..10`’. Then, we use `matches`

to break it apart into
its components. If the expression turns out not to match the pattern,
the syntax rule will fail. Note that `Z S` always uses Calc’s
Normal language mode for editing expressions in syntax rules, so we
must use regular Calc notation for the interval ‘`[b..c]`’ that
will correspond to the Maple mode interval ‘`1..10`’.

Previous: Advanced Syntax Patterns, Up: Syntax Tables [Contents][Index]