> IsItPrime := proc (x : real) > if (mod(x,2)=0) then # x is even > return(false); > else > for i from 3 to floor(sqrt(x)) by 2 do > if (mod(x, i)=0) then > return(false); > fi; > od; > fi; > true; > end;Here there are three possible exit points from this function. If

> IsItPrime(10039823478323782); # it's an even number false > IsItPrime(3478728737); # odd but divisible by some number false > IsItPrime(101); # it's a prime number true

The value of a function is not restricted to being of type ` real` or `boolean`. In general, functions may return any
data type (including other functions). We could extend our
(sophisticated) primality tester to return either `true` or `false` and
one of the prime factors if it exists.

> IsItPrime := proc (x : posint) > if (mod(x,2)=0) then # x is even > return([false, 2]); > else > for i from 3 to floor(sqrt(x)) by 2 do > if (mod(x, i)=0) then > return([false, i]); > fi; > od; > fi; > [true,1]; > end;At all three exit points, we return

The first alternative is to return them as an *expression
sequence* in which case we would re-write the `return`
statements from `IsItPrime` as follows

> return(false, 2); # instead of [false, 2] > return(false, i); # instead of [false, i] > true, 1; # instead of [true, 1]We advocate against this method as it is sometimes difficult to handle these

The second alternative is to return the values as a data structure. In Darwin, a data structure is any expression which is syntactically a procedure call but does not evaluate (or it is simply not defined). In this way, we have potentially infinitely many different data structures (we deal with this subject extensively in Chapter ).

> return(Primality( false, 2 )); # instead of [false, 2] > return(Primality( false, i )); # instead of [false, i] > return(Primality( true, 1 )); # instead of [true, 1]