En/Je/On 2017-06-26 12:09, javier gil [email protected] [forth-es] escribió / skribis / wrote :
> Desde siempre se ha dicho que Forth fuerza la programación de abajo hacia > arriba. Es el estilo natural para este lenguaje y el que recomiendan los > que saben. Sin embargo, me he dado cuenta de que por la carencia de > elementos sintácticos que distraigan, la programación de arriba hacia abajo > es más natural en Forth que en otros lenguajes, porque el código que se > escribe, teniendo aspecto de pseudocódigo, es realmente código Forth listo > para ejecutarse. Luego, cuando se ha descendido lo suficiente, se puede > enlazar desde abajo hacia arriba. Es una reflexión muy interesante. Yo pienso que ambos caminos son complementarios, igual de útiles y productivos. Escoger uno u otro en cada momento depende de muchos factores. A veces, para tener una visión global del código, es útil empezar desde arriba, partiendo de una descripción ideal del problema, e ir descendiendo, repitiendo el proceso en cada paso. Otras veces se ve claramente la necesidad de ciertas palabras de bajo nivel, y su uso condiciona la forma de los niveles superiores. > Esto tiene un beneficio adicional muy importante: el ruido de pila > queda confinado en los niveles más bajos, y en el nivel alto no queda > rastro de él. Ciertamente, una factorización bien hecha desde abajo > puede conseguir el mismo efecto. Pero, para un programador corriente, > como yo, esto se consigue más fácilmente empezando desde arriba. Sí, es cierto que en código bien factorizado el ruido de pila desaparece de los niveles superiores, porque la pila se usa solo para el paso de parámetros. Por otra parte, cuanto más pequeñas y especializadas sean las palabras, menos necesidad habrá de hacer manipulaciones confusas en la pila. Idealmente, al final del proceso, cada palabra, lo más pequeña posible, debería corresponderse con una tarea concreta, precisa, clara, y cuya función resulte lo más evidente posible fuera de contexto. Un ejemplo de código reciente que escribí con ese doble proceso (de arriba hacia abajo y de abajo hacia arriba), es el bucle principal de _Nuclear Waste Invaders_ (http://programandala.net/es.programa.nuclear_waste_invaders.html), cuya versión actual es la siguiente: ---------------------------------------------------------------- : extermination? ( -- f ) invaders c@ 0= ; : attack-wave ( -- ) init-mothership init-invaders parade ; : fight ( -- ) fly-projectile driving fly-projectile shooting fly-projectile manage-mothership fly-projectile invasion ; : end-of-attack? ( -- f ) extermination? catastrophe? or ; : under-attack ( -- ) check-breachs attack-wave begin fight end-of-attack? until lose-projectiles ; : another-attack? ( -- f ) breachs? catastrophe? 0= and ; : weapons ( -- ) new-tank new-projectiles ; : prepare-battle ( -- ) settle weapons ; : interlude ( -- ) new-breach? ?exit repair-building ; : battle ( -- ) prepare-battle begin under-attack another-attack? while attack-report interlude repeat ; : campaign ( -- ) begin battle catastrophe? 0= while battle-report reward travel repeat ; : war ( -- ) prepare-war campaign defeat ; : run ( -- ) begin mobilize war again ; ---------------------------------------------------------------- Creo que ese código también ilustra lo que comentas de que el ruido de pila desaparece en el nivel superior. > Empiezo a pensar que el buen programador de Forth no es el que domina la > pila, y puede escribir código que la manipule al vuelo. Empiezo a pensar > que el buen programador de Forth es aquél que necesita muy poco luchar > contra la pila. Estoy de acuerdo. El objetivo ideal es hacer que la pila pase lo más desapercibida posible, para que no ensucie la «poesía» de Forth... -- Marcos Cruz http://programandala.net
