2013-01-21 9 views

risposta

6

+1 per una domanda molto interessante.

Posso pensare a un modo per determinarlo. Analizzare il file m eseguito da solo e controllare la prima parola nella prima riga non banale non di commento. Se è la parola chiave function, è un file di funzione. Se non lo è, è una sceneggiatura. Ecco un accurato one-liner:

strcmp(textread([mfilename '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function') 

Il valore risultante dovrebbe essere 1 se si tratta di un file di funzione e 0 se si tratta di uno script.

Ricordare che questo codice deve essere eseguito dal m-file in questione, e non da un file di funzione separato, ovviamente. Se si vuole fare una funzione generica da quella (cioè uno che mette alla prova ogni m-file), basta passare la stringa nome del file desiderato per textread, in questo modo:

function y = isfunction(x) 
    y = strcmp(textread([x '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function') 

Per rendere questa funzione più robusto , è anche possibile aggiungere un codice di gestione degli errori che verifica che il file m esista effettivamente prima di tentare di eseguire lo textread.

+1

Perfetto, grazie! – slayton

7

C'è un altro modo. nargin(...) dà un errore se è chiamato su uno script. La seguente funzione breve dovrebbe quindi fare quello che stai chiedendo:

function result = isFunction(functionHandle) 
% 
% functionHandle: Can be a handle or string. 
% result:   Returns true or false. 

% Try nargin() to determine if handle is a script: 
try  
    nargin(functionHandle); 
    result = true; 
catch exception 
    % If exception is as below, it is a script. 
    if (strcmp(exception.identifier, 'MATLAB:nargin:isScript'))  
     result = false; 
    else 
     % Else re-throw error: 
     throw(exception); 
    end 
end 

Potrebbe non essere il modo più carino, ma funziona.

Saluti

+0

Questo è fantastico, grazie! – slayton

Problemi correlati