Evaluation
The Standard Evaluation Sequence | Preventing Evaluation |
Nonstandard Argument Evaluation | Global Control of Evaluation |
Overriding Nonstandard Argument Evaluation | Aborts |
The following is the sequence of steps that the Wolfram Language follows in evaluating an expression like h[e1,e2…]. Every time the expression changes, the Wolfram Language effectively starts the evaluation sequence over again.
- If the expression is a raw object (e.g., Integer, String, etc.), leave it unchanged.
- Evaluate the head h of the expression.
- Evaluate each element ei of the expression in turn. If h is a symbol with attributes HoldFirst, HoldRest, HoldAll, or HoldAllComplete, then skip evaluation of certain elements.
- Unless h has attributes SequenceHold or HoldAllComplete, flatten out all Sequence objects that appear among the ei.
- Unless h has attribute HoldAllComplete, strip the outermost of any Unevaluated wrappers that appear among the ei.
- If h has attribute Flat, then flatten out all nested expressions with head h.
- If h has attribute Listable, then thread through any ei that are lists.
- If h has attribute Orderless, then sort the ei into order.
- Unless h has attribute HoldAllComplete, use any applicable transformation rules associated with f that you have defined for objects of the form h[f[e1,…],…].
- Use any built‐in transformation rules associated with f for objects of the form h[f[e1,…],…].
- Use any applicable transformation rules that you have defined for h[f[e1,e2,…],…] or for h[…][…].
- Use any built‐in transformation rules for h[e1,e2,…] or for h[…][…].
There are a number of built‐in Wolfram Language 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 | |
Conditionals | |
Logical operations | |
Iteration functions | |
Tracing functions | |
Assignments | |
Pure functions | |
Scoping constructs | |
Holding functions |
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,imin,imax}] is evaluated as follows:
- The limits imin, imax are evaluated.
- The value of the iteration variable is made local, effectively using Block.
- imin and imax are used to determine the sequence of values to be assigned to the iteration variable i.
- The iteration variable is successively set to each value, and f is evaluated in each case.
- The local values assigned to i are cleared.
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
- If the left‐hand side is a symbol, no evaluation is performed.
- If the left‐hand side is a function without hold attributes, the arguments of the function are evaluated, but the function itself is not evaluated.
Any subexpression of the form HoldPattern[expr] that appears on the left‐hand side of an assignment is not evaluated. When the subexpression is used for pattern matching, it matches as though it were expr without the HoldPattern.
f[…,Evaluate[expr],…] |
By using Evaluate, you can get any argument of a function evaluated immediately, even if the argument would usually be evaluated later under the control of the function. An exception to this is when the function has the HoldAllComplete attribute; in this case, the contents of the function are not modified by the evaluator.
The Wolfram Language provides various functions which act as "wrappers" to prevent the expressions they contain from being evaluated.
Hold[expr] | treated as Hold[expr] in all cases |
HoldComplete[expr] | treated as HoldComplete[expr] with upvalues disabled |
HoldForm[expr] | treated as expr for printing |
HoldPattern[expr] | treated as expr in rules, definitions and patterns |
Unevaluated[expr] | treated as expr when arguments are passed to a function |
- Iteration: evaluate a particular expression until it no longer changes.
- Recursion: evaluate subsidiary expressions needed to find the value of a particular expression.
Iteration leads to evaluation chains in which successive expressions are obtained by the application of various transformation rules.
Trace shows evaluation chains as lists, and shows subsidiary evaluations corresponding to recursion in sublists.
The expressions associated with the sequence of subsidiary evaluations which lead to an expression currently being evaluated are given in the list returned by Stack[].
$RecursionLimit | maximum recursion depth |
$IterationLimit | maximum number of iterations |
You can ask the Wolfram Language to abort at any point in a computation, either by calling the function Abort[], or by typing appropriate interrupt keys.
When asked to abort, the Wolfram Language will terminate the computation as quickly as possible. If the answer obtained would be incorrect or incomplete, then the Wolfram Language returns $Aborted instead of giving that answer.