El programa expuesto en el capítulo sobre los procedimientos recusivos, ha sido elaborado utilizando sólo las funciones primitivas conocidas entonces de AutoLISP. Una manera más eficaz de encarar su análisis sería la de tener en cuenta si algunos de los procesos que se llevan a cabo dentro del mismo pudieran programarse independientemente, como funciones utilitarias. Una función utilitaria es un nuevo operador que añadimos al lenguaje de programación para resolver situaciones que pueden presentarse con cierta frecuencia dentro de nuestros programas. En el caso que estamos analizando, podemos concebir la necesidad de una nueva función que recorra una lista y de acuerdo con el resultado de una función que se le pase como predicado elimine unos términos y conserve otros. Como resultado tendríamos una lista que sólo incluyera los términos deseados, en este caso las listas de asociación identificadas con los códigos 10. Estas funciones que pudiéramos llamar QUITAR-SI y su complementaria QUITAR-SI-NO han estado siempre entre las primeras que los programadores LISP han añadido a su repertorio de utilidades. Una definición de las mismas pudiera ser:
Tanto es así que se han incorporado como operadores a la norma de Common LISP bajo los nombres de REMOVE-IF (QUITAR-SI) y de REMOVE-IF-NOT (QUITAR-SI-NO). Visual LISP les incorpora el prefijo VL- para distinguirlos de las funciones del antiguo AutoLISP, y así las encontraremos en el catálogo de funciones Visual LISP como VL-REMOVE-IF y VL-REMOVE-IF-NOT. Utilizando VL-REMOVE-IF-NOT y con la ayuda de la función de mapeado sobre listas MAPCAR, estudiada en el apartado anterior, nuestra función VertPoly pudiera escribirse de la siguiente manera:
Obsérvese el uso de la función Esta segunda formulación resulta más clara y más económica en cuanto a esfuerzo de programación. Por otra parte, supera las limitaciones de Visual LISP en cuanto a la recursión que pudiera provocar en caso de polilíneas con un gran número de vértices un error por desbordamiento de pila. Nota: esta función devuelve los resultados correctos para Visual LISP en AutoCAD 2000. Sin embargo hemos encontrado que falla si se ejecuta desde el IDE Visual LISP para la versión 14. El error se encuentra en los valores de la lista de asociación para el objeto LWPOLYLINE que se obtienen desde este entorno:
Obsérvese que las listas asociadas al código 10 contienen dos
números reales además del código de asociación:
Este comportamiento constituye un error que ya ha sido superado en la versión 2000.
|
Apuntes para un Curso... > Programación de Aplicaciones Gráficas > 2. Técnicas Fundamentales > 2.4. Funciones Recursivas e Iterativas > 2.5.3. Mapeado sobre Secuencias >