Una vez conocidos los tipos de datos pasaremos a estudiar cómo utilizarlos. LISP es un lenguaje de programación funcional, es decir que suministra funciones para la manipulación de los datos. Los programas LISP se estructuran como formas y funciones. Según Cortés y Sierra*,
Las formas se evalúan (en relación con determinado contexto) para producir valores y efectos colaterales. Las funciones se invocan aplicándolas a argumentos. (Guy L. Steele Jr., Common Lisp the Language, capítulo 5). En el entorno Visual LISP se identifican como FORMAS las funciones de usuario definidas dentro de un fichero fuente LSP. Al cargar un programa se recibe la confirmación de la carga exitosa del mismo mediante el siguiente mensaje: Las funciones son conocidas en matemáticas. Mediante ellas se
describe algún tipo de relación entre un grupo de valores. La
adición y la multiplicación son funciones simples. Una
función más compleja sería:
AutoCAD identifica sus funciones LISP primitivas como el tipo de dato SUBR, mientras que las formas definidas a partir de ellas pertenecen al tipo de dato USUBR o "sub-rutina de usuario" La función typedevuelve los tipos correspondientes. La llamada a una función toma la forma de una lista cuyo primer elemento es un átomo simbólico que representa a la función llamada. El resto de los elementos de esa lista pueden ser átomos y otras listas. Estas sublistas se consideran también llamadas a funciones y se evalúan para que su valor resultante pueda ser pasado como argumento a la función que las contiene. FUNCIONES PRIMITIVASDescribimos una serie de funciones como ‘primitivas’ en el sentido
de que están definidas en la norma del lenguaje, para distinguirlas de
las funciones creadas por el usuario a partir de aquéllas. En LISP se
llama a una función mediante la siguiente sintaxis: ARGUMENTOS FUNCIONALESDe lo expuesto más arriba se concluye que en LISP una función es además un objeto de datos que puede ser suministrado a otra función como argumento. Esta posibilidad contribuye a la facilidad con que LISP se puede adaptar a las necesidades de cualquier programa mediante la incorporación de nuevas funciones que en su comportamiento resultan idénticas a las primitivas. Un programa que admite funciones como datos debe también suministrar alguna manera de invocarlas. Esto se logra en Visual LISP mediante la función APPLY. APPLY
APPLY, como su nombre en inglés indica, aplica una función (que recibe como primer argumento) a una lista de argumentos. La función puede ser un objeto de código compilado, una expresión-lambda, o un símbolo. En este último caso se utiliza el valor funcional global de dicho símbolo, aunque éste no puede ser una forma especial.
Obsérvese el error provocado por utilizar la forma especial QUOTE. Otras muchas funciones LISP requieren argumentos funcionales. Entre las de uso más frecuente están las funciones de mapeado. MAPCAR, por ejemplo toma dos o más argumentos: una función y una o más listas (tantas como parámetros requiera la función) y aplica la función sucesivamente a los elementos de cada lista, devolviendo una lista con los resultados.
Otras muchas funciones admiten funciones como argumentos. Entre las más utilizadas tenemos VL-SORT y VL-REMOVE-IF. La primera es una función de ordenación de uso general. Requiere una lista y un predicado, y devuelve una lista ordenada pasando sus elementos dos a dos al predicado.
VL-REMOVE-IF acepta una función y una lista, y devuelve todos los elementos de la lista para los cuales la función devuelva NIL (falso).
El programar nuevas funciones utilitarias que aceptan argumentos funcionales es una parte importante del estilo de programación funcional que caracteriza a LISP. FUNCIONES ARITMÉTICAS BÁSICASLas funciones aritméticas que
tienen como argumento un número devuelven distintos valores dependiendo
de que el argumento proporcionado sea un número entero o real. Si todos
los argumentos son enteros, el valor devuelto será entero. Por el
contrario, si alguno o todos los argumentos son reales, el valor devuelto
será un número real. Por ejemplo: FUNCIONES BÁSICAS DE TRATAMIENTO DE CADENASPara el tratamiento de cadenas
tenemos funciones que permiten unificar cadenas diferentes, extraer subcadenas
de una cadena mayor, determinar cuántos caracteres hay en una cadena y
transformar los caracteres a mayúsculas o minúsculas. El
predicado FUNCIONES BÁSICAS DE ACCESO A LISTASUna lista es una manera de representar un conjunto de átomos y de otras listas. Una lista tiene la forma de un paréntesis de apertura "(" seguido de una serie de átomos o listas, seguido por otro paréntesis de cierre ")". De manera que cualquier cosa encerrada entre paréntesis será considerada una lista. Una lista pasada al evaluador LISP será tratada como una expresión simbólica (S-expresión), es decir, una llamada a función y se considerará el primer término de la lista como el nombre de la función. Para que una lista sea tratada como dato y no como una expresión simbólica debe estar contenida en la forma especial QUOTE. Las funciones básicas cuya comprensión es imprescindible para el acceso a la información contenida en listas se pueden reducir a cuatro: QUOTE, CAR, CDR, y NTH. FUNCIONES DE CONSTRUCCIÓN DE LISTASCon las funciones del epígrafe anterior podemos descomponer listas, accediendo a suscomponentes a distintos niveles de anidación. Existen otras funciones que podemos utilizar para componer nuevas listas a base de elementos individuales, ya sean átomos u otras listas. CONS, LIST y APPEND son funciones que construyen listas por distintos procedimientos y con resultados diversos, por lo que es necesario distinguirlas bien. * Cortés, Ulises y Sierra, Carlos. LISP. Editorial Marcombo, Barcelona-Máxico, 1987. pág. 44 ** ibid. pág. 43 |
Apuntes para un Curso... > Programación de Aplicaciones Gráficas > 2. Técnicas Fundamentales >