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	Fri Jun 12 16:01:53 2009 +0200
+++ b/src/ChangeLog	Fri Jun 12 13:23:05 2009 -0400
@@ -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	Fri Jun 12 16:01:53 2009 +0200
+++ b/src/ov-fcn-handle.cc	Fri Jun 12 13:23:05 2009 -0400
@@ -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\