Некоторая дополнительная информация, которую вы можете найти полезной.Учтите это:
In[26]:= f1 =
Function[v, Do[If[v[[i]] < 0, Return[v[[i]]]], {i, 1, Length[v]}];
last = 1;];
In[27]:= last
Out[27]= last
In[28]:= f1[{-1, 2, 3}]
In[29]:= last
Out[29]= 1
Несмотря на то, что функция должна была вернуться к первому элементу, который она получила до last = 1, следовательно, как уже отмечали другие, Return не работает.Это не будет исправлено, так как от этого поведения зависит слишком много кода.
Теперь вы можете использовать:
In[30]:= f2 = Function[v, Module[{},
Do[If[v[[i]] < 0, Return[v[[i]], Module]], {i, 1, Length[v]}];
last2 = 1;]];
In[31]:= f2[{-1, 2, 3}]
Out[31]= -1
In[32]:= last2
Out[32]= last2
, который ведет себя как ожидалось.К сожалению, однако,
In[33]:= c1 = Compile[{{v, _Integer, 1}},
Module[{},
Do[If[v[[i]] < 0, Return[v[[i]], Module]], {i, 1, Length[v]}];
]
];
не скомпилируется.
Вот способ заставить это работать.
In[137]:= c1=Compile[{{v,_Integer,1}},
Module[{res=1},
Do[If[v[[i]]<0,res=v[[i]];Break[]],{i,1,Length[v]}];
If[res==1,Internal`CompileError[]];
res
]
,"RuntimeOptions"->{"RuntimeErrorHandler"->Function[Null]}]
In[140]:= c1[{1,2,3,1}]
In[141]:= c1[{1,2,3,-1}]
Out[141]= -1
Проверьте вывод.
In[139]:= CompilePrint[c1]
Некоторые дополнительные примечания: «RuntimeErrorHandler» -> Function [Null] это функция!Подумайте об этом на секунду.Вы можете Отослать что угодно!
Так что-то вроде этого работает.
cfquietfail =
Compile[{{x, _Real, 1}}, Exp[x],
"RuntimeOptions" -> {"WarningMessages" -> False,
"RuntimeErrorHandler" ->
Function[Message[MyFunctionName::"I can complain here!"];
Throw[$Failed]]}];
Catch[ cfquietfail[{1000.}]]
Надеюсь, это полезно.