   ### Conditionals.

#### (If) is probably the most important and widely use condition statement. Unlike other languages though, you can match only one (if) statement with a then statement. The syntax is as follows :

```(if xyz
(then do this)
(else do this)
)
```

Let's look at a simple example :

```(defun c:testif ()
(setq a (getreal "\nEnter a Number : ")
b (getreal "\nEnter Second Number : ")
);setq
(if (= a b)
(prompt "\nBoth Numbers are equal")
(prompt "\nBoth numbers are not equal")
);if
(princ)
);defun
(princ)
```

If you need to evaluate more than one then, or else statement, you must use the (progn) function. Here's another example :
```(defun c:testprogn ()
(setq a (getreal "\nEnter a Number : ")
b (getreal "\nEnter Second Number : ")
);setq
(if (= a b)
(progn
(prompt "\nBoth Numbers are equal")
(prompt "\nHere is Another statement")
(prompt "\nAnd Another One")
);progn
(prompt "\nBoth numbers are not equal")
);if
(princ)
);defun
(princ)
```

You can use as many statements as you like within the (progn) function.

You can also use (if) along with logical operators. They are functions that determine how two or more items are compared. The available logical operators are :
```AND     OR      NOT
```

AND returns true if all arguments are true.
OR returns true if any of the arguments are true.
NOT returns true if it's argument is false and returns false if it's argument is true. Let's look at some examples :

```(defun c:testand ()
(setq a (getreal "\nEnter a Number : "))
(if
(and
(>= a 5.0)
(<= a 10.0)
);and
(prompt "\nNumber is between 5 and 10")
(prompt "\nNumber is less than 5 or greater than 10")
);if
(princ)
);defun
(princ)
```

```(defun c:testor ()
(setq a (getstring "\nAre you Male? Y/N : "))
(if
(or
(= a "y")
(= a "Y")
);or
(prompt "\nHello Sir")
);if
(princ)
);defun
(princ)
```

A Relation Operator is a function that evaluates the relationship between two or more items. Relationship Operators available are :
```<	less than
>	greater than
<=	less than or equal to
>=	greater than or equal to
=	equal to
/=	not equal to
eq	are two expressions identical
equal	are two expressions equal
```

Let's look a bit closer at the (eq) and the (equal) functions.
The (eq) function determines whether two expressions are bound to the same object.

```(setq a '(x y z))
(setq b '(x y z))
(setq c b)

(eq a c) would return nil, a and c are not the same list.
(eq c b) would return true, b and c are exactly the same list.
```

The (equal) function determines whether two expressions evaluate to the same thing. You can use the optional numeric argument, fuzz, to specify the maximum amount by which both expressions can differ and still be considered equal.

```(setq a '(x y z))
(setq b '(x y z))
(setq c b)
(setq m 1.123456))
(setq n 1.123457))

(equal a c) would return true.
(equal c b) would return true.
(equal m n) would return nil.
(equal m n 0.000001) would return true.
```

What about a Multiple (if) function. The (cond) function works very much like (if), except (cond) can evaluate any number of test conditions.
Once (cond) finds the first condition that is true, it processes the statements associated with that condition. (It only processes the first true condition). Here's an example :
```(defun c:testcond ()
(setq a
(strcase (getstring "\nSize of Bolt (M10,M12,M16): ")
);strcase
);setq
(cond
((= a "M10") (prompt "\nYou have choosen M10"))
((= a "M12") (prompt "\nYou have choosen M12"))
((= a "M16") (prompt "\nYou have choosen M16"))
(T (prompt "\nUnknown Bolt Size"))
);cond
(princ)
);defun
(princ)
```

The (cond) function takes any number of lists as it's arguments.
Each argument must be a list containing a test followed by any number of expressions to be evaluated. Copyright © 1999-Perpetuity by AfraLisp All rights reserved. Information in this document is subject to change without notice. Site created and maintained by Kenny Ramage 