PROC FCMP was originally
developed as a programming language for several SAS/STAT, SAS/ETS, and SAS/OR
procedures. Because the implementation is not identical to the DATA
step, differences exist between the two languages. The following section
describes some of the differences between PROC FCMP and the DATA step.
Differences Between PROC FCMP and the DATA Step
ABORT Statement
The ABORT statement
in PROC FCMP does not accept arguments.
The ABORT statement
is not valid within functions or subroutines in PROC FCMP. It is valid
only in the main body of the procedure.
Arrays
PROC FCMP uses parentheses
after a name to represent a function call. When referencing an array,
the recommended practice is to use square brackets [ ] or curly braces
{ }. For an array named ARR, the code would be ARR[i] or ARR{i}.
PROC FCMP limits the number of dimensions for an array to six.
For more information
about the differences in the ARRAY statement for PROC FCMP, see Details.
Data Set Input and Output
PROC FCMP does not support
the DATA and the OUTPUT statements for creating and writing to an
output data set. It does not support the SET, MERGE, UPDATE, or MODIFY
statements for data set input. Data is typically transferred into
and out of PROC FCMP routines by using parameters. If a large amount
of data needs to be transferred, you can pass arrays to a PROC FCMP
routine.
DATA Step Debugger
When you use the DATA
step debugger, PROC FCMP routines perform like any other routine.
That is, it is not possible to step into the function when debugging.
Instead, use a PUT statement within the routine.
DO Statement
The following type of
DO statement is supported by PROC FCMP:
do i = 1, 2, 3;
The DO statement in
PROC FCMP does not support character loop control variables. You can
execute the following code in the DATA step, but not in PROC FCMP:
do i = 'a', 'b', 'c';
The DO statement does
not support a character index variable. Therefore, the following code
is not supported in PROC FCMP:
do i = 'one','two','three';
File Input and Output
PROC FCMP supports the
PUT and FILE statements, but the FILE statement is limited to LOG
and PRINT destinations. There are no INFILE or INPUT statements in
PROC FCMP.
IF Expressions
An IF expression enables
IF-THEN/ELSE conditions to be evaluated within an expression. IF expressions
are supported by PROC FCMP but not by the DATA step. You can simplify
some expressions with IF expressions by not having to split the expression
among IF-THEN/ELSE statements. For example, the following two pieces
of code are equivalent, but the IF expression (the first example)
is not as complex:
x = if y < 100 then 1 else 0;
if y < 100 then
x=1;
else
x=0;
The alternative to IF
expressions are expressions. This means that parentheses are used
to group operations instead of DO/END blocks.
PUT Statement
The syntax of the PUT
statement is similar in PROC FCMP and in the DATA step, but their
operations can be different. In PROC FCMP, the PUT statement is typically
used for program debugging. In the DATA step, the PUT statement is
used as a report or file creation tool, as well as a debugging tool.
The following list describes other differences:
The PUT statement in PROC FCMP
does not support line pointers, format modifiers, column output, factored
lists, iteration factors, overprinting, the _INFILE_ option, or the
special character $. It does not support features that are provided
by the FILE statement options, such as DLM= and DSD.
The PUT statement in PROC FCMP
supports evaluating an expression and writing the result by placing
the expression in parentheses. The DATA step, however, does not support
the evaluation of expressions in a PUT statement. In the following
example for PROC FCMP, the expressions x/100 and sqrt(y)/2 are
evaluated and the results are written to the SAS log:
put (x/100) (sqrt(y)/2);
Because parentheses
are used for expression evaluation in PROC FCMP, they cannot be used
for variable or format lists as in the DATA step.
The PUT statement in PROC FCMP
does not support subscripted array names unless they are enclosed
in parentheses. For example, the statement PUT (A[i]); writes
the i-th element of the array A, but the statement PUT
A[i]; results in an error message.
An array name can be used in a
PUT statement without superscripts. Therefore, the following statements
are valid:
PUT A=; (when
A is an array), writes all of the elements of array A with each value
labeled with the name of the element variable.
PUT (A)*=; writes
the same output as PUT A=;.
PUT A; writes
all of the elements of array A.
The PUT statement in PROC FCMP
follows the output of each item with a space, which is similar to
list mode output in the DATA step. Detailed control over column and
line position are supported to a lesser extent than in the DATA step.
The PUT statement in PROC FCMP
supports the print item _PDV_, and prints a formatted listing of all
of the variables in the routine's program data vector. The statement PUT
_PDV_; prints a much more readable listing of the variables
than is printed by the statement PUT _ALL_;.
WHEN and OTHERWISE Statements
The WHEN and OTHERWISE
statements allow more than one target statement. That is, DO/END groups
are not necessary for multiple WHEN statements. The following is an
example:
SELECT;
WHEN(expression-1)
statement-1;
statement-2;
WHEN (expression-2)
statement-3;
statement-4;
END;
Additional Features in PROC FCMP
PROC REPORT and Compute Blocks
PROC REPORT uses the
DATA step to evaluate compute blocks. Because the DATA step can call
PROC FCMP routines, you can also call these routines from PROC REPORT
compute blocks.
The FCmp Function Editor
The FCmp Function Editor
is an application for traversing packages of functions and is built
into the SAS Explorer. You can access the FCmp Function Editor from
the Solutions menu of an interactive SAS session. For more information,
see Introduction to the FCmp Function Editor.
Computing Implicit Values of a Function
PROC FCMP uses a SOLVE
function for computing implicit values of a function. For more information,
see SOLVE Function.
PROC FCMP and Microsoft Excel
Many Microsoft Excel
functions, not typically available in SAS, are implemented in PROC
FCMP. You can find these functions in the sashelp.slkwxl data set.