给定一个文件名,如何在MATLAB中以编程方式区分脚本和函数?
如果我尝试将参数传递给脚本,我会得到Attempt to execute SCRIPT somescript as a function:
。有没有办法在不试图执行它的情况下检测到它?
更新正如@craq指出的那样,在发布此问题后不久,有一篇关于MATLAB Central的文章:http://blogs.mathworks.com/loren/2013/08/26/what-kind-of-matlab-file-is-this/
答案 0 :(得分:9)
找不到干净的解决方案,但您可以使用try-catch
(正如@Ilya建议的那样)和nargin
编辑 - 使用function
来避免某些命名冲突;使用exist
进一步对输入进行分类(例如MEX文件)
function is_script = is_a_script( varargin )
% is_a_script( varargin ) returns one of the following:
% 1: if the input is a script
% 0: if the input is a function
% -1: if the input is neither a function nor a script.
is_script = 0;
switch( exist(varargin{1}) )
case 2
% If the input is not a MEX or DLL or MDL or build-in or P-file or variable or class or folder,
% then exist() returns 2
try
nargin(varargin{1});
catch err
% If nargin throws an error and the error message does not match the specific one for script, then the input is neither script nor function.
if( strcmp( err.message, sprintf('%s is a script.',varargin{1}) ) )
is_script = 1;
else
is_script = -1;
end
end
case {3, 4, 5, 6} % MEX or DLL-file, MDL-file, Built-in, P-file
% I am not familiar with DLL-file/MDL-file/P-file. I assume they are all considered as functions.
is_script = 0;
otherwise % Variable, Folder, Class, or other cases
is_script = -1;
end
答案 1 :(得分:3)
如果您愿意使用半文档功能,可以尝试以下方法:
function tf = isfunction(fName)
t = mtree(fName, '-file');
tf = strcmp(t.root.kind, 'FUNCTION');
end
这与MATLAB Cody和Contests中用于衡量代码长度的函数相同。
答案 2 :(得分:2)
这有点像黑客,但是......如果参数是函数,这里的函数将返回true
,如果不是,则返回false
。有可能存在不起作用的例外情况 - 我期待发表评论。
编辑 - 捕捉函数在mex文件中的情况......
function b = isFunction(fName)
% tries to determine whether the entity called 'fName'
% is a function or a script
% by looking at the file, and seeing if the first line starts with
% the key word "function"
try
w = which(fName);
% test for mex file:
mx = regexp(w, [mexext '$']);
if numel(mx)>0, b = true; return; end
% the correct thing to do... as shown by YYC
% if nargin(fName) >=0, b = true; return; end
% my original alternative:
fid = fopen(w,'r'); % open read only
while(~feof(fid))
l = fgetl(fid);
% strip everything after comment
f = strtok(l, '%');
g = strtok(f, ' ');
if strcmpi(g, 'function'), b=true; break; end
if strlen(g)>0, b=false; break; end
end
fclose(fid);
catch
fprintf(1, '%s not found!\n');
b = false;
end