»  Home »  Products »  Stata 8 »  Programming features

## Programming features in Stata 8

• Object-oriented programming has been added to Stata. Classes are defined by the new class command in .class files. Among other features, classes provide inheritance, encapsulation of data structures and programs, and program name overloading. Stata's new graphics and new GUI are implemented via classes.

• Stata has a new GUI, which is programmable. Dialog boxes are created in .dlg files.

• Stata has new programmable graphics.

• The new serset command is another part of Stata's new graphics, though its use is not limited to graphics. A serset is a collection of variables from a dataset that coexists in memory along with the current dataset, and whose values can be accessed quickly. The new serset command creates and manipulates sersets.

• SMCL has three additions. The new {ccl} directive outputs the value contained in a constant and current-value class (c()) object. {center:text} now also allows {center #:text}, which specifies that text be centered within a width of # columns. {dialog dialogname:text} launches a dialog box.

• The new markin command—for use after marksample, mark, and markout—creates a macro containing the smallest in range that contains the if exp.

• The new c class contains constants, such as the value of pi and current values of system parameters and settings. Typing creturn list displays the current settings.

Many macro extended functions have disappeared; that is, they have disappeared from the documentation, even though they still work. For instance, to find out whether more was on or off, there was set more, but it is now gone. c(more) returns the more setting, and lots more. This is not only more logical, but it is now easier to find these settings; just type creturn list.

• The define in program define myprog is now optional.

• New set trace ... features make debugging programs easier.

set traceexpand specifies whether a line in a program is to be shown both before and after macro expansion.

set tracedepth specifies the level of nesting to be included in the trace.

set tracesep specifies whether a horizontal separator line that displays the name of the subroutine is displayed in the trace whenever a subroutine is called or exits.

set traceindent specifies whether the displayed lines of code are indented according to their nesting level.

set tracenumber specifies whether the nesting level is displayed at the front of the program lines.

• The new comment indicators // and /// allow new ways of specifying comments and joining lines in do-files and ado-files.

• The postfile command now allows you to post string variables! postfile now accepts a newvarlist rather than a varlist, so storage types may be specified, including strings.

• The new macro assignment commands local ++lclname and local --lclname may be used to increment and decrement lclname.

• Macro expansion now allows ++ and -- prefix and suffix operators. ++a' means to increment a by 1 and substitute the resulting value. a++' means substitute the current value of a and then to increment it by 1. --a' and a--' do the same thing, except that they decrement.

• Macro expansion now allows evaluation of expressions, such as =2*(i'+1)', and allows the use of macro extended functions, such as : var label myvar''.

• A new macro expansion function macval(lclname) gives the contents of lclname as is, without recursive expansion.

• Five new macro extended functions have been added, which are mentioned below. (Another nine new macro extended functions have been added to support the use of the new serset command mentioned above).

The new macro extended function list allows manipulations of lists (think lists of variable names, lists of filenames, etc.). For instance, a|b forms the union of a and b without repeating in the results the elements that are in both a and b. a&b returns the intersection (elements in both a and b).

The new macro extended function constraint gives information on constraints.

The new macro extended function permname assists in naming variables.

The new macro extended function dir obtains file and directory names.

The new macro extended function length returns the length in characters of a macro.
• The syntax command has two new descriptors:

The new namelist descriptor provides an alternative to the varlist descriptor. namelist relaxes the restriction that the names that the user types be variable names. namelist can be specified in place of varlist at the front of a command, and namelist can be specified inside option arguments.

The new anything descriptor makes it easier for programmers to parse almost-standard syntax, that is, nonstandard syntax up to if, in, weight, or options, and standard syntax thereafter.

• gettoken has two new options: bind and qed(lmacname). bind specifies that expressions within parentheses or brackets be bound together, even when not parsing on () and []. qed() specifies a local macroname to be filled in with 1 or 0 according to whether the returned token was enclosed in quotes in the original string.

• assert has a new option null that forces a return code of 8 on null assertions.

• confirm has two new subcommands: confirm matrix and confirm scalar.

• The new findfile command looks for a file along a specified path and returns the name in r(fn).

• The new file command allows programmers to read and write both ASCII text and binary files.

• The new matrix opaccum command forms a new matrix based on the outer product, within a specified group, of a specified variable.

• The new matrix eigenvalues command calculates eigenvalues of nonsymmetric matrices.

• The new unabcmd command returns a Stata command in unabbreviated form.

• save has a new emptyok option that allows saving datasets with no variables or observations, and merge and append have been certified to work with empty datasets. Thus, in loops that build datasets, you no longer have to treat the first addition specially. You can create an empty result at the outset and then just append or merge to the previous result.

• describe using has a new varlist option that specifies that the saved results r(varlist) and r(sortlist) be saved along with the other saved results. r(varlist) will contain the names of the variables in the dataset, and r(sortlist) will contain the names of the variables by which the data are sorted. Thus, you no longer have to use a dataset to find out about it.

• You can now obtain the random-number seed at one point in a program and reset it in another:
  . ... . local seed = "c(seed)'" . ... . set seed seed' . ... 

• The new programming functions maxbyte(), maxdouble(), maxfloat(), maxint(), maxlong(), minbyte(), mindouble(), minfloat(), minint(), and minlong() find the largest and smallest number of each numerical data type. epsdouble() and epsfloat() give the smallest step size for floating-point and double-precision numbers. The function byteorder() gives the byte order for writers of binary files, and irecode() is another flavor of the recode() function.

• The new programming functions chop() and clip() return x rounded to an integer and x within a range.

• The new matrix functions are issym(), which determines if a matrix is symmetric; matuniform(), which makes a matrix filled with uniformly distributed random numbers; matmissing(), which indicates if elements of a matrix are missing; hadamard(), which computes the Hadamard product of two matrices; and vec(), which turns a matrix into a column vector.

• The new string function plural() makes plurals, proper() obtains the correct capitalization, word() finds a specific word of a string, and wordcount() counts the number of words in a string.

• The new math functions include tanh(), the hyperbolic tangent, and its inverse, atanh(); logit() and invlogit(); and cloglog(), the complimentary log-log function, and its inverse, invcloglog(). New functions ceil() and floor() find the least integer greater than x and the greatest integer less than x, respectively.

• The new probability distribution and density functions include the first and second derivatives for the gamma distribution, dgammapda(), dgammapdada(), dgammapdadx(), dgammapdx(), and dgammapdxdx(). A variety of density functions have been added: betaden(), gammaden(), nbetaden(), tden(), Fden(), and nFden() for calculating both central and noncentral distributions. New distribution functions and inverses are nibeta(), invnibeta(), nFtail(), and invnFtail().

• Existing function cond(x,a,b,[d]) now has an optional fourth argument that is returned in case x evaluates to missing. If the fourth argument is not specified, x=missing returns b.

• Existing function recode(x,x_1,x_2,..., x_n) now returns missing if the sequence is not weakly increasing. x_i = . is interpreted as +infinity.

• Existing function round(x[.y]) now allows the argument y, which specifies the unit of rounding, to be optional.