Cuando no hay manera de establecer al incio del proceso iterativo elnúmero de repeticiones que serán necesarias se deberáestablecer, al igual que en los procedimientos recursivos una condiciónde prueba que determine la conclusión del ciclo. Para ello disponemos dela función WHILE.
- WHILE
- Evalúa una expresión de prueba y, si ésta no da comoresultado nil, evalúa otras expresiones para volver de nuevo a la expresión de prueba
(while expr_prueba expr...)
- La función while continúa hasta que expr_prueba es nil . Entonces devuelve el valor más reciente de la últimaexpresión.
Ejemplos de Iteraciones con WHILE:
CONTEO DE ENTIDADES:
Un caso lo tendríamos en una función que tuviera comopropósito el contar las entidades que forman parte de un dibujo. Paraacceder de manera secuencial a las entidades que forman parte de un dibujotenemos la función ENTNEXT. Si establecemos un contador que seincremente por cada entidad del dibujo tendríamos, al llegar a laúltima entidad, el número total de entidades. La funciónconcluirá en el momento que la variable ent evalúe como NIL , es decir, cuando ENTNEXT ya no devuelva más ningunaentidad por haber alcanzado el final de la base da datos del dibujo.
;;;Función iterativa para conteo simple;;;de las entidades en un dibujo;;;Se establece la variable cont como contador ;;;y la variable ent para guardar el nombre de ;;;cada entidad leída(defun CuentaEntidades ( / cont ent) (setq cont 1 ent (entnext) ;la función entnext sin argumentos ;devuelve la primera entidad del dibujo ) ;_ fin de setq (while ent (setq cont (1+ cont) ent (entnext ent) ;devuelve la entidad que le sigue a ent ) ;_ fin de setq ) ;_ fin de while cont ;devuelve el valor final del contador) ;_ fin de defun
Más adelante utilizaremos este procedimiento para desarrollarfunciones más sofisticadas dirigidas a inventariar los objetoscontenidos en un dibujo.
PREDICADO PALINDROMOP OPTIMIZADO:
La versión anterior del predicado PALINDROMOP no resulta muyeficiente, pues comprueba de manera exhaustiva todos los caracteres de lacadena, cuando bastaría con detectar una primera desigualdad paradecidir que no se trata de un palíndromo. Una solución máseficaz debería interrumpir la evaluación en ese momento. Eso lopodemos lograr mediante un ciclo condicional usando WHILE con doscondiciones encerradas en un AND (que devolverá NIL encuanto una de ellas deje de ser cierta): que no se hubiera alcanzado elnúmero de repeticiones determinado por (/ (strlen cadena) 2), yque el valor de resultado sea T. En cuanto se encuentre una pareja decaracteres desigual resultado pasará a ser NIL, con lo cual sedetendrá el ciclo.
(defun palindromop (cadena / cont resultado) (setq cont 0 resultado t ) ;_ fin de setq (while (and (<= cont (/ (strlen cadena) 2)) resultado) (if (not (equal (substr cadena (1+ cont) 1) (substr cadena (- (strlen cadena) cont) 1) ) ;_ fin de equal ) ;_ fin de not (setq resultado nil) ) ;_ fin de if (setq cont (1+ cont)) ) ;_ fin de while resultado) ;_ fin de defun
No basta que un programa alcance los resultados deseados. Debe hacerlo demanera rápida y eficaz. Este es un principio que no debe olvidarse.
Inicio |Índice | Continuar... |