Предполагая, что ваш второй пример должен дать u
, это должно сделать работу:
ClearAll[arg];
SetAttributes[arg, HoldFirst];
arg[g_, n_] := Module[
{tmp, ret},
Unprotect[Part];
tmp = Attributes[Part];
SetAttributes[Part, HoldFirst];
ret = Part[g, n];
ClearAttributes[Part, HoldFirst];
SetAttributes[Part, tmp];
Protect[Part];
ret
]
так что
f[a_, b_] = a^2 + b^2.;
arg[f[s, t], 1]
дает s
.
Хотя это очень жестко, поэтому я ожидаю, что кто-то скоро найдет что-то лучшее.
Это немного лучше (не переопределяет встроенные функции даже временно):
ClearAll[arg2];
SetAttributes[arg2, HoldFirst];
arg2[g_, n_] := Hold[g][[1, n]]