Mercurial > octave
changeset 28457:41c5019f5dbf
maint: merge stable to default.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 11 Jun 2020 16:44:06 -0400 |
parents | f6a8f103786e (current diff) 53d8e7ca99c5 (diff) |
children | 565e7ed01b01 |
files | |
diffstat | 5 files changed, 153 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-fcn-handle.cc Thu Jun 11 17:13:52 2020 +0200 +++ b/libinterp/octave-value/ov-fcn-handle.cc Thu Jun 11 16:44:06 2020 -0400 @@ -1789,7 +1789,7 @@ std::ostringstream buf; print_raw (buf, true, 0); - m.setfield ("name", buf.str ()); + m.setfield ("function", buf.str ()); m.setfield ("type", type ()); m.setfield ("file", "");
--- a/scripts/legacy/@inline/vectorize.m Thu Jun 11 17:13:52 2020 +0200 +++ b/scripts/legacy/@inline/vectorize.m Thu Jun 11 16:44:06 2020 -0400 @@ -31,32 +31,6 @@ print_usage (); endif - new_expr = ""; - - expr = obj.expr; - len = length (expr); - i = 1; - - while (i <= len) - c = expr(i); - - if (c == "*" || c == "/" || c == "\\" || c == "^") - if (i > 1 && expr(i-1) != ".") - new_expr(end+1) = "."; - endif - - ## Special case for ** operator. - if (c == '*' && i < (len - 1) && expr(i+1) == '*') - new_expr(end+1) = "*"; - i++; - endif - endif - - new_expr(end+1) = c; - i++; - - endwhile - - fcn = inline (new_expr); + fcn = inline (__vectorize__ (obj.expr)); endfunction
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/legacy/__vectorize__.m Thu Jun 11 16:44:06 2020 -0400 @@ -0,0 +1,58 @@ +######################################################################## +## +## Copyright (C) 2020 The Octave Project Developers +## +## See the file COPYRIGHT.md in the top-level directory of this +## distribution or <https://octave.org/copyright/>. +## +## 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 3 of the License, 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, see +## <https://www.gnu.org/licenses/>. +## +######################################################################## + +## -*- texinfo -*- +## @deftypefn {} {} __vectorize__ (@var{expr}) +## Undocumented internal function. +## @end deftypefn + +function new_expr = __vectorize__ (expr); + + new_expr = ""; + + len = length (expr); + i = 1; + + while (i <= len) + c = expr(i); + + if (c == "*" || c == "/" || c == "\\" || c == "^") + if (i > 1 && expr(i-1) != ".") + new_expr(end+1) = "."; + endif + + ## Special case for ** operator. + if (c == '*' && i < (len - 1) && expr(i+1) == '*') + new_expr(end+1) = "*"; + i++; + endif + endif + + new_expr(end+1) = c; + i++; + + endwhile + +endfunction
--- a/scripts/legacy/module.mk Thu Jun 11 17:13:52 2020 +0200 +++ b/scripts/legacy/module.mk Thu Jun 11 16:44:06 2020 -0400 @@ -1,6 +1,7 @@ FCN_FILE_DIRS += %reldir% %canon_reldir%_FCN_FILES = \ + %reldir%/__vectorize__.m \ %reldir%/findstr.m \ %reldir%/flipdim.m \ %reldir%/genvarname.m \ @@ -10,7 +11,8 @@ %reldir%/setstr.m \ %reldir%/strmatch.m \ %reldir%/strread.m \ - %reldir%/textread.m + %reldir%/textread.m \ + %reldir%/vectorize.m ## include %reldir%/@inline/module.mk ## The include above fails because Automake cannot process the '@' character.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/legacy/vectorize.m Thu Jun 11 16:44:06 2020 -0400 @@ -0,0 +1,90 @@ +######################################################################## +## +## Copyright (C) 2020 The Octave Project Developers +## +## See the file COPYRIGHT.md in the top-level directory of this +## distribution or <https://octave.org/copyright/>. +## +## 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 3 of the License, 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, see +## <https://www.gnu.org/licenses/>. +## +######################################################################## + +## -*- texinfo -*- +## @deftypefn {} {} vectorize (@var{fun}) +## Create a vectorized version of the anonymous function or expression +## @var{fun} by replacing all occurrences of @code{*}, @code{/}, etc., +## with @code{.*}, @code{./}, etc. +## +## Note that the transformation is extremely simplistic. Use of this +## function is strongly discouraged. It may be removed from a future +## version of Octave. +## @end deftypefn + +## The following function was translated directly from the original C++ +## version. Yes, it will be slow, but its use is strongly discouraged +## anyway, and most expressions will probably be short. It may also be +## buggy. Well, don't use this function! + +function retval = vectorize (fun) + + if (nargin != 1) + print_usage (); + endif + + if (isa (fun, "function_handle")) + finfo = functions (fun); + if (! strcmp (finfo.type, "anonymous")) + error ("vectorize: FUN must be a string or anonymous function handle"); + endif + expr = finfo.function; + idx = index (expr, ")"); + args = expr(1:idx); + expr = expr(idx+1:end); + new_expr = __vectorize__ (expr); + retval = str2func ([args, new_expr]); + elseif (ischar (fun)) + retval = __vectorize__ (fun); + else + error ("vectorize: FUN must be a string or anonymous function handle"); + endif +endfunction + +%!assert (vectorize ("x.^2 + 1"), "x.^2 + 1") +%!test +%! fh = @(x) x.^2 + 1; +%! finfo = functions (vectorize (fh)); +%! assert (finfo.function, "@(x) x .^ 2 + 1"); + +%!assert (vectorize ("1e-3*y + 2e4*z"), "1e-3.*y + 2e4.*z") +%!test +%! fh = @(x, y, z) 1e-3*y + 2e4*z; +%! finfo = functions (vectorize (fh)); +%! assert (finfo.function, "@(x, y, z) 1e-3 .* y + 2e4 .* z"); + +%!assert (vectorize ("2**x^5"), "2.**x.^5") +## Note that ** is transformed to ^ by the code that prints the parse +## tree. I don't care too much about that... +%!test +%! fh = @(x) 2**x^5; +%! finfo = functions (vectorize (fh)); +%! assert (finfo.function, "@(x) 2 .^ x .^ 5"); + +## Test input validation +%!error vectorize () +%!error vectorize (1, 2) +%!error <FUN must be a string or anonymous function handle> vectorize (1) +