## A.4.2 Non-Standard Argument Evaluation

There are a number of built-in Mathematica functions that evaluate their arguments in special ways. The control structure While is an example. The symbol While has the attribute HoldAll. As a result, the arguments of While are not evaluated as part of the standard evaluation process. Instead, the internal code for While evaluates the arguments in a special way. In the case of While, the code evaluates the arguments repeatedly, so as to implement a loop.

 Control structures arguments evaluated in a sequence determined by control flow (e.g., CompoundExpression) Conditionals arguments evaluated only when they correspond to branches that are taken (e.g., If, Which) Logical operations arguments evaluated only when they are needed in determining the logical result (e.g., And, Or) Iteration functions first argument evaluated for each step in the iteration (e.g., Do, Sum, Plot) Tracing functions form never evaluated (e.g., Trace) Assignments first argument only partially evaluated (e.g., Set, AddTo) Pure functions function body not evaluated (e.g., Function) Scoping constructs variable specifications not evaluated (e.g., Module, Block) Holding functions argument maintained in unevaluated form (e.g., Hold, HoldPattern)

Built-in functions that evaluate their arguments in special ways.

### Logical Operations

In an expression of the form &&&& the are evaluated in order. As soon as any is found to be False, evaluation is stopped, and the result False is returned. This means that you can use the to represent different "branches" in a program, with a particular branch being evaluated only if certain conditions are met.

The Or function works much like And; it returns True as soon as it finds any argument that is True. Xor, on the other hand, always evaluates all its arguments.

### Iteration Functions

An iteration function such as Do[f, {i, , }] is evaluated as follows:

If there are several iteration variables, the same procedure is followed for each variable in turn, for every value of all the preceding variables.

Unless otherwise specified, f is not evaluated until a specific value has been assigned to i, and is then evaluated for each value of i chosen. You can use Evaluate[f] to make f be evaluated immediately, rather than only after a specific value has been assigned to i.

### Assignments

The left-hand sides of assignments are only partially evaluated.

The right-hand side is evaluated for immediate (=), but not for delayed (:=), assignments.

Any subexpression of the form HoldPattern[expr] that appears on the left-hand side of an assignment is not evaluated, but is replaced by the unevaluated form of expr before the assignment is done.

THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.