2.2.4.1. La Primitiva DEFUN

(defun sím lista-argumentos expresión ...)

DEFUN permite definir una nueva función de usuario con el nombre sím (el nombre de la función se incluye automáticamente en un QUOTE). Detrás del nombre de la función aparece una lista de parámetros (posiblemente vacía), con los argumentos a recibir, y que puede estar seguida por una barra oblicua y los nombres de uno o más símbolos locales (variables locales) que serán definidas para uso exclusivo de esta función. Esta barra oblicua debe ir separada del primer símbolo local y del último argumento, si existe, por un espacio como mínimo. Si no declara ningún argumento ni variable local, se debe incluir una lista vacía tras el nombre de la función. Los argumentos son tratados como una especie de variables locales en el sentido de que no estarán disponibles fuera de la función. Los nombres de argumentos deben ser únicos dentro de la misma función.
A continuación de la lista de parámetros se deberán incluir todas las expresiones que deberán ser evaluadas al llamar a la nueva función de usuario.
A diferencia de muchas funciones primitivas AutoLISP, las funciones definidas por el usuario no pueden tener argumentos opcionales. Una llamada a una función de usuario debe suministrar valores para todos los argumentos declarados.
DEFUN no es una función normal, sino lo que se incluye entre las llamadas formas especiales, en el sentido de que sus argumentos no son evaluados. Lo serán más tarde, al llamar a la nueva función, sustituyendo sus argumentos por los valores que se desea procesar.
La siguiente expresión define una función llamada DOBLE que devuelve el doble de su argumento (número real o entero).

_$ (defun doble (x)(* x 2))
DOBLE

Así hemos creado una nueva función Lisp que puede llamarse desde el nivel superior o anidada en otras funciones:

_$ (doble 1)
2

Un programa Lisp usualmente incluye una colección de tales defuns, asemejándose en ello a un fichero de definiciones de procedimientos en lenguajes tales como C o Pascal.

Pero, según puntualiza Graham, "algo muy diferente está sucediendo aquí. Las funciones Lisp son objetos por sí mismas. Lo que realmente hace DEFUN es construir una función y guardarla bajo el nombre que aparece como primer argumento." Paul Graham, On Lisp, pág. 10

Podemos acceder a la función asociada al símbolo DOBLE utilizando la función Visual LISP vl-symbol-value:

_$ (vl-symbol-value 'DOBLE)
#<USUBR @045677ac DOBLE>

En versiones anteriores de AutoLISP la función creada con defun era una lista:

Command: (defun doble (x) (* x 2))
DOBLE
Command: !doble
((X) (* X 2))
Command: (car doble)
(X)
Command: (cdr doble)
((* X 2))

En Visual LISP la función de usuario creada con defun es una función compilada que contiene instrucciones en lenguaje de máquina, por lo tanto en Autocad 2000 obtendremos:

Command: (defun doble (x) (* x 2))
DOBLE
Command: !doble
#<SUBR @01d5ba28 DOBLE>
Command: (car doble)
; error: bad argument type: consp #<SUBR @01d5ba28 DOBLE>
Command: (cdr doble)
; error: bad argument type: consp #<SUBR @01d5ba28 DOBLE>