EVALIN cannot execute a return?
Afficher commentaires plus anciens
I am trying to create a function that aborts whatever mfile is currently executing after issuing a warning. I see no way of avoiding EVALIN for this and so implemented the following,
function abort_and_warn
warning 'Aborting'
evalin('caller', 'return');
end
However, a simple test of this code in R2020a,
function test
disp 'do this'
abort_and_warn
disp 'do that'
end
fails to block the execution of the final line:
>> test
do this
Warning: Aborting
> In test>abort_and_warn (line 12)
In test (line 5)
do that
Is this an undocumented limitation of EVALIN? I see nothing here to imply that EVALIN should be unable to issue the return command in the caller wokspace.
4 commentaires
Bruno Luong
le 7 Août 2020
Modifié(e) : Bruno Luong
le 7 Août 2020
To me it is clear that return cannot be carried out. In order return to carry out, all the pending caliing should be terminated, but the calling function (the one that has EVALIN) is till executing. So no, it's not possible logically, unless the (implicit) RETURN of the CALLING function can somehow go back in time and occurs BEFORE that of the caller. Yes, there seems to be some theoretical about wormhole pretending that can happen and it is possible to go back in time, but no one has yet observed that. ;-)
Caller
|
+-----> Calling
|
+------> Evalin('caller','return') => stuck because Calling is being executing
Fangjun Jiang
le 7 Août 2020
Modifié(e) : Bruno Luong
le 7 Août 2020
"return forces MATLAB® to return control to the invoking program before it reaches the end of the script or function"
Who is in control when "return" is executed in this case? I think it is "abort_and_warn". evalin() just gives a different set of workspace. It does not give up control.
Bruno Luong
le 7 Août 2020
A simple EVAL('RETURN') is not execute either
function foo
eval('return');
fprintf('this will be printed out\n');
end
>> foo
this will be printed out
>>
Matt J
le 7 Août 2020
Réponse acceptée
Plus de réponses (1)
Fangjun Jiang
le 7 Août 2020
0 votes
It seems that "return" was not executed in the "caller" workspace as it is supposed to by evalin().
But would a "regular" approach work by passing some kind of flag or value?
In function abort_and_warn, return with a flag or a special value after issuing the warning.
In function test, check the return value of function abort_and_warn, then execute return.
Catégories
En savoir plus sur Performance and Memory dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!