Вопрос не касается динамического обновления значения, как в Dynamic.
Объясню в сравнении.
В нижеприведённом коде функция будет определена как линейная, переменная x в аргуренте будет связана с x в d.
Код:
d = x + 2;
f[x_] = d;
DownValues[f]
Если же этот фокус проделать внутри
Module[{x}, ...], переменная в аргументе не будет совпадать с переменной внутри d.
Я не до конца понимаю, почему WM так себя ведёт.
Как достичь того же динамического связывания?
Обрисую задачу:
работаю символьно с выражениями, в некоторый момент формирую функцию. Этот участок кода хочу представить в виде функции, которая определённым внутренним параметрам сопоставляет это функцию. При этом я хочу замкнуть как можно больше символов, чтобы не произошло конфликта имён. Так, если вдруг x будет определена в каком-то другом месте программы, символьные вычисления (в d) произойдут неправильно и получится неправильная функция.
Вот код, чтобы понять контекст задачи
Код:
h[e_] := Module[{d, f},
d = x + e;
f[x_?NumericQ] = d;
f
];
(* с этого места переменные x и e никак не связаны с одноимёнными внутри h *)
x = 1;
e := x + 1;
DownValues[Evaluate[h[e]]]
(* Будет: HoldPattern[f$709[x$_?NumericQ]] :> 3 *)
(* Должно быть: HoldPattern[f$709[x$_?NumericQ]] :> x$ + 2 *)