changeset 2679:79c851e2f0ee

[project @ 1997-02-14 04:32:00 by jwe]
author jwe
date Fri, 14 Feb 1997 04:33:35 +0000
parents d1b51420fd85
children 8e7e5137d3f8
files doc/interpreter/data.texi doc/interpreter/errors.texi doc/interpreter/eval.texi doc/interpreter/grammar.texi doc/interpreter/numbers.texi doc/interpreter/struct.texi doc/interpreter/tips.texi doc/interpreter/var.texi
diffstat 8 files changed, 2090 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/data.texi
@@ -0,0 +1,170 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Data Types, Numeric Data Types, Getting Started, Top
+@chapter Data Types
+@cindex data types
+
+All versions of Octave include a number of built-in data types,
+including real and complex scalars and matrices, character strings, and
+a data structure type.
+
+It is also possible to define new specialized data types by writing a
+small amount of C++ code.  On some systems, new data types can be loaded
+dynamically while Octave is running, so it is not necessary to recompile
+all of Octave just to add a new type.  @xref{Dynamically Linked
+Functions} for more information about Octave's dynamic linking
+capabilities.
+
+@menu
+* Built-in Data Types::         
+* User-defined Data Types::     
+* Object Sizes::                
+@end menu
+
+@node Built-in Data Types, User-defined Data Types, Data Types, Data Types
+@section Built-in Data Types
+@cindex data types, built-in
+@cindex built-in data types
+
+The standard built-in data types are real and complex scalars and
+matrices, character strings, and a data structure type.  Additional
+built-in data types may be added in future versions.  If you need a
+specialize data type that is not currently provided as a built-in type,
+you are encouraged to write your own user-defined data type and
+contribute it for distribution in a future release of Octave.
+
+@menu
+* Numeric Objects::             
+* String Objects::              
+* Data Structure Objects::      
+@end menu
+
+@node Numeric Objects, String Objects, Built-in Data Types, Built-in Data Types
+@subsection Numeric Objects
+@cindex numeric constant
+@cindex numeric value
+
+Octave's built-in numeric objects include real and complex scalars and
+matrices.  All built-in numeric data is currently stored as double
+precision numbers.  On systems that use the IEEE floating point format,
+values in the range
+@iftex
+@tex
+ $2.2251\times10^{-308}$ to $1.7977\times10^{308}$
+@end tex
+@end iftex
+@ifinfo
+ 2.2251e-308 to 1.7977e+308
+@end ifinfo
+ can be stored, and the relative precision is approximately
+@iftex
+@tex
+ $2.2204\times10^{-16}$.
+@end tex
+@end iftex
+@ifinfo
+ 2.2204e-16.
+@end ifinfo
+The exact values are given by the variables @var{realmin},
+@var{realmax}, and @var{eps}, respectively.
+
+Matrix objects can be of any size, and can be dynamically reshaped and
+resized.  It is easy to extract individual rows, columns, or submatrices
+is using a variety of powerful indexing features.
+
+@xref{Numeric Data Types}, for more information.
+
+@node String Objects, Data Structure Objects, Numeric Objects, Built-in Data Types
+@subsection String Objects
+@cindex strings
+@cindex character strings
+@opindex "
+@opindex '
+
+A character string in Octave consists of a sequence of characters
+enclosed in either double-quote or single-quote marks.  Internally,
+Octave currently stores strings as matrices of characters.  All the
+indexing operations that work for matrix objects also work for strings.
+
+@xref{Strings}, for more information.
+
+@node Data Structure Objects,  , String Objects, Built-in Data Types
+@subsection Data Structure Objects
+@cindex structures
+@cindex data structures
+
+Octave's data structure type can help you to organize related objects of
+different types.  The current implementation uses an associative array
+with indices limited to strings, but the syntax is more like C-style
+structures.
+
+@xref{Data Structures}, for more information.
+
+@node User-defined Data Types, Object Sizes, Built-in Data Types, Data Types
+@section User-defined Data Types
+@cindex user-defined data types
+@cindex data types, user-defined
+
+@node Object Sizes,  , User-defined Data Types, Data Types
+@section Object Sizes
+
+The following functions allow you to determine the size of a variable or
+expression.  These functions are defined for all objects.  They return
+-1 when the operation doesn't make sense.  For example, Octave's data
+structure type doesn't have rows or columns, so @code{rows} and
+@code{columns} return -1 for structure arguments.
+
+@deftypefn {Function File} {} columns (@var{a})
+Return the number of columns of @var{a}.
+@end deftypefn
+
+@deftypefn {Function File} {} rows (@var{a})
+Return the number of rows of @var{a}.
+@end deftypefn
+
+@deftypefn {Function File} {} length (@var{a})
+Return the number of rows of @var{a} or the number of columns of
+@var{a}, whichever is larger.
+@end deftypefn
+
+@deftypefn {Function File} {} size (@var{a}, @var{n})
+Return the number rows and columns of @var{a}.
+
+With one input argument and one output argument, the result is returned
+in a 2 element row vector.  If there are two output arguments, the
+number of rows is assigned to the first, and the number of columns to
+the second.  For example,
+
+@example
+@group
+octave:13> size ([1, 2; 3, 4; 5, 6])
+ans =
+
+  3  2
+
+octave:14> [nr, nc] = size ([1, 2; 3, 4; 5, 6])
+nr = 3
+
+nc = 2
+@end group
+@end example
+
+If given a second argument of either 1 or 2, @code{size} will return
+only the row or column dimension.  For example
+
+@example
+octave:15> size ([1, 2; 3, 4; 5, 6], 2)
+ans = 2
+@end example
+
+@noindent
+returns the number of columns in the given matrix.
+@end deftypefn
+
+@deftypefn {Function File} {} isempty (@var{a})
+Return 1 if @var{a} is an empty matrix (either the number of rows, or
+the number of columns, or both are zero).  Otherwise, return 0.
+@end deftypefn
+
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/errors.texi
@@ -0,0 +1,114 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Error Handling, Input and Output, Functions and Scripts, Top
+@chapter Error Handling
+
+@deftypefn {Built-in Function} {} error (@var{template}, @dots{})
+The @code{error} function formats the optional arguments under the
+control of the template string @var{template} using the same rules as
+the @code{printf} family of functions (@pxref{Formatted Output}).
+The resulting message is prefixed by the string @samp{error: } and
+printed on the @code{stderr} stream.
+
+Calling @code{error} also sets Octave's internal error state such that
+control will return to the top level without evaluating any more
+commands.  This is useful for aborting from functions or scripts.
+
+If the error message does not end with a new line character, Octave will
+print a traceback of all the function calls leading to the error.  For
+example, given the following function definitions:
+
+@example
+@group
+function f () g () end
+function g () h () end
+function h () nargin == 1 || error ("nargin != 1"); end
+@end group
+@end example
+
+@noindent
+calling the function @code{f} will result in a list of messages that
+can help you to quickly locate the exact location of the error:
+
+@example
+@group
+f ()
+error: nargin != 1
+error: evaluating index expression near line 1, column 30
+error: evaluating binary operator `||' near line 1, column 27
+error: called from `h'
+error: called from `g'
+error: called from `f'
+@end group
+@end example
+
+If the error message ends in a new line character, Octave will print the
+message but will not display any traceback messages as it returns
+control to the top level.  For example, modifying the error message
+in the previous example to end in a new line causes Octave to only print
+a single message:
+
+@example
+@group
+function h () nargin == 1 || error ("nargin != 1\n"); end
+f ()
+error: nargin != 1
+@end group
+@end example
+@end deftypefn
+
+@defvr {Built-in Variable} error_text
+This variable contains the the text of error messages that would have
+been printed in the body of the most recent @code{unwind_protect} or
+@code{try} statement or the @var{try} part of the most recent call to
+the @code{eval} function.  Outside of the @code{unwind_protect} and
+@code{try} statements or the @code{eval} function, or if no error has
+ocurred within them, the value of @code{error_text} is guaranteed to be
+the empty string.
+
+Note that the message does not include the first @samp{error: } prefix,
+so that it may easily be passed to the @code{error} function without
+additional processing@footnote{Yes, it's a kluge, but it seems to be a
+reasonably useful one.}.
+
+@xref{The try Statement} and @ref{The unwind_protect Statement}.
+@end defvr
+
+@defvr {Built-in Variable} beep_on_error
+If the value of @code{beep_on_error} is nonzero, Octave will try
+to ring your terminal's bell before printing an error message.  The
+default value is 0.
+@end defvr
+
+@deftypefn {Built-in Function} {} warning (@var{msg})
+Print the message @var{msg} prefixed by the string @samp{warning: }.
+@end deftypefn
+
+@deftypefn {Built-in Function} {} usage (@var{msg})
+Print the message @var{msg}, prefixed by the string @samp{usage: }, and
+set Octave's internal error state such that control will return to the
+top level without evaluating any more commands.  This is useful for
+aborting from functions.
+
+After @code{usage} is evaluated, Octave will print a traceback of all
+the function calls leading to the usage message.
+@end deftypefn
+
+The following pair of functions are of limited usefulness, and may be
+removed from future versions of Octave.
+
+@deftypefn {Function File} {} perror (@var{name}, @var{num})
+Print the error message for function @var{name} corresponding to the
+error number @var{num}.  This function is intended to be used to print
+useful error messages for those functions that return numeric error
+codes.
+@end deftypefn
+
+@deftypefn {Function File} {} strerror (@var{name}, @var{num})
+Return the text of an error message for function @var{name}
+corresponding to the error number @var{num}.  This function is intended
+to be used to print useful error messages for those functions that
+return numeric error codes.
+@end deftypefn
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/eval.texi
@@ -0,0 +1,110 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Evaluation, Statements, Expressions, Top
+@chapter Evaluation
+
+Normally, you evaluate expressions simply by typing them at the Octave
+prompt, or by asking Octave to interpret commands that you have saved in
+a file.
+
+Sometimes, you may find it necessary to evaluate an expression that has
+been computed and stored in a string, or use a string as the name of a
+function to call.  The @code{eval} and @code{feval} functions allow you
+to do just that, and are necessary in order to evaluate commands that
+are not known until run time, or to write functions that will need to
+call user-supplied functions.
+
+@deftypefn {Built-in Function} {} eval (@var{command})
+Parse the string @var{command} and evaluate it as if it were an Octave
+program, returning the last value computed.  The @var{command} is
+evaluated in the current context, so any results remain available after
+@code{eval} returns.  For example,
+
+@example
+octave:13> a
+error: `a' undefined
+octave:14> eval ("a = 13")
+a = 13
+ans = 13
+octave:15> a
+a = 13
+@end example
+
+In this case, two values are printed:  one for the expression that was
+evaluated, and one for the value returned from @code{eval}.  Just as
+with any other expression, you can turn printing off by ending the
+expression in a semicolon.  For example,
+
+@example
+octave:13> a
+error: `a' undefined
+octave:14> eval ("a = 13;")
+ans = 13
+octave:15> a
+a = 13
+@end example
+@end deftypefn
+
+@deftypefn {Built-in Function} {} feval (@var{name}, @dots{})
+Evaluate the function named @var{name}.  Any arguments after the first
+are passed on to the named function.  For example,
+
+@example
+octave:12> feval ("acos", -1)
+ans = 3.1416
+@end example
+
+@noindent
+calls the function @code{acos} with the argument @samp{-1}.
+
+The function @code{feval} is necessary in order to be able to write
+functions that call user-supplied functions, because Octave does not
+have a way to declare a pointer to a function (like C) or to declare a
+special kind of variable that can be used to hold the name of a function
+(like @code{EXTERNAL} in Fortran).  Instead, you must refer to functions
+by name, and use @code{feval} to call them.
+@end deftypefn
+
+@cindex Fordyce, A. P.
+@findex newtroot
+Here is a simple-minded function using @code{feval} that finds the root
+of a user-supplied function of one variable using Newton's method.
+
+@example
+@group
+function result = newtroot (fname, x)
+
+# usage: newtroot (fname, x)
+#
+#   fname : a string naming a function f(x).
+#   x     : initial guess
+
+  delta = tol = sqrt (eps);
+  maxit = 200;
+  fx = feval (fname, x);
+  for i = 1:maxit
+    if (abs (fx) < tol)
+      result = x;
+      return;
+    else
+      fx_new = feval (fname, x + delta);
+      deriv = (fx_new - fx) / delta;
+      x = x - fx / deriv;
+      fx = fx_new;
+    endif
+  endfor
+
+  result = x;
+
+endfunction
+@end group
+@end example
+
+Note that this is only meant to be an example of calling user-supplied
+functions and should not be taken too seriously.  In addition to using a
+more robust algorithm, any serious code would check the number and type
+of all the arguments, ensure that the supplied function really was a
+function, etc.
+
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/grammar.texi
@@ -0,0 +1,53 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Grammar, Copying, Emacs, Top
+@chapter Grammar
+@cindex grammar rules
+@cindex language definition
+
+Someday I hope to expand this to include a semi-formal description of
+Octave's language.
+
+@menu
+* Keywords::                    
+@end menu
+
+@node Keywords,  , Grammar, Grammar
+@section Keywords
+@cindex keywords
+
+The following identifiers are keywords, and may not be used as variable
+or function names:
+
+@example
+@group
+all_va_args             endwhile
+break                   for
+catch                   function
+continue                global
+else                    gplot
+elseif                  gsplot
+end                     if
+end_try_catch           return
+end_unwind_protect      try
+endfor                  unwind_protect
+endfunction             unwind_protect_cleanup
+endif                   while
+@end group
+@end example
+
+The following command-like functions are also reserved, and may not be
+used as variable or function names:
+
+@example
+@group
+casesen       echo          load          show
+cd            edit_history  ls            type
+chdir         format        more          which
+clear         help          run_history   who
+diary         history       save          whos
+dir           hold          set
+@end group
+@end example
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/numbers.texi
@@ -0,0 +1,532 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Numeric Data Types, Strings, Data Types, Top
+@chapter Numeric Data Types
+@cindex numeric constant
+@cindex numeric value
+
+A @dfn{numeric constant} may be a scalar, a vector, or a matrix, and it
+may contain complex values.
+
+The simplest form of a numeric constant, a scalar, is a single number
+that can be an integer, a decimal fraction, a number in scientific
+(exponential) notation, or a complex number.  Note that all numeric
+constants are represented within Octave in double-precision floating
+point format (complex constants are stored as pairs of double-precision
+floating point values).  Here are some examples of real-valued numeric
+constants, which all have the same value:
+
+@example
+@group
+105
+1.05e+2
+1050e-1
+@end group
+@end example
+
+To specify complex constants, you can write an expression of the form
+
+@example
+@group
+3 + 4i
+3.0 + 4.0i
+0.3e1 + 40e-1i
+@end group
+@end example
+
+all of which are equivalent.  The letter @samp{i} in the previous example
+stands for the pure imaginary constant, defined as
+@iftex
+@tex
+  $\sqrt{-1}$.
+@end tex
+@end iftex
+@ifinfo
+  @code{sqrt (-1)}.
+@end ifinfo
+
+For Octave to recognize a value as the imaginary part of a complex
+constant, a space must not appear between the number and the @samp{i}.
+If it does, Octave will print an error message, like this:
+
+@example
+@group
+octave:13> 3 + 4 i
+
+parse error:
+
+  3 + 4 i
+        ^
+@end group
+@end example
+
+You may also use @samp{j}, @samp{I}, or @samp{J} in place of the
+@samp{i} above.  All four forms are equivalent.
+
+@menu
+* Matrices::                    
+* Ranges::                      
+* Predicates for Numeric Objects::  
+@end menu
+
+@node Matrices, Ranges, Numeric Data Types, Numeric Data Types
+@section Matrices
+@cindex matrices
+
+@opindex [
+@opindex ]
+@opindex ;
+@opindex ,
+
+It is easy to define a matrix of values in Octave.  The size of the
+matrix is determined automatically, so it is not necessary to explicitly
+state the dimensions.  The expression
+
+@example
+a = [1, 2; 3, 4]
+@end example
+
+@noindent
+results in the matrix
+
+@iftex
+@tex
+$$ a = \left[ \matrix{ 1 & 2 \cr 3 & 4 } \right] $$
+@end tex
+@end iftex
+@ifinfo
+@example
+@group
+
+        /      \
+        | 1  2 |
+  a  =  |      |
+        | 3  4 |
+        \      /
+
+@end group
+@end example
+@end ifinfo
+
+Elements of a matrix may be arbitrary expressions, provided that the
+dimensions all make sense when combining the various pieces.  For
+example, given the above matrix, the expression
+
+@example
+[ a, a ]
+@end example
+
+@noindent
+produces the matrix
+
+@example
+@group
+ans =
+
+  1  2  1  2
+  3  4  3  4
+@end group
+@end example
+
+@noindent
+but the expression
+
+@example
+[ a, 1 ]
+@end example
+
+@noindent
+produces the error
+
+@example
+error: number of rows must match near line 13, column 6
+@end example
+
+@noindent
+(assuming that this expression was entered as the first thing on line
+13, of course).
+
+Inside the square brackets that delimit a matrix expression, Octave
+looks at the surrounding context to determine whether spaces and newline
+characters should be converted into element and row separators, or
+simply ignored, so commands like
+
+@example
+[ linspace (1, 2) ]
+@end example
+
+@noindent
+and
+
+@example
+@group
+a = [ 1 2
+      3 4 ]
+@end group
+@end example
+
+@noindent
+will work.  However, some possible sources of confusion remain.  For
+example, in the expression
+
+@example
+[ 1 - 1 ]
+@end example
+
+@noindent
+the @samp{-} is treated as a binary operator and the result is the
+scalar 0, but in the expression
+
+@example
+[ 1 -1 ]
+@end example
+
+@noindent
+the @samp{-} is treated as a unary operator and the result is the
+vector @code{[ 1 -1 ]}.
+
+Given @code{a = 1}, the expression
+
+@example
+[ 1 a' ]
+@end example
+
+@noindent
+results in the single quote character @samp{'} being treated as a
+transpose operator and the result is the vector @code{[ 1 1 ]}, but the
+expression
+
+@example
+[ 1 a ' ]
+@end example
+
+@noindent
+produces the error message
+
+@example
+error: unterminated string constant
+@end example
+
+@noindent
+because to not do so would make it impossible to correctly parse the
+valid expression
+
+@example
+[ a 'foo' ]
+@end example
+
+For clarity, it is probably best to always use commas and semicolons to
+separate matrix elements and rows.  It is possible to enforce this style
+by setting the built-in variable @code{whitespace_in_literal_matrix} to
+@code{"ignore"}.
+
+@defvr {Built-in Variable} whitespace_in_literal_matrix
+This variable allows some control over how Octave decides to convert
+spaces to commas and semicolons in matrix expressions like
+@samp{[m (1)]} or
+
+@example
+[ 1, 2,
+  3, 4 ]
+@end example
+
+If the value of @code{whitespace_in_literal_matrix} is @code{"ignore"},
+Octave will never insert a comma or a semicolon in a literal matrix
+list.  For example, the expression @samp{[1 2]} will result in an error
+instead of being treated the same as @samp{[1, 2]}, and the expression
+
+@example
+[ 1, 2,
+  3, 4 ]
+@end example
+
+@noindent
+will result in the vector [1 2 3 4] instead of a matrix.
+
+If the value of @code{whitespace_in_literal_matrix} is @code{"traditional"},
+Octave will convert spaces to a comma between identifiers and @samp{(}.  For
+example, given the matrix
+
+@example
+m = [3 2]
+@end example
+
+@noindent
+the expression
+
+@example
+[m (1)]
+@end example
+
+@noindent
+will be parsed as
+
+@example
+[m, (1)]
+@end example
+
+@noindent
+and will result in
+
+@example
+[3 2 1]
+@end example
+
+@noindent
+and the expression
+
+@example
+[ 1, 2,
+  3, 4 ]
+@end example
+
+@noindent
+will result in a matrix because the newline character is converted to a
+semicolon (row separator) even though there is a comma at the end of the
+first line (trailing commas or semicolons are ignored).  This is
+apparently how @sc{Matlab} behaves.
+
+Any other value for @code{whitespace_in_literal_matrix} results in behavior
+that is the same as traditional, except that Octave does not
+convert spaces to a comma between identifiers and @samp{(}.  For
+example, the expression
+
+@example
+[m (1)]
+@end example
+
+will produce @samp{3}.  This is the way Octave has always behaved.
+@end defvr
+
+When you type a matrix or the name of a variable whose value is a
+matrix, Octave responds by printing the matrix in with neatly aligned
+rows and columns.  If the rows of the matrix are too large to fit on the
+screen, Octave splits the matrix and displays a header before each
+section to indicate which columns are being displayed.
+
+@noindent
+You can use the following variables to control the format of the output.
+
+@defvr {Built-in Variable} output_max_field_width
+This variable specifies the maximum width of a numeric output field.
+The default value is 10.
+@end defvr
+
+@defvr {Built-in Variable} output_precision
+This variable specifies the minimum number of significant figures to
+display for numeric output.  The default value is 5.
+@end defvr
+
+It is possible to achieve a wide range of output styles by using
+different values of @code{output_precision} and
+@code{output_max_field_width}.  Reasonable combinations can be set using
+the @code{format} function.  @xref{Basic Input and Output}.
+
+@defvr {Built-in Variable} split_long_rows
+For large matrices, Octave may not be able to display all the columns of
+a given row on one line of your screen.  This can result in missing
+information or output that is nearly impossible to decipher, depending
+on whether your terminal truncates or wraps long lines.
+
+If the value of @code{split_long_rows} is nonzero, Octave will display
+the matrix in a series of smaller pieces, each of which can fit within
+the limits of your terminal width.  Each set of rows is labeled so that
+you can easily see which columns are currently being displayed.
+For example:
+
+@smallexample
+@group
+octave:13> rand (2,10)
+ans =
+
+ Columns 1 through 6:
+
+  0.75883  0.93290  0.40064  0.43818  0.94958  0.16467
+  0.75697  0.51942  0.40031  0.61784  0.92309  0.40201
+
+ Columns 7 through 10:
+
+  0.90174  0.11854  0.72313  0.73326
+  0.44672  0.94303  0.56564  0.82150
+@end group
+@end smallexample
+
+@noindent
+The default value of @code{split_long_rows} is nonzero.
+@end defvr
+
+@menu
+* Empty Matrices::              
+@end menu
+
+@node Empty Matrices,  , Matrices, Matrices
+@subsection Empty Matrices
+
+A matrix may have one or both dimensions zero, and operations on empty
+matrices are handled as described by Carl de Boor in @cite{An Empty
+Exercise}, SIGNUM, Volume 25, pages 2--6, 1990 and C. N. Nett and W. M.
+Haddad, in @cite{A System-Theoretic Appropriate Realization of the Empty
+Matrix Concept}, IEEE Transactions on Automatic Control, Volume 38,
+Number 5, May 1993.  Briefly, given a scalar @code{s}, and an @var{m} by
+@var{n} matrix @code{M(mxn)}, and an @var{m} by @var{n} empty matrix
+@code{[](mxn)} (with either one or both dimensions equal to zero), the
+following are true:
+
+@example
+@group
+s * [](mxn) = [](mxn) * s = [](mxn)
+
+    [](mxn) + [](mxn) = [](mxn)
+
+    [](0xm) *  M(mxn) = [](0xn)
+
+     M(mxn) * [](nx0) = [](mx0)
+
+    [](mx0) * [](0xn) =  0(mxn)
+@end group
+@end example
+
+By default, dimensions of the empty matrix are printed along with the
+empty matrix symbol, @samp{[]}.  For example:
+
+@example
+@group
+octave:13> zeros (3, 0)
+ans = 
+
+[](3x0)
+@end group
+@end example
+
+The built-in variable @code{print_empty_dimensions} controls this
+behavior.
+
+@defvr {Built-in Variable} print_empty_dimensions
+If the value of @code{print_empty_dimensions} is nonzero, the
+dimensions of empty matrices are printed along with the empty matrix
+symbol, @samp{[]}.  For example, the expression
+
+@example
+zeros (3, 0)
+@end example
+
+@noindent
+will print
+
+@example
+ans =
+
+[](3x0)
+@end example
+@end defvr
+
+Empty matrices may also be used in assignment statements as a convenient
+way to delete rows or columns of matrices.
+@xref{Assignment Ops, ,Assignment Expressions}.
+
+Octave will normally issue a warning if it finds an empty matrix in the
+list of elements that make up another matrix.  You can use the variable
+@code{empty_list_elements_ok} to suppress the warning or to treat it as
+an error.
+
+@defvr {Built-in Variable} empty_list_elements_ok
+This variable controls whether Octave ignores empty matrices in a matrix
+list.
+
+For example, if the value of @code{empty_list_elements_ok} is
+nonzero, Octave will ignore the empty matrices in the expression
+
+@example
+a = [1, [], 3, [], 5]
+@end example
+
+@noindent
+and the variable @samp{a} will be assigned the value @samp{[ 1 3 5 ]}.
+
+The default value is @code{"warn"}.
+@end defvr
+
+When Octave parses a matrix expression, it examines the elements of the
+list to determine whether they are all constants.  If they are, it
+replaces the list with a single matrix constant.
+
+@defvr {Built-in Variable} propagate_empty_matrices
+If the value of @code{propagate_empty_matrices} is nonzero,
+functions like @code{inverse} and @code{svd} will return an empty matrix
+if they are given one as an argument.  The default value is 1.
+@end defvr
+
+@node Ranges, Predicates for Numeric Objects, Matrices, Numeric Data Types
+@section Ranges
+@cindex range expressions
+@cindex expression, range
+
+@opindex :
+
+A @dfn{range} is a convenient way to write a row vector with evenly
+spaced elements.  A range expression is defined by the value of the first
+element in the range, an optional value for the increment between
+elements, and a maximum value which the elements of the range will not
+exceed.  The base, increment, and limit are separated by colons (the
+@samp{:} character) and may contain any arithmetic expressions and
+function calls.  If the increment is omitted, it is assumed to be 1.
+For example, the range
+
+@example
+1 : 5
+@end example
+
+@noindent
+defines the set of values @samp{[ 1 2 3 4 5 ]}, and the range
+
+@example
+1 : 3 : 5
+@end example
+
+@noindent
+defines the set of values @samp{[ 1 4 ]}.
+
+Although a range constant specifies a row vector, Octave does @emph{not}
+convert range constants to vectors unless it is necessary to do so.
+This allows you to write a constant like @samp{1 : 10000} without using
+80,000 bytes of storage on a typical 32-bit workstation.
+
+Note that the upper (or lower, if the increment is negative) bound on
+the range is not always included in the set of values, and that ranges
+defined by floating point values can produce surprising results because
+Octave uses floating point arithmetic to compute the values in the
+range.  If it is important to include the endpoints of a range and the
+number of elements is known, you should use the @code{linspace} function
+instead (@pxref{Special Utility Matrices}).
+
+When Octave parses a range expression, it examines the elements of the
+expression to determine whether they are all constants.  If they are, it
+replaces the range expression with a single range constant.
+
+@node Predicates for Numeric Objects,  , Ranges, Numeric Data Types
+@section Predicates for Numeric Objects
+
+@deftypefn {Function File} {} is_matrix (@var{a})
+Return 1 if @var{a} is a matrix.  Otherwise, return 0.
+@end deftypefn
+
+@deftypefn {Function File} {} is_vector (@var{a})
+Return 1 if @var{a} is a vector.  Otherwise, return 0.
+@end deftypefn
+
+@deftypefn {Function File} {} is_scalar (@var{a})
+Return 1 if @var{a} is a scalar.  Otherwise, return 0.
+@end deftypefn
+
+@deftypefn {Function File} {} is_square (@var{x})
+If @var{x} is a square matrix, then return the dimension of @var{x}.
+Otherwise, return 0.
+@end deftypefn
+
+@deftypefn {Function File} {} is_symmetric (@var{x}, @var{tol})
+If @var{x} is symmetric within the tolerance specified by @var{tol}, 
+then return the dimension of @var{x}.  Otherwise, return 0.  If
+@var{tol} is omitted, use a tolerance equal to the machine precision.
+@end deftypefn
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/struct.texi
@@ -0,0 +1,201 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Data Structures, Variables, Strings, Top
+@chapter Data Structures
+@cindex structures
+@cindex data structures
+
+Octave includes support for organizing data in structures.  The current
+implementation uses an associative array with indices limited to
+strings, but the syntax is more like C-style structures.  Here are some
+examples of using data structures in Octave.
+
+Elements of structures can be of any value type.  For example, the three
+expressions
+
+@example
+@group
+x.a = 1
+x.b = [1, 2; 3, 4]
+x.c = "string"
+@end group
+@end example
+
+@noindent
+create a structure with three elements.  To print the value of the
+structure, you can type its name, just as for any other variable:
+
+@example
+@group
+octave:2> x
+x =
+@{
+  a = 1
+  b =
+
+    1  2
+    3  4
+
+  c = string
+@}
+@end group
+@end example
+
+@noindent
+Note that Octave may print the elements in any order.
+
+Structures may be copied.
+
+@example
+@group
+octave:1> y = x
+y =
+@{
+  a = 1
+  b =
+
+    1  2
+    3  4
+
+  c = string
+@}
+@end group
+@end example
+
+Since structures are themselves values, structure elements may reference
+other structures.  The following statements change the value of the
+element @code{b} of the structure @code{x} to be a data structure
+containing the single element @code{d}, which has a value of 3.
+
+@example
+@group
+octave:1> x.b.d = 3
+x.b.d = 3
+octave:2> x.b
+ans =
+@{
+  d = 3
+@}
+octave:3> x
+x =
+@{
+  a = 1
+  b =
+  @{
+    d = 3
+  @}
+
+  c = string
+@}
+@end group
+@end example
+
+Note that when Octave prints the value of a structure that contains
+other structures, only a few levels are displayed.  For example,
+
+@example
+@group
+octave:1> a.b.c.d.e = 1;
+octave:2> a
+a =
+@{
+  b =
+  @{
+    c = <structure>
+  @}
+@}
+@end group
+@end example
+
+@noindent
+This prevents long and confusing output from large deeply nested
+structures.
+
+@defvr {Built-in Variable} struct_levels_to_print
+You can tell Octave how many structure levels to display by setting the
+built-in variable @code{struct_levels_to_print}.  The default value is 2.
+@end defvr
+
+Functions can return structures.  For example, the following function
+separates the real and complex parts of a matrix and stores them in two
+elements of the same structure variable.
+
+@example
+@group
+octave:1> function y = f (x)
+> y.re = real (x);
+> y.im = imag (x);
+> endfunction
+@end group
+@end example
+
+When called with a complex-valued argument, @code{f} returns the data
+structure containing the real and imaginary parts of the original
+function argument.
+
+@example
+@group
+octave:2> f (rand (3) + rand (3) * I);
+ans =
+@{
+  im =
+
+    0.26475  0.14828
+    0.18436  0.83669
+
+  re =
+
+    0.040239  0.242160
+    0.238081  0.402523
+@}
+@end group
+@end example
+
+Function return lists can include structure elements, and they may be
+indexed like any other variable.  For example,
+
+@example
+@group
+octave:1> [ x.u, x.s(2:3,2:3), x.v ] = svd ([1, 2; 3, 4])
+x.u =
+
+  -0.40455  -0.91451
+  -0.91451   0.40455
+
+x.s =
+
+  0.00000  0.00000  0.00000
+  0.00000  5.46499  0.00000
+  0.00000  0.00000  0.36597
+
+x.v =
+
+  -0.57605   0.81742
+  -0.81742  -0.57605
+@end group
+@end example
+
+It is also possible to cycle through all the elements of a structure in
+a loop, using a special form of the @code{for} statement
+(@pxref{The for Statement})
+
+The following functions are available to give you information about
+structures.
+
+@deftypefn {Built-in Function} {} is_struct (@var{expr})
+Returns 1 if the value of the expression @var{expr} is a structure.
+@end deftypefn
+
+@deftypefn {Built-in Function} {} struct_contains (@var{expr}, @var{name})
+This function returns 1 if the expression @var{expr} is a structure and it
+includes an element named @var{name}.  The first argument must be a
+structure and the second must be a string.
+@end deftypefn
+
+@deftypefn {Built-in Function} {} struct_elements (@var{expr})
+If the expression @var{expr} is a structure, this function returns a
+list of strings naming the elements of the structure.  It is an error to
+call @code{struct_elements} with an argument that is not a structure.
+@end deftypefn
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/tips.texi
@@ -0,0 +1,355 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Tips, Trouble, System Utilities, Top
+@appendix Tips and Standards
+@cindex tips
+@cindex standards of coding style
+@cindex coding standards
+
+This chapter describes no additional features of Octave.  Instead it
+gives advice on making effective use of the features described in the
+previous chapters.
+
+@menu
+* Style Tips::                  Writing clean and robust programs.
+* Coding Tips::                 Making code run faster.
+* Documentation Tips::          Writing readable documentation strings.
+* Comment Tips::                Conventions for writing comments.
+* Function Headers::            Standard headers for functions.
+@end menu
+
+@node Style Tips, Coding Tips, Tips, Tips
+@section Writing Clean Octave Programs
+
+Here are some tips for avoiding common errors in writing Octave code
+intended for widespread use:
+
+@itemize @bullet
+@item
+Since all global variables share the same name space, and all functions
+share another name space, you should choose a short word to distinguish
+your program from other Octave programs.  Then take care to begin the
+names of all global variables, constants, and functions with the chosen
+prefix.  This helps avoid name conflicts.
+
+If you write a function that you think ought to be added to Octave under
+a certain name, such as @code{twiddle-matrix}, don't call it by that name
+in your program.  Call it @code{mylib-twiddle-matrix} in your program,
+and send mail to @samp{bug-octave@@bevo.che.wisc.edu} suggesting that it
+be added to Octave.  If and when it is, the name can be changed easily
+enough.
+
+If one prefix is insufficient, your package may use two or three
+alternative common prefixes, so long as they make sense.
+
+Separate the prefix from the rest of the symbol name with an underscore
+@samp{_}.  This will be consistent with Octave itself and with most
+Octave programs.
+
+@item
+When you encounter an error condition, call the function @code{error}
+(or @code{usage}).  The function @code{error} does not return.
+@xref{Errors}.
+
+@item
+Please put a copyright notice on the file if you give copies to anyone.
+Use the same lines that appear at the top of the function files
+distributed with Octave.  If you have not signed papers to assign the
+copyright to anyone else, then place your name in the copyright notice.
+@end itemize
+
+@node Coding Tips, Documentation Tips, Style Tips, Tips
+@section Tips for Making Code Run Faster.
+@cindex execution speed
+@cindex speedups
+
+Here are some ways of improving the execution speed of Octave programs.
+
+@itemize @bullet
+@item
+Avoid looping wherever possible.
+
+@item
+Use iteration rather than recursion whenever possible.
+Function calls are slow in Octave.
+
+@item
+Avoid resizing matrices unnecessarily.  When building a single result
+matrix from a series of calculations, set the size of the result matrix
+first, then insert values into it.  Write
+
+@example
+@group
+result = zeros (big_n, big_m)
+for i = over:and_over
+  r1 = @dots{}
+  r2 = @dots{}
+  result (r1, r2) = new_value ();
+endfor
+@end group
+@end example
+
+@noindent
+instead of
+
+@example
+@group
+result = [];
+for i = ever:and_ever
+  result = [ result, new_value() ];
+endfor
+@end group
+@end example
+
+@item
+Avoid calling @code{eval} or @code{feval} whenever possible, because
+they require Octave to parse input or look up the name of a function in
+the symbol table.
+
+If you are using @code{eval} as an exception handling mechanism and not
+because you need to execute some arbitrary text, use the @code{try}
+statement instead.  @xref{The try Statement}.
+@end itemize
+
+@node Documentation Tips, Comment Tips, Coding Tips, Tips
+@section Tips for Documentation Strings
+
+Here are some tips for the writing of documentation strings.
+
+@itemize @bullet
+@item
+Every command, function, or variable intended for users to know about
+should have a documentation string.
+
+@item
+An internal variable or subroutine of an Octave program might as well have
+a documentation string.
+
+@item
+The first line of the documentation string should consist of one or two
+complete sentences that stand on their own as a summary.
+
+The documentation string can have additional lines that expand on the
+details of how to use the function or variable.  The additional lines
+should also be made up of complete sentences.
+
+@item
+For consistency, phrase the verb in the first sentence of a
+documentation string as an infinitive with ``to'' omitted.  For
+instance, use ``Return the frob of A and B.'' in preference to ``Returns
+the frob of A and B@.''  Usually it looks good to do likewise for the
+rest of the first paragraph.  Subsequent paragraphs usually look better
+if they have proper subjects.
+
+@item
+Write documentation strings in the active voice, not the passive, and in
+the present tense, not the future.  For instance, use ``Return a list
+containing A and B.'' instead of ``A list containing A and B will be
+returned.''
+
+@item
+Avoid using the word ``cause'' (or its equivalents) unnecessarily.
+Instead of, ``Cause Octave to display text in boldface,'' write just
+``Display text in boldface.''
+
+@item
+Do not start or end a documentation string with whitespace.
+
+@item
+Format the documentation string so that it fits in an Emacs window on an
+80-column screen.  It is a good idea for most lines to be no wider than
+60 characters.
+
+However, rather than simply filling the entire documentation string, you
+can make it much more readable by choosing line breaks with care.
+Use blank lines between topics if the documentation string is long.
+ 
+@item
+@strong{Do not} indent subsequent lines of a documentation string so
+that the text is lined up in the source code with the text of the first
+line.  This looks nice in the source code, but looks bizarre when users
+view the documentation.  Remember that the indentation before the
+starting double-quote is not part of the string!
+
+@item
+The documentation string for a variable that is a yes-or-no flag should
+start with words such as ``Nonzero means@dots{}'', to make it clear that
+all nonzero values are equivalent and indicate explicitly what zero and
+nonzero mean.
+
+@item
+When a function's documentation string mentions the value of an argument
+of the function, use the argument name in capital letters as if it were
+a name for that value.  Thus, the documentation string of the operator
+@code{/} refers to its second argument as @samp{DIVISOR}, because the
+actual argument name is @code{divisor}.
+
+Also use all caps for meta-syntactic variables, such as when you show
+the decomposition of a list or vector into subunits, some of which may
+vary.
+@end itemize
+
+@node Comment Tips, Function Headers, Documentation Tips, Tips
+@section Tips on Writing Comments
+
+Here are the conventions to follow when writing comments.
+
+@table @samp
+@item #
+Comments that start with a single sharp-sign, @samp{#}, should all be
+aligned to the same column on the right of the source code.  Such
+comments usually explain how the code on the same line does its job.  In
+the Emacs mode for Octave, the @kbd{M-;} (@code{indent-for-comment})
+command automatically inserts such a @samp{#} in the right place, or
+aligns such a comment if it is already present.
+
+@item ##
+Comments that start with two semicolons, @samp{##}, should be aligned to
+the same level of indentation as the code.  Such comments usually
+describe the purpose of the following lines or the state of the program
+at that point.
+@end table
+
+@noindent
+The indentation commands of the Octave mode in Emacs, such as @kbd{M-;}
+(@code{indent-for-comment}) and @kbd{TAB} (@code{octave-indent-line})
+automatically indent comments according to these conventions,
+depending on the number of semicolons.  @xref{Comments,,
+Manipulating Comments, emacs, The GNU Emacs Manual}.
+
+@node Function Headers,  , Comment Tips, Tips
+@section Conventional Headers for Octave Functions
+@cindex header comments
+
+Octave has conventions for using special comments in function files
+to give information such as who wrote them.  This section explains these
+conventions.
+
+The top of the file should contain a copyright notice, followed by a
+block of comments that can be used as the help text for the function.
+Here is an example:
+
+@example
+## Copyright (C) 1996 John W. Eaton
+##
+## This file is part of Octave.
+##
+## Octave is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public
+## License as published by the Free Software Foundation;
+## either version 2, or (at your option) any later version.
+##
+## Octave is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied
+## warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+## PURPOSE.  See the GNU General Public License for more
+## details.
+##
+## You should have received a copy of the GNU General Public
+## License along with Octave; see the file COPYING.  If not,
+## write to the Free Software Foundation, 59 Temple Place -
+## Suite 330, Boston, MA 02111-1307, USA.
+
+## usage: [IN, OUT, PID] = popen2 (COMMAND, ARGS)
+##
+## Start a subprocess with two-way communication.  COMMAND
+## specifies the name of the command to start.  ARGS is an
+## array of strings containing options for COMMAND.  IN and
+## OUT are the file ids of the input and streams for the
+## subprocess, and PID is the process id of the subprocess,
+## or -1 if COMMAND could not be executed.
+##
+## Example:
+##
+##  [in, out, pid] = popen2 ("sort", "-nr");
+##  fputs (in, "these\nare\nsome\nstrings\n");
+##  fclose (in);
+##  while (isstr (s = fgets (out)))
+##    fputs (stdout, s);
+##  endwhile
+##  fclose (out);
+@end example
+
+Octave uses the first block of comments in a function file that do not
+appear to be a copyright notice as the help text for the file.  For
+Octave to recognize the first comment block as a copyright notice, it
+must match the regular expression
+
+@example
+^ Copyright (C).*\n\n This file is part of Octave.
+@end example
+
+@noindent
+or
+
+@example
+^ Copyright (C).*\n\n This program is free softwar
+@end example
+
+@noindent
+(after stripping the leading comment characters).  This is a fairly
+strict requirement, and may be relaxed somewhat in the future.
+
+After the copyright notice and help text come several @dfn{header
+comment} lines, each beginning with @samp{## @var{header-name}:}.  For
+example,
+
+@example
+@group
+## Author: jwe
+## Keywords: subprocesses input-output
+## Maintainer: jwe
+@end group
+@end example
+
+Here is a table of the conventional possibilities for @var{header-name}:
+
+@table @samp
+@item Author
+This line states the name and net address of at least the principal
+author of the library.
+
+@smallexample
+## Author: John W. Eaton <jwe@@bevo.che.wsic.edu>
+@end smallexample
+
+@item Maintainer
+This line should contain a single name/address as in the Author line, or
+an address only, or the string @samp{jwe}.  If there is no maintainer
+line, the person(s) in the Author field are presumed to be the
+maintainers.  The example above is mildly bogus because the maintainer
+line is redundant.
+
+The idea behind the @samp{Author} and @samp{Maintainer} lines is to make
+possible a function to ``send mail to the maintainer'' without
+having to mine the name out by hand.
+
+Be sure to surround the network address with @samp{<@dots{}>} if
+you include the person's full name as well as the network address.
+
+@item Created
+This optional line gives the original creation date of the
+file.  For historical interest only.
+
+@item Version
+If you wish to record version numbers for the individual Octave program,
+put them in this line.
+
+@item Adapted-By
+In this header line, place the name of the person who adapted the
+library for installation (to make it fit the style conventions, for
+example).
+
+@item Keywords
+This line lists keywords.  Eventually, it will be used by an apropos
+command to allow people will find your package when they're looking for
+things by topic area.  To separate the keywords, you can use spaces,
+commas, or both.
+@end table
+
+Just about every Octave function ought to have the @samp{Author} and
+@samp{Keywords} header comment lines.  Use the others if they are
+appropriate.  You can also put in header lines with other header
+names---they have no standard meanings, so they can't do any harm.
new file mode 100644
--- /dev/null
+++ b/doc/interpreter/var.texi
@@ -0,0 +1,555 @@
+@c Copyright (C) 1996, 1997 John W. Eaton
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Variables, Expressions, Data Structures, Top
+@chapter Variables
+@cindex variables, user-defined
+@cindex user-defined variables
+
+Variables let you give names to values and refer to them later.  You have
+already seen variables in many of the examples.  The name of a variable
+must be a sequence of letters, digits and underscores, but it may not begin
+with a digit.  Octave does not enforce a limit on the length of variable
+names, but it is seldom useful to have variables with names longer than
+about 30 characters.  The following are all valid variable names
+
+@cindex job hunting
+@cindex getting a good job
+@cindex flying high and fast
+@example
+@group
+x
+x15
+__foo_bar_baz__
+fucnrdthsucngtagdjb
+@end group
+@end example
+
+@noindent
+However, names like @code{__foo_bar_baz__} that begin and end with two
+underscores are understood to be reserved for internal use by Octave.
+You should not use them in code you write, except to access Octave's
+documented internal variables and built-in symbolic constants.
+
+Case is significant in variable names.  The symbols @code{a} and
+@code{A} are distinct variables.
+
+A variable name is a valid expression by itself.  It represents the
+variable's current value.  Variables are given new values with
+@dfn{assignment operators} and @dfn{increment operators}.
+@xref{Assignment Ops, ,Assignment Expressions}.
+
+A number of variables have special built-in meanings.  For example,
+@code{PWD} holds the current working directory, and @code{pi} names the
+ratio of the circumference of a circle to its diameter. @xref{Summary of
+Built-in Variables}, for a list of all the predefined variables.  Some
+of these built-in symbols are constants and may not be changed.  Others
+can be used and assigned just like all other variables, but their values
+are also used or changed automatically by Octave.
+
+Variables in Octave do not have fixed types, so it is possible to first
+store a numeric value in a variable and then to later use the same name
+to hold a string value in the same program.  Variables may not be used
+before they have been given a value.  Doing so results in an error.
+
+@menu
+* Global Variables::            
+* Status of Variables::         
+* Summary of Built-in Variables::  
+* Defaults from the Environment::  
+@end menu
+
+@node Global Variables, Status of Variables, Variables, Variables
+@section Global Variables
+@cindex global variables
+@cindex @code{global} statement
+@cindex variables, global
+
+A variable that has been declared @dfn{global} may be accessed from
+within a function body without having to pass it as a formal parameter.
+
+A variable may be declared global using a @code{global} declaration
+statement.  The following statements are all global declarations.
+
+@example
+@group
+global a
+global b = 2
+global c = 3, d, e = 5
+@end group
+@end example
+
+It is necessary declare a variable as global within a function body in
+order to access it.  For example,
+
+@example
+@group
+global x
+function f ()
+x = 1;
+endfunction
+f ()
+@end group
+@end example
+
+@noindent
+does @emph{not} set the value of the global variable @samp{x} to 1.  In
+order to change the value of the global variable @samp{x}, you must also
+declare it to be global within the function body, like this
+
+@example
+@group
+function f ()
+  global x;
+  x = 1;
+endfunction
+@end group
+@end example
+
+Passing a global variable in a function parameter list will
+make a local copy and not modify the global value.  For example, given
+the function
+
+@example
+@group
+function f (x)
+  x = 0
+endfunction
+@end group
+@end example
+
+@noindent
+and the definition of @samp{x} as a global variable at the top level,
+
+@example
+global x = 13
+@end example
+
+@noindent
+the expression
+
+@example
+f (x)
+@end example
+
+@noindent
+will display the value of @samp{x} from inside the function as @samp{0},
+but the value of @samp{x} at the top level remains unchanged, because
+the function works with a @emph{copy} of its argument.
+
+@defvr {Built-in Variable} warn_comma_in_global_decl
+If the value of @code{warn_comma_in_global_decl} is nonzero, a
+warning is issued for statements like
+
+@example
+global a = 1, b
+@end example
+
+@noindent
+which makes the variables @samp{a} and @samp{b} global and assigns the
+value 1 to the variable @samp{a}, because in this context, the comma is
+not interpreted as a statement separator.
+
+The default value of @code{warn_comma_in_global_decl} is nonzero.
+@end defvr
+
+@deftypefn {Built-in Function} {} is_global (@var{name})
+Return 1 if @var{name} is globally visible.  Otherwise, return 0.  For
+example,
+
+@example
+@group
+global x
+is_global ("x")
+     @result{} 1
+@end group
+@end example
+@end deftypefn
+
+@node Status of Variables, Summary of Built-in Variables, Global Variables, Variables
+@section Status of Variables
+
+@deffn {Command} clear options pattern @dots{}
+Delete the names matching the given patterns from the symbol table.  The
+pattern may contain the following special characters:
+@table @code
+@item ?
+Match any single character.
+
+@item *
+Match zero or more characters.
+
+@item [ @var{list} ]
+Match the list of characters specified by @var{list}.  If the first
+character is @code{!} or @code{^}, match all characters except those
+specified by @var{list}.  For example, the pattern @samp{[a-zA-Z]} will
+match all lower and upper case alphabetic characters. 
+@end table
+
+For example, the command
+
+@example
+clear foo b*r
+@end example
+
+@noindent
+clears the name @code{foo} and all names that begin with the letter
+@code{b} and end with the letter @code{r}.
+
+If @code{clear} is called without any arguments, all user-defined
+variables (local and global) are cleared from the symbol table.  If
+@code{clear} is called with at least one argument, only the visible
+names matching the arguments are cleared.  For example, suppose you have
+defined a function @code{foo}, and then hidden it by performing the
+assignment @code{foo = 2}.  Executing the command @samp{clear foo} once
+will clear the variable definition and restore the definition of
+@code{foo} as a function.  Executing @samp{clear foo} a second time will
+clear the function definition.
+
+This command may not be used within a function body.
+@end deffn
+
+@deffn {Command} who options pattern @dots{}
+@deffnx {Command} whos options pattern @dots{}
+List currently defined symbols matching the given patterns.  The
+following are valid options.  They may be shortened to one character but
+may not be combined.
+
+@table @code
+@item -all
+List all currently defined symbols.
+
+@item -builtins
+List built-in variables and functions.  This includes all currently
+compiled function files, but does not include all function files that
+are in the @code{LOADPATH}.
+
+@item -functions
+List user-defined functions.
+
+@item -long
+Print a long listing including the type and dimensions of any symbols.
+The symbols in the first column of output indicate whether it is
+possible to redefine the symbol, and whether it is possible for it to be
+cleared.
+
+@item -variables
+List user-defined variables.
+@end table
+
+Valid patterns are the same as described for the @code{clear} command
+above.  If no patterns are supplied, all symbols from the given category
+are listed.  By default, only user defined functions and variables
+visible in the local scope are displayed.
+
+The command @code{whos} is equivalent to @code{who -long}.
+@end deffn
+
+@deftypefn {Built-in Function} {} exist (@var{name})
+Return 1 if the name exists as a variable, and 2 if the name (after
+appending @samp{.m}) is a function file in the path.  Otherwise, return
+0.
+@end deftypefn
+
+@deftypefn {Built-in Function} {} document (@var{symbol}, @var{text})
+Set the documentation string for @var{symbol} to @var{text}.
+@end deftypefn
+
+@deffn {Command} type options name @dots{}
+Display the definition of each @var{name} that refers to a function.
+
+Normally also displays if each @var{name} is user-defined or builtin;
+the @code{-q} option suppresses this behaviour.
+
+Currently, Octave can only display functions that can be compiled
+cleanly, because it uses its internal representation of the function to
+recreate the program text.
+
+Comments are not displayed because Octave's parser currently discards
+them as it converts the text of a function file to its internal
+representation.  This problem may be fixed in a future release.
+@end deffn
+
+@deffn {Command} which name @dots{}
+Display the type of each @var{name}.  If @var{name} is defined from a
+function file, the full name of the file is also displayed.
+@end deffn
+
+@node Summary of Built-in Variables, Defaults from the Environment, Status of Variables, Variables
+@section Summary of Built-in Variables
+
+Here is a summary of all of Octave's built-in variables along with
+cross references to additional information and their default values.  In
+the following table @code{OCT_HOME} stands for the root directory where
+Octave is installed (for example, @file{@value{OCTAVEHOME}}, @code{VERSION}
+stands for the Octave version number (for example, @value{VERSION}, and
+@code{SYS} stands for the type of system for which Octave was compiled
+(for example, @code{@value{TARGETHOSTTYPE}}).
+
+@vtable @code
+@item EDITOR
+@xref{Commands For History}.
+
+Default value: @code{"vi"}.
+
+@item EXEC_PATH
+@xref{Controlling Subprocesses}.
+
+Default value: @code{":$PATH"}.
+
+@item INFO_FILE
+@xref{Getting Help}.
+
+Default value: @code{"OCT_HOME/info/octave.info"}.
+
+@item INFO_PROGRAM
+@xref{Getting Help}.
+
+Default value: @code{"OCT_HOME/libexec/octave/VERSION/exec/SYS/info"}.
+
+@item LOADPATH
+@xref{Function Files}.
+
+Default value: @code{".:OCT_HOME/lib/VERSION"}.
+
+@item PAGER
+@xref{Input and Output}.
+
+Default value: @code{"less", or "more"}.
+
+@item PS1
+@xref{Customizing the Prompt}.
+
+Default value: @code{"\s:\#> "}.
+
+@item PS2
+@xref{Customizing the Prompt}.
+
+Default value: @code{"> "}.
+
+@item PS4
+@xref{Customizing the Prompt}.
+
+Default value: @code{"+ "}.
+
+@item automatic_replot
+@xref{Two-Dimensional Plotting}.
+
+Default value: 0.
+
+@item beep_on_error
+@xref{Error Handling}.
+
+Default value: 0.
+
+@item completion_append_char
+@xref{Commands For Completion}.
+
+Default value: @code{" "}.
+
+@item default_return_value
+@xref{Multiple Return Values}.
+
+Default value: @code{[]}.
+
+@item do_fortran_indexing
+@xref{Index Expressions}.
+
+Default value: 0.
+
+@item define_all_return_values
+@xref{Multiple Return Values}.
+
+Default value: 0.
+
+@item empty_list_elements_ok
+@xref{Empty Matrices}.
+
+Default value: @code{"warn"}.
+
+@item gnuplot_binary
+@xref{Three-Dimensional Plotting}.
+
+Default value: @code{"gnuplot"}.
+
+@item history_file
+@xref{Commands For History}.
+
+Default value: @code{"~/.octave_hist"}.
+
+@item history_size
+@xref{Commands For History}.
+
+Default value: 1024.
+
+@item ignore_function_time_stamp
+@xref{Function Files}.
+
+Default value: @code{"system"}.
+
+@item implicit_str_to_num_ok
+@xref{String Conversions}.
+
+Default value: 0.
+
+@item ok_to_lose_imaginary_part
+@xref{Special Utility Matrices}.
+
+Default value: @code{"warn"}.
+
+@item output_max_field_width
+@xref{Matrices}.
+
+Default value: 10.
+
+@item output_precision
+@xref{Matrices}.
+
+Default value: 5.
+
+@item page_screen_output
+@xref{Input and Output}.
+
+Default value: 1.
+
+@item prefer_column_vectors
+@xref{Index Expressions}.
+
+Default value: 0.
+
+@item prefer_zero_one_indexing
+@xref{Index Expressions}.
+
+Default value: 0.
+
+@item print_answer_id_name
+@xref{Terminal Output}.
+
+Default value: 1.
+
+@item print_empty_dimensions
+@xref{Empty Matrices}.
+
+Default value: 1.
+
+@item resize_on_range_error
+@xref{Index Expressions}.
+
+Default value: 1.
+
+@item return_last_computed_value
+@xref{Returning From a Function}.
+
+Default value: 0.
+
+@item save_precision
+@xref{Simple File I/O}.
+
+Default value: 17.
+
+@item saving_history
+@xref{Commands For History}.
+
+Default value: 1.
+
+@item silent_functions
+@xref{Defining Functions}.
+
+Default value: 0.
+
+@item split_long_rows
+@xref{Matrices}.
+
+Default value: 1.
+
+@item struct_levels_to_print
+@xref{Data Structures}.
+
+Default value: 2.
+
+@item suppress_verbose_help_message
+@xref{Getting Help}.
+
+Default value: 1.
+
+@item treat_neg_dim_as_zero
+@xref{Special Utility Matrices}.
+
+Default value: 0.
+
+@item warn_assign_as_truth_value
+@xref{The if Statement}.
+
+Default value: 1.
+
+@item warn_comma_in_global_decl
+@xref{Global Variables}.
+
+Default value: 1.
+
+@item warn_divide_by_zero
+@xref{Arithmetic Ops}.
+
+Default value: 1.
+
+@item warn_function_name_clash
+@xref{Function Files}.
+
+Default value: 1.
+
+@item whitespace_in_literal_matrix
+@xref{Matrices}.
+
+Default value: @code{""}.
+@end vtable
+
+
+@node Defaults from the Environment,  , Summary of Built-in Variables, Variables
+@section Defaults from the Environment
+
+Octave uses the values of the following environment variables to set the
+default values for the corresponding built-in variables.  In addition,
+the values from the environment may be overridden by command-line
+arguments.  @xref{Command Line Options}.
+
+@vtable @code
+@item EDITOR
+@xref{Commands For History}.
+
+Built-in variable: @code{EDITOR}.
+
+@item OCTAVE_EXEC_PATH        
+@xref{Controlling Subprocesses}.
+
+Built-in variable: @code{EXEC_PATH}.
+Command-line argument: @code{--exec-path}.
+
+@item OCTAVE_PATH
+@xref{Function Files}.
+
+Built-in variable: @code{LOADPATH}.
+Command-line argument: @code{--path}.
+
+@item OCTAVE_INFO_FILE
+@xref{Getting Help}.
+
+Built-in variable: @code{INFO_FILE}.
+Command-line argument: @code{--info-file}.
+
+@item OCTAVE_INFO_PROGRAM
+@xref{Getting Help}.
+
+Built-in variable: @code{INFO_PROGRAM}.
+Command-line argument: @code{--info-program}.
+
+@item OCTAVE_HISTSIZE
+@xref{Commands For History}.
+
+Built-in variable: @code{history_size}.
+
+@item OCTAVE_HISTFILE
+@xref{Commands For History}.
+
+Built-in variable: @code{history_file}.
+@end vtable