## Defining Procedures

So far we've just used the Listener as a calculator, to evaluate expressions. In this lesson we're going to make a huge leap forward and show you how to define your own procedures. Once you've defined a procedure, it has the same status as the built-in procedures, like **list** and **+**.

Let's define a procedure to return the average of two numbers.

In words, the procedure for finding the average of two numbers is:

- Add the first number to the second number.
- Divide the sum by 2.

### Defining a procedure: defun

To define a procedure you use the special operator **defun.** This is an abbreviation for *define function*, but Lisp procedures are not strictly functions in the mathematical sense.

We can write the **average** procedure as follows:

(defun average (1st-number 2nd-number)

(/ (+ 1st-number 2nd-number) 2))

The first argument to **defun** gives the name of the procedure, which we've chosen as **average**.

The second argument, **(1st-number 2nd-number)**, is a list of what are called the parameters. These are symbols representing the numbers we are going to refer to later in the procedure.

The rest of the definition, **(/ (+ 1st-number 2nd-number) 2)**, is called the body of the procedure. It tells Lisp how to calculate the value of the procedure, in this case sum the numbers and divide by 2.

The words you use for the parameters are arbitrary, as long as they match the words you use in the procedure definition. So you could equally well have written the **average** procedure as follows:

(defun average (a b)

(/ (+ a b) 2))

To define it we can type the definition at the Lisp prompt:

CL-USER > (defun average (1st-number 2nd-number) (/ (+ 1st-number 2nd-number) 2)) AVERAGE

Alternatively you could type the definition into the Lisp Editor and select **Compile Buffer** to evaluate it.

We can try it out with:

CL-USER 13 > (average 7 9)

8

or:

CL-USER 14 > (average (+ 2 3) (+ 4 5))

7

Remember that the arguments are evaluated before they are given to the procedure.

### Procedures without parameters

A procedure doesn't have to have any parameters. Here's a procedure **dice** that returns a random dice throw from 1 to 6:

(defun dice () (+ 1 (random 6)))

To call the procedure you simply write:

CL-USER 10 > (dice) 5

### Exercises

#### 1. Square a number

Define a procedure **square** that returns the square of a number. Check that:

(square 7)

gives 49.

#### 2. Find the nth triangular number

Define a procedure **triangular **that gives the nth triangular number defined as n(n+1)/2, and check that:

(triangular 10)

gives 55.

#### 3. Find the result of throwing two dice

Define a procedure **two-dice** that returns the total result of throwing two dice.

blog comments powered by Disqus