Вы можете сделать это:
Function[Null, # = f /@ #, HoldAll][{a, b, c}]
Например,
In[1]:=
{a,b,c}={1,2,3};
Function[Null, #=f/@#,HoldAll][{a,b,c}];
{a,b,c}
Out[3]= {f[1],f[2],f[3]}
Или вы можете сделать то же самое без жесткого кодирования f
, но с определением пользовательской функции set
. Эффект вашего цикла foreach можно легко воспроизвести, если вы зададите ему атрибут Listable:
ClearAll[set];
SetAttributes[set, {HoldFirst, Listable}]
set[var_, f_] := var = f[var];
Пример:
In[10]:= {a,b,c}={1,2,3};
set[{a,b,c},f1];
{a,b,c}
Out[12]= {f1[1],f1[2],f1[3]}
Вы также можете получить преимущества в скорости для случаев, когда ваш f
является Listable, что особенно актуально сейчас, поскольку M8 Compile позволяет пользовательским функциям получать выгоду от того, чтобы быть Listabe с точки зрения скорости, способом, который раньше встроенные функции могли. Все, что вам нужно сделать для set
для таких случаев (когда вы набираете скорость и знаете, что f
является Listable), это удалить атрибут Listable set
.