Copyright (C) 2000-2012 |
GNU Info (groff)whilewhile ----- `gtroff' provides a looping construct using the `while' request, which is used much like the `if' (and related) requests. - Request: .while expr anything Evaluate the expression EXPR, and repeatedly execute ANYTHING (the remainder of the line) until EXPR evaluates to 0. .nr a 0 1 .while (\na < 9) \{\ \n+a, .\} \n+a => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Some remarks. * The body of a `while' request is treated like the body of a `de' request: `gtroff' temporarily stores it in a macro which is deleted after the loop has been exited. It can considerably slow down a macro if the body of the `while' request (within the macro) is large. Each time the macro is executed, the `while' body is parsed and stored again as a temporary macro. .de xxx . nr num 10 . while (\\n[num] > 0) \{\ . \" many lines of code . nr num -1 . \} .. The traditional and ofter better solution (UNIX `troff' doesn't have the `while' request) is to use a recursive macro instead which is parsed only once during its definition. .de yyy . if (\\n[num] > 0) \{\ . \" many lines of code . nr num -1 . yyy . \} .. . .de xxx . nr num 10 . yyy .. Note that the number of available recursion levels is set to 1000 (this is a compile-time constant value of `gtroff'). * The closing brace of a `while' body must end a line. .if 1 \{\ . nr a 0 1 . while (\n[a] < 10) \{\ . nop \n+[a] .\}\} => unbalanced \{ \} - Request: .break Break out of a `while' loop. Be sure not to confuse this with the `br' request (causing a line break). - Request: .continue Finishes the current iteration of a `while' loop, immediately restarting the next iteration. Note: Expressions. |