2.2.4.1. La Primitiva DEFUN

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

DEFUN permite definir una nueva función de usuario con elnombre sím (el nombre de la función se incluyeautomáticamente en un QUOTE). Detrás del nombre de lafunción aparece una lista de parámetros (posiblementevacía), con los argumentos a recibir, y que puede estar seguida por unabarra oblicua y los nombres de uno o más símbolos locales(variables locales) que serán definidas para uso exclusivo de estafunción. Esta barra oblicua debe ir separada del primer símbololocal y del último argumento, si existe, por un espacio comomínimo. Si no declara ningún argumento ni variable local, se debeincluir una lista vacía tras el nombre de la función. Losargumentos son tratados como una especie de variables locales en el sentido deque no estarán disponibles fuera de la función. Los nombres deargumentos deben ser únicos dentro de la misma función.
A continuación de la lista de parámetros se deberánincluir todas las expresiones que deberán ser evaluadas al llamar a lanueva función de usuario.
A diferencia de muchas funciones primitivas AutoLISP, las funciones definidaspor el usuario no pueden tener argumentos opcionales. Una llamada a unafunción de usuario debe suministrar valores para todos los argumentosdeclarados.
DEFUN no es una función normal, sino lo que se incluye entrelas llamadas formas especiales, en elsentido de que sus argumentos no son evaluados. Lo serán mástarde, al llamar a la nueva función, sustituyendo sus argumentos por losvalores que se desea procesar.
La siguiente expresión define una función llamada DOBLEque 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 llamarsedesde 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 enlenguajes tales como C o Pascal.

Pero, según puntualiza Graham, "algo muy diferente estásucediendo aquí. Las funciones Lisp son objetos por sí mismas. Loque realmente hace DEFUN es construir una función y guardarlabajo el nombre que aparece como primer argumento." Paul Graham, OnLisp, 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 unafunción compilada que contiene instrucciones en lenguaje demá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>