Do / Return ведут себя по-разному в Compile - почему?

Мне интересно, является ли это ошибкой или задокументированным поведением?

f1 = Function[v, 
  Do[If[v[[i]] < 0, Return[v[[i]]]], {i, 1, Length[v]}]]

c1 = Compile[{{v, _Integer, 1}}, 
  Do[If[v[[i]] < 0, Return[v[[i]]]], {i, 1, Length[v]}]]

При применении их к списку, не содержащему отрицательных значений) чисел, мы получаем разные результаты:

In[66]:= Through[{f1, c1}[{1, 2, 3}]]

Out[66]= {Null, 3}

Это вызвало ошибку, когда я пытался скомпилировать короткую функцию (фактически ее модифицированную версию).

Использование одного только не показывает проблемы:

c2 = Compile[{}, Do[i, {i, 5}]]

c2[] (* returns nothing, as expected *)

8
задан Community 23 May 2017 в 11:57
поделиться