Está en la página 1de 6

AutoLISP Leccin 8 - LOOPING

(Abril de 1999)
Hay tres estilos bsicos de los bucles que se pueden utilizar, el primero es el bucle de
conteo, el segundo es el bucle de la evaluacin continua, y la tercera es el bucle sin fin.
El bucle de conteo pasa por el bucle de un cierto nmero predeterminado de veces. El
bucle de evaluar de forma continua, un bucle hasta que se cumple alguna condicin
momento en el que termina. El bucle sin fin se ejecuta siempre, que es el tipo que no
queremos escribir en nuestros programas Lisp.
AutoLISP nos da algunas de las funciones de bucle bsicos, que son muy tiles, y como
con todo lo dems en lisp si no nos gusta lo que nos dieron podemos escribir nuestra
propia.
Contenido
[hide]
1 funciones en Lazo
2 El bucle de repeticin
3 El bucle while
4 Control del bucle
5 Grabacin de un bucle
6 La recursividad
7 DO-MIENTRAS
8 PARA
9 Ms Lecciones
Looping funciones
repeticin (nmero de repeticiones exp ...)
Evala cada expresin de un determinado nmero de veces. El nmero de veces que el
ciclo funciona es tiempos "nmeros" para cada "exp". Nmero representa cualquier
nmero entero positivo.
mientras que (mientras testexp exp ...)
Evala la "exp" mientras que el "testexp" sigue siendo cierto. Mientras evala "testexp" y
si "testexp" Es cierto que evala todas las expresiones encerradas en el bucle. Se vuelve
a evaluar "testexp", si "testexp" sigue siendo cierto que pasa por el bucle de nuevo. Esto
contina hasta que "testexp" se evala como nula.
El bucle de repeticin
La funcin de repeticin evala una expresin o expresiones un nmero dado de veces.
Es un concepto bastante bsico y realmente no necesita un montn de explicaciones. Si
conoce el nmero de veces que desea que su bucle para ejecutar el bucle de repeticin
es el que usted desea utilizar.
(Repetir 5
(Hacer_esto))
Lo que limita el uso de la funcin de repeticin es que no hay muchas veces que usted
sabe cuntas veces vas a tener que ir a travs del lazo. Est atento a los tiempos ya se
saban de antemano, porque la repeticin sera la manera ms limpia que lidiar con eso.
El bucle while
Usted puede tener una o ms sentencias se repiten muchas veces en una fila mediante
la sentencia "while". Las declaraciones contenidas en el bucle "while" se ejecutar hasta
que el "testexp" se convierte en falsa.
(Mientras que (this_is_true)
(Hacer_esto))
El "testexp" puede contener relacional, as como lgica, los operadores. Este operador
debe devolver un valor verdadero o falso. Como se dijo antes un valor "false" en lisp es
equivalente a "nada". Si el "testexp" resulta ser falso cuando se entra en el bucle, el
cuerpo del bucle no se ejecuta nunca.
Porque "testexp" determina cundo finaliza el bucle, algo dentro del cuerpo del bucle
debe modificar la variable o variables utilizadas por "testexp". Si el cuerpo del bucle no
modifica la variable utilizada por el "testexp", la expresin de prueba siempre se mantiene
fiel, y el bucle no termina nunca. Esto es lo que se conoce como un bucle sin fin, y
realmente debera evitarlo.
Controlar el bucle
Al escribir bucles, hay varias cosas que debe hacer para mantener el control de sus
lazos. Muchas cosas pueden ir mal al escribir bucles. Inicializacin incorrecta o se omite
del bucle, la inicializacin incorrecta u omitido de las variables de control para el bucle,
olvidar para incrementar el contador de bucle o incrementar la variable de forma
incorrecta.
Hay dos cosas que usted puede hacer para mantenerse fuera de problemas al escribir
bucles. En primer lugar minimizar el nmero de factores que afectan el bucle. Debe ser
sencillo. En segundo lugar tratar el interior de la rutina, como si fuera una funcin,
mantener el mayor control posible fuera del cuerpo del bucle.
Sea muy claro acerca de cuando el cuerpo de la funcin se ejecutar. No hacer que el
lector tiene que mirar todo a travs del bucle para averiguar lo que hace que funcione. Un
bucle debe ser otro cuadro de negro, como una funcin, el programa circundante puede
conocer los controles para el bucle, pero no el contenido del bucle.
Al escribir un bucle poner el cdigo que inicializa el bucle directamente en frente del
bucle. Mantener el cdigo de inicializacin cerca del bucle en s hace que sea ms fcil
ver cmo funciona el bucle, y para hacer las modificaciones ms tarde. Si
correspondientes estados estn esparcidos a lo largo de su programa va a ser muy difcil
de averiguar ms tarde cmo funciona.
Cuando usted est escribiendo el terminador de su bucle, trate de visualizar todas las
condiciones que harn que el final del bucle. Ms all de cualquier otra cosa que
queramos nuestro bucle a fin. Piense a travs de los casos nominales las condiciones de
contorno, y cada caso excepcional que se pueda imaginar.
Grabacin de un bucle
Hay algunas cosas que usted puede hacer para hacer la escritura ms fcil bucles.
Comienza a escribir el bucle, caso por caso. Comience con el primer caso se quiere
evaluar y escribir el bucle para que, a continuacin, si es necesario escribir un bucle para
rodearlo. Si usted comienza con el bucle interior y su forma de trabajo a cabo, se puede
realizar un seguimiento de lo que sus lazos son hasta. La mejor manera de escribir
bucles es escribir los bucles en pseudo-cdigo. Pseudo-cdigo es una forma de escribir
lo que su cdigo debe hacer antes de escribir el cdigo. Si usted est haciendo las cosas
bien la pseudo-cdigo se ver como el cdigo terminado cuando el hecho, pero estar en
la llanura Ingls
, Mientras que esto es cierto
; Hacer esto
Ejemplo bastante simplista, pero creo que usted consigue el punto. Qu estaban
tratando de aqu es conseguir la sensacin de lo que va a hacer su programa. Cuando
escribimos el pseudo-cdigo, vamos a escribir utilizando los marcadores de comentarios
para AutoLISP, de esa manera cuando estamos escribiendo el cdigo podemos convertir
el pseudo-cdigo en los comentarios para el bucle. Si decidimos el bucle es lo
suficientemente claro despus de lo escribimos siempre podemos eliminar los
comentarios.
La recursividad
Otra forma de bucle es utilizar la recursividad. Una de las principales caractersticas de
AutoLISP son sus capacidades recursivas. Una funcin recursiva es aquella en la que los
que soluciona parte del problema y luego llama a s mismo para resolver varios de los
problemas, continuando hasta que se resuelva el problema. Cabe sealar que la
recursin utiliza una gran cantidad de memoria de pila y debe ser limitada en su uso.
En aquellos casos en que la recursividad es la mejor manera de hacer algo, hay algunas
cosas que usted debe tener en cuenta al escribir funciones recursivas. Asegrese de que
en algn momento la recursividad se detiene. Revise su funcin cuando su hacer para
asegurarse de que ha dejado un camino para salir del bucle recursivo. Lo que esto
significa es que usted debe tener una prueba como parte de la funcin de romper el bucle
cuando se cumple una condicin.
A veces es imposible llegar a una sencilla prueba para ver si el bucle debe terminar. En
casos como este se debera poner un contador de la seguridad en el circuito de lo que el
bucle est limitado en el nmero de veces que se puede recurrir. El contador de la
seguridad tiene que ser una variable que no se restablece cada vez en el bucle.
Probablemente ser una variable de nivel de mdulo que se pasa a la funcin. Cuando
un valor de control dentro de la funcin alcanza el valor mximo aprobado por las copas
de recursividad.
Asegrese de que cuando usted escribe las funciones recursivas no anidar. Slo un nivel
de recursividad debe estar pasando en un momento dado. Si anida recursividad que se
perder en los bucles. Si usted ve que se est poniendo a la recursividad cclico, tratar de
redisear la funcin para que slo tenga una actividad recursiva pasando en la funcin.
La ltima cosa que usted debe tener en cuenta en todo momento al escribir funciones
recursivas es la pila es slo tan grande. Si se escribe una rutina que recursos
indefinidamente, en algn momento usted se quedar sin pila. Cuando te quedas sin pila
en AutoLISP, el programa se cierra, que un usuario no puede ver el humor Restringir pulg
tu uso de la recursividad para pequeos bucles.
Do-while
Debido al hecho de que podemos hacer cualquier funcin que necesitamos, es posible
construir diferentes tipos de bucles. Uno de los bucles que usted puede estar
familiarizado en "C" es el bucle do-while. Como se puede ver a continuacin, podemos
aproximar la do-while bastante fcil en lisp.
(Hacer
(Hacer_esto)
(This_is_true))
(Defun hacer (chk_func body_func /)
(Foreach N (list_to_do))
(While (chk_func eval)
(Foreach n (list_to_do)))
)
No se mantiene fiel a la sintaxis del lenguaje "C", pero se acerca bastante. Si ha utilizado
do-while usted sabe lo valioso que puede ser, y es digno de l para que lo rodea. El do-
while que ves arriba puede ser utilizado para hacer una declaracin o muchos, si usted
escribe Hacer_esto como una lista.
(Defun c: less8a (/ hacer)
;; Definicin de la funcin Do-mientras
(Defun hacer (chk_func body_func /)
(N body_func foreach (eval n))
(While (chk_func eval)
(N body_func foreach (eval n)))
)
(Hacer
'((Si (x = nil); |
(Setq x 0); | ____ Haga esto
(Setq x (x 1))); |
(Prompt (strcat "\ n" (itoa x)))); |
'(<X 10)); bien esto es cierto
)
Lo que el do-while hace por usted es darle una forma de ejecutar las sentencias al menos
una vez, incluso si la CHK_FUNC es falsa. El normal "while" slo se ejecuta si el
CHK_FUNC es cierto. Esto tambin nos permite inicializar el bucle, dentro del bucle. Es
una forma muy limpia para mantener todo junto.
Para utilizar el do-mientras que por encima tienes que pasar los parmetros en, de una
manera de citar. Si no sigue esta regla no va a funcionar. Lo que estoy tratando de
mostrar que no es que lo que escrib arriba es la mejor manera de hacer un bucle do-
while, pero que las posibilidades estn ah para que usted escriba sus propias funciones
de programacin. Incluso las funciones bsicas de control se pueden reescribir.
PARA
El bucle FOR es otra fcil construir bucle de ceceo. El bucle FOR es como el bucle de
repeticin en los esteroides. Nos da una mayor flexibilidad y una forma ms limpia de
escribir el bucle de repeticin.
(Defun c: less8b (/ a)
(Defun para (condicin inicializador indexador body_code /)
(Inicializador eval)
(While (condicin eval)
(N body_code foreach (eval n))
(Indexador eval))
)
(Por '(setq x 0)' (<x 10) '(setq x (x 1))
'((Prompt (strcat "\ n" (itoa x)))))
)
Al igual que el do-while, el bucle para las necesidades de todo lo que pasa es citado. No
va a funcionar de otra manera. Como la ltima vez tambin, usted puede ser capaz de
pensar en una mejor manera de hacer lo que he hecho, pero slo asegrese de que
entiende, se puede hacer.

También podría gustarte