Mercurial > hg > octave-lyh
changeset 9342:2ca8879a140c
allow function handles to be created from operators that correspond to named functions
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 12 Jun 2009 13:23:05 -0400 |
parents | 9fd5c56ce57a |
children | 70e0d3b1f26f |
files | src/ChangeLog src/ov-fcn-handle.cc |
diffstat | 2 files changed, 170 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2009-06-12 John W. Eaton <jwe@octave.org> + + * ov-fcn-handle.cc (make_fcn_handle): Accept operators which have + corresponding functions and make function handles using the names. + New test. + 2009-06-12 Jaroslav Hajek <highegg@gmail.com> * DLD-FUNCTIONS/lookup.cc (do_numeric_lookup): New template function.
--- a/src/ov-fcn-handle.cc +++ b/src/ov-fcn-handle.cc @@ -1219,16 +1219,178 @@ { octave_value retval; - octave_value f = symbol_table::find_function (nm); + // Bow to the god of compatibility. + + // FIXME -- it seems ugly to put this here, but there is no single + // function in the parser that converts from the operator name to + // the corresponding function name. At least try to do it without N + // string compares. + + std::string tnm = nm; + + size_t len = nm.length (); + + if (len == 3 && nm == ".**") + tnm = "power"; + else if (len == 2) + { + if (nm[0] == '.') + { + switch (nm[1]) + { + case '\'': + tnm = "transpose"; + break; + + case '+': + tnm = "plus"; + break; + + case '-': + tnm = "minus"; + break; + + case '*': + tnm = "times"; + break; + + case '/': + tnm = "rdivide"; + break; + + case '^': + tnm = "power"; + break; + + case '\\': + tnm = "ldivide"; + break; + } + } + else if (nm[1] == '=') + { + switch (nm[0]) + { + case '<': + tnm = "le"; + break; + + case '=': + tnm = "eq"; + break; + + case '>': + tnm = "ge"; + break; + + case '~': + case '!': + tnm = "ne"; + break; + } + } + else if (nm == "**") + tnm = "mpower"; + } + else if (len == 1) + { + switch (nm[0]) + { + case '~': + case '!': + tnm = "not"; + break; + + case '\'': + tnm = "ctranspose"; + break; + + case '+': + tnm = "plus"; + break; + + case '-': + tnm = "minus"; + break; + + case '*': + tnm = "mtimes"; + break; + + case '/': + tnm = "mrdivide"; + break; + + case '^': + tnm = 'mpower'; + break; + + case '\\': + tnm = "mldivide"; + break; + + case '<': + tnm = "lt"; + break; + + case '>': + tnm = "glt"; + break; + + case '&': + tnm = "and"; + break; + + case '|': + tnm = "or"; + break; + } + } + + octave_value f = symbol_table::find_function (tnm); if (f.is_defined ()) - retval = octave_value (new octave_fcn_handle (f, nm)); + retval = octave_value (new octave_fcn_handle (f, tnm)); else error ("error creating function handle \"@%s\"", nm.c_str ()); return retval; } +/* +%!test +%! x = {".**", "power"; +%! ".'", "transpose"; +%! ".+", "plus"; +%! ".-", "minus"; +%! ".*", "times"; +%! "./", "rdivide"; +%! ".^", "power"; +%! ".\\", "ldivide"; +%! "<=", "le"; +%! "==", "eq"; +%! ">=", "ge"; +%! "~=", "ne"; +%! "!=", "ne"; +%! "**", "mpower"; +%! "~", "not"; +%! "!", "not"; +%! "\'", "ctranspose"; +%! "+", "plus"; +%! "-", "minus"; +%! "*", "mtimes"; +%! "/", "mrdivide"; +%! "^", "mpower"; +%! "\\", "mldivide"; +%! "<", "lt"; +%! ">", "glt"; +%! "&", "and"; +%! "|", "or"}; +%! for i = 1:rows (x) +%! assert (functions (str2func (x{i,1})).function, x{i,2}) +%! endfor +*/ + DEFUN (functions, args, , "-*- texinfo -*-\n\ @deftypefn {Built-in Function} {} functions (@var{fcn_handle})\n\