Tras analizar internamente como está implementado DOALL y revisar la documentación, veo que no concuerdan. Es más, la documentación en español estaba bastante mal, al estar el punto 4 de la misma mal traducido. Ahora está bien traducido (lo acabo de cambiar) pero eso solo hace que esté tan mal como la inglesa. Lo cierto es que ni yo mismo recordaba que estaba implementado así, de ahí mis erráticas respuestas en casos anteriores.
Por un lado ngPAWS no tiene un DOALL como el de PAW. Es parecido, pero no es igual, y además no puede serlo sin cambios enormes en sus tripas, así que voy a intentar explicar como funciona:
1. Cuando ngPAWS se encuentra un DOALL busca el primer objeto que esté en la localidad indicada por el DOALL, si no encuentra ninguno finaliza el DOALL y hace un DONE (y por tanto acaba la ejecución del proceso/respuestas actual).
2. Si encontró un lo pone en los flags que guardan el nombre+adjetivo de la frase actual, y en los del objeto referenciado (incluyendo los de los atributos del objeto actual, peso y ubicación). A los efectos es como si cambiara la frase actual de VERBO + TODO a VERBO + <EL OBJETO>.
3. Llama de nuevo al proceso actual, con una particularidad, le dice que en lugar de ejecutarlo completo, empiece por la entrada siguiente a la que está el DOALL.
4. Cuando esa ejecución del proceso termina, se vuelve al punto 1 y se trata de buscar otro objeto. Si lo encuentra pasamos al punto 2 y si no se hace un DONE.
En esas condiciones es imposible que nada de lo que hay en la misma entrada que el DOALL pero detrás del mismo se ejecute jamás, porque el DOALL siempre va a empezar a ejecutar desde la siguiente entrada a cada iteración, o si ya no hay más objetos, ejecutar un DONE. Por ejemplo en este código, cada vez que pongamos TEST TODO saldrá un "Hola" por cada objeto que llevemos, pero ningún ADIOS. A ese WRITE "ADIOS" no se llega nunca.
Código:
TEST TODO
DOALL CARRIED
WRITE "ADIOS"
TEST _
WRITE "HOLA"
DONE
¿Y entonces como funciona por ejemplo el DEJAR TODO?
Muy sencillo: en la base de datos de inicio hay una entrada así:
Código:
DEJAR TODO
DOALL CARRIED
y bastante más abajo otra así:
Código:
DEJAR _
AUTOD
Como a cada ejecución del DOALL el resto de la tabla de respuestas debajo de ese DOALL se ejecuta cada vez con un objeto, al DEJAR _ nos llega cada vez un DEJAR <ALGO>.
Hay acciones que cancelan un bucle doall por cierto, como BREAK o DESC.