您可能會發現有用的一些其他信息。試想一下:
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
Eventhough的功能應該有它得到持續= 1,因此,當其他人注意到的第一個元素上返回,返回被打破。這不會被修復,因爲有太多的代碼依賴於這種行爲。現在
,您可以使用:
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」 - >函數[Null]這是一個函數!這點考慮一下吧。你可以喔,留言!
所以像這樣的工作。
cfquietfail =
Compile[{{x, _Real, 1}}, Exp[x],
"RuntimeOptions" -> {"WarningMessages" -> False,
"RuntimeErrorHandler" ->
Function[Message[MyFunctionName::"I can complain here!"];
Throw[$Failed]]}];
Catch[ cfquietfail[{1000.}]]
我希望這是有用的。
+1這正是我也看過的,看看返回的是什麼。 –