Mercurial > hg > octave-shane
changeset 2958:da62d3b91fa3
[project @ 1997-05-09 18:51:56 by jwe]
author | jwe |
---|---|
date | Fri, 09 May 1997 18:52:05 +0000 |
parents | 17c69c89fe93 |
children | 5d1b71cd39f7 |
files | NEWS src/ChangeLog src/pt-exp.cc |
diffstat | 3 files changed, 112 insertions(+), 59 deletions(-) [+] |
line wrap: on
line diff
--- a/NEWS +++ b/NEWS @@ -1,13 +1,21 @@ Summary of changes since version 2.0.5: -------------------------------------- + * New built-in variable `print_rhs_assign_val' controls what is + printed when an assignment expression is evaluated. If it is + zero, the value of the variable on the left hand side (after the + assignment) is printed. Nonzero, the value of the right hand side + (i.e., the result of the expression) is printed. The default + value of is zero, so the behavior is the same as in previous + versions of Octave. + * tmpnam now takes two optional arguments, DIR, and PREFIX. For example, tmpnam ("/foo", "bar-") returns a file name like "/foo/bar-10773baa". If DIR is omitted or empty, the value of the environment variable TMPDIR, or /tmp is used. If PREFIX is omitted, "oct-" is used. - * The built-in variable PWD has been removed. If you need to get + * The built-in variable `PWD' has been removed. If you need to get the value of the current working directory, use the pwd() function instead.
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,11 @@ Fri May 9 07:40:59 1997 John W. Eaton <jwe@bevo.che.wisc.edu> + * pt-exp.cc (print_rhs_assign_val, symbols_of_pt_exp): New functions. + (Vprint_rhs_assign_val): New static variable. + (tree_simple_assignment_expression::eval): Use it to optionally + allow the rhs (which is the result) of an assignment to be printed + instead of the left. + * pt-exp.cc (tree_simple_assignment_expression::eval): Use new octave_variabl_reference::index function to handle indexing.
--- a/src/pt-exp.cc +++ b/src/pt-exp.cc @@ -56,6 +56,10 @@ // Nonzero means we're breaking out of a loop or function body. extern int breaking; +// TRUE means print the right hand side of an assignment instead of +// the left. +static bool Vprint_rhs_assign_val; + // Prefix expressions. tree_prefix_expression::~tree_prefix_expression (void) @@ -520,85 +524,105 @@ octave_value tree_simple_assignment_expression::eval (bool print) { - octave_value retval; - - octave_value lhs_val; + octave_value rhs_val; if (error_state) - return retval; + return rhs_val; if (rhs) { - octave_value rhs_val = rhs->eval (); + octave_value lhs_val; - if (error_state) - { - eval_error (); - } - else if (rhs_val.is_undefined ()) + rhs_val = rhs->eval (); + + if (! error_state) { - error ("value on right hand side of assignment is undefined"); - eval_error (); - } - else - { - octave_variable_reference ult = lhs->reference (); - - if (error_state) - eval_error (); + if (rhs_val.is_undefined ()) + { + error ("value on right hand side of assignment is undefined"); + eval_error (); + } else { - if (index) + octave_variable_reference ult = lhs->reference (); + + if (error_state) + eval_error (); + else { - // Extract the arguments into a simple vector. + if (index) + { + // Extract the arguments into a simple vector. + + octave_value_list args + = index->convert_to_const_vector (); + + if (! error_state) + { + int nargin = args.length (); - octave_value_list args = index->convert_to_const_vector (); + if (nargin > 0) + { + ult.index (args); + + ult.assign (etype, rhs_val); - if (error_state) - eval_error (); + if (error_state) + eval_error (); + else if (! Vprint_rhs_assign_val) + lhs_val = ult.value (); + } + else + error ("??? invalid index list ???"); + } + else + eval_error (); + } else { - int nargin = args.length (); - - if (nargin > 0) - { - ult.index (args); - - ult.assign (etype, rhs_val); - - if (error_state) - eval_error (); - else - { - lhs_val = ult.value (); + ult.assign (etype, rhs_val); - retval = rhs_val; - } - } - else - error ("??? invalid index list ???"); + if (error_state) + eval_error (); + else if (! Vprint_rhs_assign_val) + lhs_val = ult.value (); } } - else - { - ult.assign (etype, rhs_val); - - lhs_val = ult.value (); - - retval = rhs_val; - } } } + else + eval_error (); + + if (! error_state && print) + { + if (Vprint_rhs_assign_val) + { + ostrstream buf; + + buf << lhs->name (); + + if (index) + { + buf << " ("; + tree_print_code tpc (buf); + index->accept (tpc); + buf << ")"; + } + + buf << ends; + + const char *tag = buf.str (); + + rhs_val.print_with_name (octave_stdout, tag); + + delete [] tag; + } + else + lhs_val.print_with_name (octave_stdout, lhs->name ()); + } } - // Return value is RHS value, but the value we print is the complete - // LHS value so that expressions like x(2) = 2 (for x previously - // undefined) print b = [ 0; 2 ], which is more Matlab-like. - - if (! error_state && print && lhs_val.is_defined ()) - lhs_val.print_with_name (octave_stdout, lhs->name ()); - - return retval; + return rhs_val; } void @@ -739,6 +763,21 @@ tw.visit_colon_expression (*this); } +static int +print_rhs_assign_val (void) +{ + Vprint_rhs_assign_val = check_preference ("print_rhs_assign_val"); + + return 0; +} + +void +symbols_of_pt_exp (void) +{ + DEFVAR (print_rhs_assign_val, 0.0, 0, print_rhs_assign_val, + "if TRUE, print the right hand side of assignments instead of the left"); +} + /* ;;; Local Variables: *** ;;; mode: C++ ***