[OT] Máquinas de estados (Re: [OT] Re: Error de Mysql y como arreglarlo)

Chema Cortés py en ch3m4.org
Jue Dic 30 11:15:11 CET 2004


El Miércoles, 29 de Diciembre de 2004 17:49, Miguel Angel Garcia escribió:
> Independientemente de la forma en que se utilice el "goto", estarás de
> acuerdo conmigo en que rompe la ejecución normal del programa. Es el
> mismo caso que "return", "continue" o "break" (no sé si todas ellas
> están en python). Sin embargo, el ámbito de uso de estas tres
> instrucciones queda reducido a la propia función, como mucho.
>
> "goto" es una instrucción cuyo ámbito no está definido, y no sólo puede
> cambiar el flujo normal del programa, sino también su estructura.

El goto, como bien dices, se ha camuflado bajo muchas formas y nombres. Ahora 
recuerdo, como cosa rara, los "entry points" que tenía fortran y que llegó a 
tener el C primitivo. Con éllos podrías entrar en mitad de una función 
saltándote las primeras líneas. Tampoco hay que olvidarse de los 
"generadores" del python, que en sí también rompen con el flujo "normal" del 
programa, y tantas otras variaciones sobre el mismo tema.

Lo que llamas flujo "normal" no es otra cosa que flujo "lineal", y no se puede 
asegurar que sea siempre así. A parte de ejecución multihilo/multiproceso, 
puedes tener una ejecución regida por un árbol de decisiones como el que a 
veces se emplea en una máquina de estados. En este caso, se va 
"recomponiendo" el flujo de ejecución para adaptarlo en tiempo de ejecución. 
Hablas (más abajo) de utilizar un vector de funciones; pero no llego a verlo 
tan claro ni elegante como usando "continuadores" (que es similar a la 
técnica de usar gotos del artículo que comentaba). Por supuesto, está 
demostrado científicamente que se puede hacer sin gotos, pero no es razón 
suficiente para descartarlos por completo.


> En ensamblador no se puede hacer otra cosa: o se utiliza "goto" o la
> hemos liao :) . Sin embargo, en los lenguajes de alto nivel no debería
> utilizarse. Los casos en los que podría pensarse el utilizar "goto" se
> pueden contar con los dedos de una mano. A menudo existe otra solución
> más simple, segura, eficiente, bonita, lógica o, simplemente mejor
> estructurada de hacer las cosas que utilizar un "goto".
>
> Si a esto le añadimos que estamos hablando de python, un lenguaje de muy
> alto nivel que está orientado a objetos, no veo lógico utilizar "goto".
> Te aseguro que puedes hacer máquinas de estados en python sin utilizar
> "goto"s.
>
> De todas maneras, estoy seguro que estás de acuerdo conmigo con que es
> muy sencillo _abusar_ del "goto". Y usarlo mal es peor que tener un
> "main" de mil y pico líneas... ;D
>
>
> PD: me has dejao con la mosca detrás de la oreja... Para programar una
> máquina de estados se podría utilizar un vector de punteros a función.
> ¡Quedaría muy chulo! (y no se utiliza goto). ¿Qué opinas?

Como te decía, no lo veo claro. Por ejemplo, ¿cómo piensas que se podría 
implementar un "analizador léxico" con un vector así?
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: application/pgp-signature
Size: 189 bytes
Desc: no disponible
URL: <http://mail.python.org/pipermail/python-es/attachments/20041230/2a0e2222/attachment.pgp>
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es