Alguna información adicional que pueda resultarte útil. Considere esto:
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
Apesar de la función debería haber vuelto en el primer elemento que tiene que durar = 1, por lo tanto, como otros han señalado, vuelta se rompe. Esto no será solucionado ya que hay demasiado código que depende de este comportamiento.
Ahora, su puede usar:
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
que se comporta como se esperaba. Desafortunadamente, sin embargo,
In[33]:= c1 = Compile[{{v, _Integer, 1}},
Module[{},
Do[If[v[[i]] < 0, Return[v[[i]], Module]], {i, 1, Length[v]}];
]
];
no se compilará.
Aquí hay una manera de hacer que funcione.
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
Compruebe la salida.
In[139]:= CompilePrint[c1]
más notas: "RuntimeErrorHandler" -> Función [Null] Esta es una función! Piense en eso por un segundo. Puedes Thow, ¡Mensaje cualquier cosa!
Así que algo como esto funciona.
cfquietfail =
Compile[{{x, _Real, 1}}, Exp[x],
"RuntimeOptions" -> {"WarningMessages" -> False,
"RuntimeErrorHandler" ->
Function[Message[MyFunctionName::"I can complain here!"];
Throw[$Failed]]}];
Catch[ cfquietfail[{1000.}]]
Espero que esto sea útil.
+1 Esto es exactamente lo que también miré para ver qué se devuelve. –