Mercurial > octave-libgccjit
diff doc/interpreter/eval.txi @ 3294:bfe1573bd2ae
[project @ 1999-10-19 10:06:07 by jwe]
author | jwe |
---|---|
date | Tue, 19 Oct 1999 10:08:42 +0000 |
parents | |
children | 86873384cd10 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/interpreter/eval.txi Tue Oct 19 10:08:42 1999 +0000 @@ -0,0 +1,116 @@ +@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 +@group +eval ("a = 13") + @print{} a = 13 + @result{} 13 +@end group +@end example + +In this case, the value of the evaluated expression is printed and it is +also returned 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 +eval ("a = 13;") + @result{} 13 +@end example + +In this example, the variable @code{a} has been given the value 13, but +the value of the expression is not printed. You can also turn off +automatic printing for all expressions executed by @code{eval} using the +variable @code{default_eval_print_flag}. +@end deftypefn + +@defvr {Built-in Variable} default_eval_print_flag +If the value of this variable is nonzero, Octave prints the results of +commands executed by @code{eval} that do not end with semicolons. If it +is zero, automatic printing is suppressed. The default value is 1. +@end defvr + +@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 +feval ("acos", -1) + @result{} 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 + +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 +@cindex Fordyce, A. P. +@findex newtroot +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. See @xref{Predicates for Numeric Objects}, for example, +for a list of predicates for numeric objects, and @xref{Status of +Variables}, for a description of the @code{exist} function.