2013-02-01 7 views
5

Lubię używać cell mode zamiast łamać punkty podczas pisania/debugowania funkcji.Jak ustalić, czy kod jest wykonywany jako funkcja lub przy użyciu trybu komórki?

Jak określić w czasie wykonywania, czy aktualnie wykonywany kod jest wykonywany jako funkcja, czy w trybie komórkowym?

Bonus Points Jeśli można wymyślić function że wie, że została wywołana z innej funkcji lub z komórki.

Przykładem tego, kiedy może być przydatny, jest sytuacja, w której chcesz inaczej załadować dane podczas wykonywania funkcji lub jeśli chcesz utworzyć plotery do debugowania. Staje się trudnością komentowanie określonych linii podczas przełączania między wykonywaniem jako komórką lub funkcją.

function doSomethingAwesome(inputs) 
%% 

if executingAsCell == true 
    clear 
    importData 
end 


% process stuff 

if executingAsCell == true 
    plot(myAwesomeResults) 
end 

Uwaga, to nie jest kopią mojego poprzedniego pytania:How to determine if code is executing as a script or function?

+0

+1 Interesujące pytanie. Pierwsza myśl (brzydki hack): jak zdefiniować zmienną dummy jako pierwszą czynność wykonywaną w funkcji/skrypcie, a następnie sprawdzić, czy jest zdefiniowana? – user1884905

+3

Możesz być w stanie to zrobić z [dbstack] (http://www.mathworks.nl/help/matlab/ref/dbstack.html), nie jestem pewien. – Junuxx

Odpowiedz

2

Najprostszym podejściem jest użycie dbstack() jak sugeruje @Junuxx:

if isempty(dbstack) 
    %# true if you evaluated the cell while not in debug mode 

Podobnie funkcja może wiedzieć, czy został wywołany z innej funkcji lub z bazy/komórki, sprawdzając długość pliku dbstack

function doSomething 
    if length(dbstack)==1 
     %# the function has been invoked from a cell or the command line 
     %# (unless you're in debug mode) 

Funkcja może rzeczywiście odróżnić, czy została ona wywołana z wiersza polecenia lub z komórki, ponieważ ten ostatni nie pisać do historii:

function doSomething 

    if length(dbstack)==1 
     javaHistory=com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory; 
     lastCommand = javaHistory(end).toCharArray'; % ' added for SO code highlighting 
     if strfind(lastCommand,'doSomething') 
     %# Probably invoked via command line 
     else 
     %# Probably invoked via executing a cell 

Jeśli chcesz określić, czy jesteś w trybie debugowania lub nie, jedną z możliwości jest użycie argumentu line z dbstack i sprawdzenie, czy istnieje wywołanie aktualnie wykonywanej funkcji na linii pozornej funkcji wywołującej.

+0

@Slayton: Dzięki za edycję. Ponieważ używam usercripta dostarczonego przez Amro (zobacz tag wiki), nie mam już problemów z podświetlaniem kodu – Jonas

Powiązane problemy