Как указывалось в недавней публикации , область действия не работает должным образом внутри модуля.
Пример из этой темы:
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*2 z*)
Но следующее работает почти так, как ожидалось.
Module[{expr},
expr = 2 z;
Set@@{f[z_], expr};
f[7]]
(*14*)
На каком языке дизайн учитывал Вольфрам, выбирая эту функциональность?
Edit: см. Первый комментарий Jefromi. Я изменил z с локальной переменной на not и забыл изменить вывод. Это не влияет на проблему.
Edit2:
Похоже, Майкл Пилат считает, что Блок и Модуль имеют разные функции. Я думаю, что понимаю его точку зрения, но я думаю, что это ортогонально моему вопросу. Итак, вот обновление.
Я могу использовать следующий код на глобальном уровне в записной книжке:
expr = 2 z;
f[z_] = expr;
f[7]
(*output: 14*)
Но когда я помещаю один и тот же блок кода в модуль и делаю expr локальным, это приводит к другому выводу.
Clear[f];
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*output: 2z*)
Если вы проследите приведенный выше вызов модуля, вы обнаружите, что Set [f [z_], expr] переписан в Set [f [z $ _, expr]. Теперь это преобразование z-> z $ происходит как по lhs, так и по rhs множества. Однако это происходит до того, как expr будет оценен, что приведет к тому, что на глобальном уровне будет получен другой результат.
Преобразование z-> z $, по-видимому, происходит только тогда, когда у rhs есть локальный для вызова модуля символ.
Почему Mathematica выбирает изменение синтаксиса при вызове модуля? Какие языковые / конструктивные компромиссы существуют здесь, которые приняли это решение.