Defining New Functions
Normally functions are defined using the **DEFUN**
macro. The basic skeleton of a **DEFUN**
looks like this:
(defun name (parameter*)
"Optional documentation string."
body-form*)
Any symbol can be used as a function name.2 Usually function names contain only alphabetic characters and hyphens, but other characters are allowed and are used in certain naming conventions. For instance, functions that convert one kind of value to another sometimes use ->
in the name. For example, a function to convert strings to widgets might be called string->widget
. The most important naming convention is the one mentioned in Chapter 2, which is that you construct compound names with hyphens rather than underscores or inner caps. Thus, frob-widget
is better Lisp style than either frob_widget
or frobWidget
.
A function’s parameter list defines the variables that will be used to hold the arguments passed to the function when it’s called.3 If the function takes no arguments, the list is empty, written as ()
. Different flavors of parameters handle required, optional, multiple, and keyword arguments. I’ll discuss the details in the next section.
If a string literal follows the parameter list, it’s a documentation string that should describe the purpose of the function. When the function is defined, the documentation string will be associated with the name of the function and can later be obtained using the **DOCUMENTATION**
function.4
Finally, the body of a **DEFUN**
consists of any number of Lisp expressions. They will be evaluated in order when the function is called and the value of the last expression is returned as the value of the function. Or the **RETURN-FROM**
special operator can be used to return immediately from anywhere in a function, as I’ll discuss in a moment.
In Chapter 2 we wrote a hello-world
function, which looked like this:
(defun hello-world () (format t "hello, world"))
You can now analyze the parts of this function. Its name is hello-world
, its parameter list is empty so it takes no arguments, it has no documentation string, and its body consists of one expression.
(format t "hello, world")
The following is a slightly more complex function:
(defun verbose-sum (x y)
"Sum any two numbers after printing a message."
(format t "Summing ~d and ~d.~%" x y)
(+ x y))
This function is named verbose-sum
, takes two arguments that will be bound to the parameters x
and y
, has a documentation string, and has a body consisting of two expressions. The value returned by the call to **+**
becomes the return value of verbose-sum
.