When coding for loops in SAS, one neat thing to remember is that all of the parts of it are optional.

DO variable=start
  <TO stop>
  <BY increment>
  <WHILE(expression) | UNTIL(expression)>
  ...
END;

http://support.sas.com/documentation/cdl/en/lrdict/62618/HTML/default/a000201276.htm

So in another language, what might be

for(int i=0;i < max;i++) {

In SAS, you can leave out the “by 1”, since it’s the default increment. So this would be

do i=0 to max;

What’s fun is in SAS you can combine a Repeat-Until/Do-While loop with a for loop. This might be useful if for some reason you don’t set the var “max” until you’ve iterated through the loop once, such as in this case, where “metadata_getnobj” returns a negative on fail, but otherwise returns the number of objects that match the query.

do i=1 by 1 until (i >= objs);
  rc=metadata_getnobj("omsobj:SASLibrary?@Libref='MYLIBREF'",i,uri);
  if rc>=0 then objs=rc;

  rc=metadata_getnasn(uri,"LibraryConnection",1,uri);
  if rc>=0 then leave;
end;

This code loops through all the libraries in the metadata with libref=’MYLIBREF’, and exits with a URI for the first one it sees with at least one LibraryConnection association. This is useful when you have a remote library pointing to a local library and they both have the same name and you want a URI to the remote one.

Another cool thing with FOR loops in SAS is iteration through lists. In Java, say you have a block like this:

for(String x : new String[] { "a","b","c" }) {
  System.out.println("x="+x);
}

In SAS, this is simply

do x="a","b","c";
  put x=;
end;