Sie sind auf Seite 1von 2

Funciones

Despus de las reglas de la sintaxis y la semntica, los tres componentes ms bsicos de todos los programas Lisp son funciones, variables y macros. Ha utilizado los tres, mientras que la construccin de la base de datos en el captulo 3, pero he pasado por alto muchos de los detalles de cmo funcionan y cmo usarlos mejor. Voy a dedicar los prximos captulos con estos tres temas, a partir de funciones, que - al igual que sus homlogos en otros idiomas - proporcionan el mecanismo bsico para abstraer, as, la funcionalidad. La mayor parte de Lisp en s consiste en funciones. Ms de tres cuartas partes de los nombres definidos en las funciones estndar de nombre de lenguaje. Todos los tipos integrados de datos se definen exclusivamente en trminos de lo que las funciones operan en ellos. Incluso sistema de objetos de gran alcance de Lisp se basa en una extensin conceptual de las funciones, las funciones genricas, que tratar en el captulo 16. Y, a pesar de la importancia de macros para El Camino de Lisp, al final toda la funcionalidad real es proporcionada por las funciones. Ejecutar macros en tiempo de compilacin, por lo que el cdigo que generan - el cdigo que realmente conforman el programa despus de todas las macros se expanden consistir en su totalidad de las llamadas a funciones y operadores especiales. Por no mencionar, las macros son tambin funciones, aunque las funciones que se utilizan para generar el cdigo en lugar de llevar a cabo las acciones del programa.1

Definicin de nuevas funciones


Normalmente las funciones se definen mediante la macro DEFUN. El esqueleto bsico de una DEFUN se parece a esto:
(defun name (parameter*) "Optional documentation string." body-form*)

Cualquier smbolo puede ser utilizado como una funcin name.2 Por lo general los nombres de funcin contener slo caracteres alfabticos y guiones, pero otros caracteres se les permite y se utilizan en determinadas convenciones de nombres. Por ejemplo, las funciones que convierten un tipo de valor a otro a veces utilizan -> en el nombre. Por ejemplo, una funcin para convertir las cadenas a los widgets que se podra llamar cadena-> widget . La convencin de nomenclatura ms importante es el mencionado en el captulo 2, que es que la construccin de nombres compuestos con guiones en lugar de guiones o los topes de interior. Por lo tanto, FROB-flash es mejor estilo Lisp que cualquiera frob_widget o frobWidget.

Lista de parmetros de una funcin define las variables que se utilizarn para sostener los argumentos pasados a la funcin cuando se llama.3 Si la funcin no tiene argumentos, la lista est vaca, escrito como (). Diferentes variantes de manejo parmetros necesarios, opcionales, mltiples, y los argumentos de palabras clave. Voy a discutir los detalles en la siguiente seccin. Si una cadena literal siguiente la lista de parmetros, es una cadena de documentacin que debe describir el propsito de la funcin. Cuando la funcin est definida, la cadena de documentacin se asociar con el nombre de la funcin y ms tarde se pueden obtener con la DOCUMENTACIN function.4 Por ltimo, el cuerpo de un DEFUN consiste en cualquier nmero de expresiones Lisp. Ellos sern evaluados en orden cuando la funcin se llama y el valor de la ltima expresin se devuelve como el valor de la funcin. O el operador especial RETURN-FROM se puede utilizar para volver de inmediato desde cualquier lugar de una funcin, como voy a discutir en un momento.
(defun hello-world () (format t "hello, world"))

Ahora puede analizar las partes de esta funcin. Su nombre es hola-mundo, su lista de parmetros est vaca por lo que no tiene argumentos, no tiene cadena de documentacin, y su cuerpo se compone de una expresin.
(format t "hello, world")

La siguiente es una funcin un poco ms complejo:


(defun verbose-sum (x y) "Sum any two numbers after printing a message." (format t "Summing ~d and ~d.~%" x y) (+ x y))

Esta funcin se denomina detallado de suma, tiene dos argumentos que se enlazar a los parmetros x e y, tiene una cadena de documentacin, y tiene un cuerpo formado por dos expresiones. El valor devuelto por la llamada a + se convierte en el valor de retorno de detallado de suma.