我能够回答您的第一个问题:
通过对 who_user 函数本身的轻微修改:
function nams = who_user1()
//get user variables
[nams,mem]=who('get'); //get all variables
p=predef(); //number of system variable
st=stacksize()
nams=nams(1:$-p+1);mem=mem(1:$-p+1);
//modifiable system variables
excluded=['demolist','scicos_pal','%scicos_menu',..
'%scicos_short','%helps','%helps_modules','MSDOS','who_user','%scicos_display_mode', ...
'%scicos_help'];
ke=grep(nams,excluded)
nams(ke)=[];mem(ke)=[];
n=size(nams,1);
if n==0 then return,end
//format names on n*10 characters
ll=length(nams)+2;m=int((ll-1)/10)+1;
for k=1:max(m)
ks=find(m==k);
if ks<>[] then nams(ks)=part(nams(ks),1:(k*10));end
end
endfunction
这个函数应该给你你想要的列表(我已经把名字修改为 who_user1)。
您可以使用 isglobal() 函数确定特定变量是否为全局变量,但您需要将变量传递给 isglobal(),而不是作为变量名称的字符串。我上面列出的函数返回一个字符串向量。
您可以尝试的另一种方法是重写上述函数以使用 varargout 直接返回变量(而不是它们的名称),然后测试它们是否是全局变量。