Most loops in Yorick programs are implicit; remember that operations between array arguments produce array results. Whenever you write a Yorick program, you should be suspicious of all explicit loops. Always ask yourself whether a clever use of array syntax could have avoided the loop.
To illustrate an appropriate Yorick loop, let’s revise q_out to write several values of Q in a single call. Incidentally, this sort of incremental revision of a function is very common in Yorick program development. As you use a function, you notice that the surrounding code is often the same, suggesting a savings if it were incorporated into the function. Again, a careful job leaves all of the previous behavior of q_out intact:
func q_out(Q, file) { if (structof(file)==string) file = create(file); n = numberof(Q); for (i=1 ; i<=n ; ++i) { write, file, "Q = "+pr1(Q(i)); write, file, " theta amplitude"; write, file, theta, damped_wave(theta,Q(i)); } return file; } |
Two new features here are the numberof function, which returns the length of the array Q, and the array indexing syntax Q(i), which extracts the i-th element of the array Q. If Q is scalar (as it had to be before this latest revision), numberof returns 1, and Q(1) is the same as Q, so scalar Q works as before.
But the most important new feature is the for loop. It says to initialize i to 1, then, as long as i remains less than or equal to n, to execute the loop body, which is a compound of three write statements. Finally, after each pass, the increment expression ++i is executed before the i<=n condition is evaluated. ++i is equivalent to i=i+1; --i means i=i-1.
A loop body may also be a single statement, in which case the curly braces are unecessary. For example, the following lines will write the Q=3, Q=2, and Q=1 curves to the file ‘q.out’, then plot them:
q_list = [3,2,1] q_out, q_list, "q.out" fma; for(i=1;i<=3;++i) plg, damped_wave(theta,q_list(i)), theta |
A for loop with a plg body is the easiest way to overlay a series of curves. After the three simple statement types, for statements see the most frequent direct use from the keyboard.
• while and do | ||
• for | ||
• goto | How to break, continue, and goto from a loop body. |