# HG changeset patch # User Mike Miller # Date 1391888373 18000 # Node ID 2bd78ab75b230e1cc319871f2cbddcfb42408120 # Parent 0cbd0d285541663251d257954cf0032ca3d27217 which: Properly identify workspace variables (bug #37320) * which.m: Check whether each name is a variable, for compatibility with Matlab and consistency with exist(). Add %!tests for new behavior. diff -r 0cbd0d285541 -r 2bd78ab75b23 scripts/help/which.m --- a/scripts/help/which.m Wed Feb 12 21:40:19 2014 +0100 +++ b/scripts/help/which.m Sat Feb 08 14:39:33 2014 -0500 @@ -28,9 +28,21 @@ if (nargin > 0 && iscellstr (varargin)) m = __which__ (varargin{:}); + ## Check whether each name is a variable, variables take precedence over + ## functions in name resolution. + for i = 1:nargin + m(i).is_variable = evalin ("caller", + ["exist (\"" m(i).name "\", \"var\")"], false); + if (m(i).is_variable) + m(i).file = "variable"; + endif + endfor + if (nargout == 0) for i = 1:nargin - if (isempty (m(i).file)) + if (m(i).is_variable) + printf ("'%s' is a variable\n", m(i).name); + elseif (isempty (m(i).file)) if (! isempty (m(i).type)) printf ("'%s' is a %s\n", m(i).name, m(i).type); @@ -64,3 +76,17 @@ %!assert (which ("_NO_SUCH_NAME_"), "") +%!test +%! x = 3; +%! str = which ("x"); +%! assert (str, "variable"); + +%!test +%! str = which ("amd"); +%! assert (str(end-6:end), "amd.oct"); +%! amd = 12; +%! str = which ("amd"); +%! assert (str, "variable"); +%! clear amd; +%! str = which ("amd"); +%! assert (str(end-6:end), "amd.oct");