\section{KEYWORDS Function Keywords}

\subsection{Usage}

A feature of IDL that FreeMat has adopted is a modified
form of \verb|keywords|.  The purpose of \verb|keywords| is to 
allow you to call a function with the arguments to the
function specified in an arbitrary order.  To specify
the syntax of \verb|keywords|, suppose there is a function 
with prototype
\begin{verbatim}
  function [out_1,...,out_M] = foo(in_1,...,in_N)
\end{verbatim}
Then the general syntax for calling function \verb|foo| using keywords
is
\begin{verbatim}
  foo(val_1, val_2, /in_k=3)
\end{verbatim}
which is exactly equivalent to
\begin{verbatim}
  foo(val_1, val_2, [], [], ..., [], 3),
\end{verbatim}
where the 3 is passed as the k-th argument, or alternately,
\begin{verbatim}
  foo(val_1, val_2, /in_k)
\end{verbatim}
which is exactly equivalent to
\begin{verbatim}
  foo(val_1, val_2, [], [], ..., [], logical(1)),
\end{verbatim}
Note that you can even pass reference arguments using keywords.
\subsection{Example}

The most common use of keywords is in controlling options for
functions.  For example, the following function takes a number
of binary options that control its behavior.  For example,
consider the following function with two arguments and two
options.  The function has been written to properly use and
handle keywords.  The result is much cleaner than the MATLAB
approach involving testing all possible values of \verb|nargin|,
and forcing explicit empty brackets for don't care parameters.
\begin{verbatim}
    keyfunc.m
function c = keyfunc(a,b,operation,printit)
  if (~isset('a') | ~isset('b')) 
    error('keyfunc requires at least the first two 2 arguments'); 
  end;
  if (~isset('operation'))
    % user did not define the operation, default to '+'
    operation = '+';
  end
  if (~isset('printit'))
    % user did not specify the printit flag, default is false
    printit = 0;
  end
  % simple operation...
  eval(['c = a ' operation ' b;']);
  if (printit) 
    printf('%f %s %f = %f\n',a,operation,b,c);
  end
\end{verbatim}
Now some examples of how this function can be called using
\verb|keywords|.
\begin{verbatim}
--> keyfunc(1,3)                % specify a and b, defaults for the others
ans = 
  <int32>  - size: [1 1]
 4  
--> keyfunc(1,3,/printit)       % specify printit is true
1.000000 + 3.000000 = 4.000000
ans = 
  <int32>  - size: [1 1]
 4  
--> keyfunc(/operation='-',2,3) % assigns a=2, b=3
ans = 
  <int32>  - size: [1 1]
 -1  
--> keyfunc(4,/operation='*',/printit) % error as b is unspecified
Error: keyfunc requires at least the first two 2 arguments

\end{verbatim}
